2012-04-29 38 views
7

khi tôi chạy như sau:tại sao javax.naming.NamingException xảy ra ở đây?

package NonServletFiles; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import javax.sql.DataSource; 
import javax.naming.*; 

public class GetTagsFromDatabase { 

public GetTagsFromDatabase() { 

} 

public String[] getTags() { 

    String tags[] = null; 
    try { 
     Context context = new InitialContext(); 
     DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/photog"); // <<----- line 23 
     Connection connection = ds.getConnection(); 
     String sqlQuery = "select NAMEOFTHETAG from tagcollection"; 
     PreparedStatement statement = connection.prepareStatement(sqlQuery); 
     ResultSet set = statement.executeQuery(); 

     int i = 0; 
     while(set.next()) { 
      tags[i] = set.getString("NameOfTheTag"); 
      System.out.println(tags[i]); 
      i++; 
     } 
    }catch(Exception exc) { 
     exc.printStackTrace(); 
    } 

    return tags; 
} 

public static void main(String args[]) { 
    new GetTagsFromDatabase().getTags(); // <<----- line 43 
} 
} 

tôi nhận được ngoại lệ sau:

javax.naming.NamingException: Lookup failed for 'java:comp/env/jdbc/photog' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ] 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
at javax.naming.InitialContext.lookup(InitialContext.java:411) 
at NonServletFiles.GetTagsFromDatabase.getTags(GetTagsFromDatabase.java:23) 
at NonServletFiles.GetTagsFromDatabase.main(GetTagsFromDatabase.java:43) 

Caused by: javax.naming.NamingException: Invocation exception: Got null ComponentInvocation 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.getComponentId(GlassfishNamingManagerImpl.java:873) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:742) 
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:172) 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) 
... 4 more 

Tôi không biết lý do ngoại lệ này, tất cả các servlets khác mà cần phải kết nối với cơ sở dữ liệu với url java:comp/env/jdbc/photog hoạt động tốt.

+0

Bạn có thể đăng mã của một servlet mà kết nối này hoạt động không? –

+0

@Amit Bhargava tại sao bạn cần điều đó? –

+0

Vâng, tôi đã hy vọng tìm thấy một số khác biệt giữa hai điều đó sẽ giải thích tại sao nó không hoạt động trong trường hợp này. –

Trả lời

12

Ngăn xếp ngăn xếp gợi ý rằng bạn đang sử dụng Glassfish. Xóa phần java:comp/env/. Đó là gốc ngữ cảnh JNDI mặc định. Chỉ trong Tomcat bạn cần phải xác định rõ ràng. Ngoài ra, bạn nên gọi điều này trong ngữ cảnh webapp, không phải là một ứng dụng Java đơn giản với main().


Không liên quan cho vấn đề cụ thể, bạn có thực sự cần phải nhận được DataSourcemọi? Tôi muốn tạo ra một lớp helper mà chỉ lấy nó một lần khi khởi động webapp hoặc trong một trình khởi tạo tĩnh. Đó là ứng dụng rộng và threadsafe. Chỉ có Connection thực sự cần phải có được (và đóng cửa! Bạn không đóng nó, vì vậy bạn đang bị rò rỉ tài nguyên DB) mỗi khi bạn cần phải kích hoạt một truy vấn SQL.

+2

Tại sao Tomcat lại cần phần java: comp/env'? Tôi đã tìm ra nó một cách khó khăn. – asgs

+1

@ chó: Không có ý tưởng. Tomcat guys quyết định nó như vậy. Tomcat không phải là một thùng chứa Java EE chính thức. – BalusC

+0

BalusC OK, cảm ơn mẹo trên 'DataSource'. – asgs

Các vấn đề liên quan