2013-04-25 59 views
8

Tôi đã tạo nguồn dữ liệu JNDI bằng bảng điều khiển weblogic nhưng tôi không thể truy cập đối tượng từ ứng dụng web của mình. Dưới đây là các chi tiếtCách truy cập nguồn dữ liệu JNDI được xác định trong weblogic 10.3.6

Trong WebLogic 10.3.6, tôi đã đưa tên JNDI cho nguồn dữ liệu như: jdbc/mydb

Để có được kết nối DB từ ứng dụng web của tôi, tôi đã viết mã này trong ứng dụng web của tôi:

Context initContext = new InitialContext(); 
DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/mydb"); 
jndiConnection = ds.getConnection(); 

Trước đó tôi đã sử dụng Tomcat như máy chủ và tôi đã có thể để có được kết nối DB khi tôi cấu hình các chi tiết tài nguyên trong file tomcat/conf/server.xml, nhưng khi tôi đang sử dụng bắt đầu sử dụng máy chủ WebLogic tôi nhận được dưới đây lỗi:

Cannot establish DB connection to JNDI:java:/comp/env/jdbc/mydb While trying to look up /comp/env/jdbc/mydb in /app/webapp/sample.war/1811641702. caused by: javax.naming.NameNotFoundException: While trying to look up /comp/env/jdbc/mydb in /app/webapp/sample.war/1811641702.; remaining name '/comp/env/jdbc/mydb' 

Tôi đã thử các tùy chọn được đề cập trong liên kết này: How to lookup JNDI resources on WebLogic? nhưng tôi vẫn đang gặp sự cố.

Vui lòng cho tôi biết nơi tôi đang làm sai, quy trình truy cập đối tượng JNDI là gì.

+1

có phải bạn muốn đặt tên cho nó là "jdbc/mydb" thay vì "java/mydb"? –

+0

@better_use_mkstemp vâng, tôi đã cập nhật câu hỏi của mình, Cảm ơn bạn đã trỏ nó. – chaitanya

+2

Bạn cũng đã thử giải pháp thứ hai trong liên kết trong câu hỏi của mình chưa? Câu trả lời đầu tiên áp dụng cho Tomcat nhưng tôi không chắc chắn rằng nó luôn hoạt động trong weblogic. Xóa java: comp/env/và thử initContext.lookup ("jdbc/mydb")? –

Trả lời

9

Sau khi tham khảo bài đăng: Tomcat vs Weblogic JNDI Lookup Tôi đã sửa đổi mã của mình.

Sử dụng dưới mã trong chương trình java của tôi về ứng dụng web đã giải quyết vấn đề của tôi:

Context initContext = new InitialContext(); 
DataSource ds = (DataSource)initContext.lookup("jdbc/mydb"); 
jndiConnection = ds.getConnection(); 

Cũng trong WebLogic console Tôi đã thêm đối tượng JNDI tôi để quản lý máy chủ của tôi (dưới tùy chọn máy chủ), nơi ứng dụng web của tôi là đã triển khai.

+1

Vì vậy, bạn đã làm chính xác những gì tôi đã nói với bạn để làm trong bình luận của tôi và nó đã làm việc ... derp. Cố lên nào anh bạn! –

+1

@better_use_mkstemp: Hãy suy nghĩ bạn nên tóm tắt nhận xét của bạn trong câu trả lời. – wmorrison365

+0

Tôi đã có cùng một vấn đề mà các nguồn tài nguyên JNDI đã không được tìm thấy, mặc dù tôi tạo ra nó trước. Điều quan trọng là gán tài nguyên cho một máy chủ cụ thể. – Spindizzy

2

Đã thử câu trả lời của bạn trong weblogic 12c nhưng không hoạt động ..!

Khi tôi thử bằng cách chỉ sử dụng tên của nguồn dữ liệu myDB (đã xóa jdbc/), nó hoạt động tốt.

Context initContext = new InitialContext(); 
DataSource ds = (DataSource)initContext.lookup("myDB"); 
jndiConnection = ds.getConnection(); 
+0

Tên JNDI mà tôi đã tạo chính nó có giá trị là "jdbc/mydb", vì vậy tôi không thể loại bỏ điều đó. – chaitanya

2

Các giải pháp tương tự cho WebLogic 12c sẽ

thêm phụ thuộc dưới đây để pom.xml của bạn .. tạo một biến với giá trị trung gian nhà hiện tại của $ {oracleMiddlewareHome}, sau đó ...

<dependency> 
     <groupId>weblogic</groupId> 
     <artifactId>webservices</artifactId> 
     <version>12.1.3</version> 
     <scope>system</scope> 
     <systemPath> 
      ${oracleMiddlewareHome}/wlserver/server/lib/weblogic.jar 
     </systemPath> 
    </dependency> 

Bây giờ sử dụng mã dưới đây:

Hashtable<String, String> h = new Hashtable<String, String>(7); 
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); 
h.put(Context.PROVIDER_URL, "t3://localhost:7001");//add ur url 
h.put(Context.SECURITY_PRINCIPAL, "weblogic");//add username 
h.put(Context.SECURITY_CREDENTIALS, "welcome1");//add password 

    Bundle bundle; 
    try { 
     InitialContext ctx = new InitialContext(h); 
     DataSource dataSource = ((DataSource) ctx.lookup("jdbc/ContextBindingDS")); 
     bundle = (Bundle) ctx.lookup(BUNDLE_JNDI_NAME); 


    } catch (NamingException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    }