2012-08-06 46 views
5

Tôi đang cố gắng làm một cái gì đó có vẻ đơn giản: thiết lập một nhóm nhỏ các kết nối cơ sở dữ liệu để một servlet (chỉ một) không tạo máy chủ của tôi ở 1 kết nối mỗi giây.jetty mysql kết nối cơ sở dữ liệu pooling

Trên Ubuntu 10.04, với bản nâng cấp/cập nhật mới nhất, tôi đang sử dụng Eclipse Jetty 8.1.5.v20120716. Tôi đang cố kết nối với máy chủ MySQL 5.1.

servlet tôi được gọi là gcm, vì vậy trong ${jetty}/contexts, tôi có gcm.xml tập tin này:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> 
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <New id="jdbc/myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/myds</Arg> 
    <Arg> 
     <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
     <Set name="Url">jdbc:mysql://localhost:3306/chat</Set> 
     <Set name="User">root</Set> 
     <Set name="Password">sillyness</Set> 
     </New> 
    </Arg> 
    </New> 
    <Set name="contextPath">/</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/gcm</Set> 
    <Set name="extractWAR">true</Set> 
</Configure> 

Khi tôi bắt đầu Jetty với java -jar start.jar -port=8080, mọi thứ bắt đầu tốt đẹp cho đến khi tôi cố gắng để đạt cơ sở dữ liệu từ servlet của tôi. Phần xử lý quy tắc ứng yêu cầu trông như thế này:

public static List<String> getDevices() 
    throws javax.naming.NamingException, java.sql.SQLException { 
    synchronized (regIds) { 
     InitialContext ctx = new InitialContext(); 
     DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/myds"); 
     Connection conn = null; 
     Statement stmt = null; 

     try { 
      conn = ds.getConnection(); 

      stmt = conn.createStatement(); 
      ResultSet rs = stmt.executeQuery("select * from chatdevice"); 

     //blah,blah,blah... 

Các lỗi tôi nhận được là:

javax.naming.NameNotFoundException; remaining name 'jdbc/myds' 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:500) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:531) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:531) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:546) 
     at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:112) 
     at javax.naming.InitialContext.lookup(InitialContext.java:409) 
     at com.google.android.gcm.demo.server.Datastore.getDevices(Datastore.java:98) 

Làm thế nào để có được Jetty để tìm mã cơ sở dữ liệu?

Trả lời

0

Hãy thử này thêm vào web.xml

<resource-ref> 
    <res-ref-name>jdbc/myds</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 
+0

Xin chào Sumit, cảm ơn câu trả lời, nhưng nếu tôi đặt nó vào một tệp có tên 'web.xml', hoặc bất cứ nơi nào trong tệp gcm.xml của mình, tôi sẽ nói "Không thể đạt được mục tiêu của nút: đã bắt đầu" và " Loại cấu hình không xác định: resource-ref trong " –

+0

Tôi quên đề cập đến: nếu tôi nhấn servlet của mình tại thời điểm đó, tôi vẫn nhận được cùng lỗi NameNotFoundException. –

5

Trong trường hợp của tôi, tôi đã đi vào danh sách cầu cảng chỉ gửi thư (https://dev.eclipse.org/mailman/listinfo/jetty-users) để hỏi câu hỏi của tôi.

Một người rất thông minh (! Hi Jan) đã viết và đã trả lời như thế này:

Có nói chung là nhiều cách khác nhau để đạt được kết quả tương tự trong cầu cảng, do đó có thể là lý do tại sao bạn đã nhìn thấy nhiều cách khác nhau tài liệu. Nói chung có tùy chọn là một điều tốt

Trong trường hợp có bất kỳ sự nhầm lẫn, đây là trang dứt khoát: http://wiki.eclipse.org/Jetty/Feature/JNDI Nếu có điều gì đó mất tích, sau đó xin vui lòng cho chúng tôi biết để chúng tôi có thể cập nhật trang.

Trường hợp của bạn hơi khác thường khi bạn đang sử dụng các tính năng phong cách javaee nhưng không có tệp web.xml. Đây không phải là một cái gì đó Tôi đã gặp phải trước đây, nhưng nó có vẻ giống như một cái gì đó tôi nên thêm vào tài liệu.

Tôi muốn giới thiệu (cũng như trang trên) mà bạn đặt bất kỳ định nghĩa jndi thành một-INF WEB/file cầu cảng-env.xml và không bối cảnh file xml. Nếu bạn làm điều đó, thì bạn có thể thực hiện một cách hiệu quả yếu tố web.xml sẽ làm và liên kết nguồn dữ liệu của bạn vào không gian tên java: comp/env bằng cách xác định tài nguyên của bạn và ràng buộc nó vào java: comp/env (lưu ý này sẽ kHÔNG làm việc trong một tập tin xml bối cảnh , nó phải được cầu cảng-env.xml):

Vì vậy, làm như sau trong WEB-INF/cầu cảng-env.xml:

<New id="jdbc/myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/myds</Arg> 
    <Arg> 
    <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
     <Set name="Url">jdbc:mysql://localhost:3306/chat</Set> 
     <Set name="User">root</Set> 
     <Set name="Password">sillyness</Set> 
    </New> 
    </Arg> 
    <Call name="bindToENC"> 
    <Arg>jdbc/myds</Arg> 
    </Call> 
</New> 

Trong cuộc gọi đến bindToENC ràng buộc bất cứ điều gì tên mà bạn muốn tìm kiếm như hậu tố để java: comp/env. Ví dụ: nếu bạn muốn tra cứu java: comp/env/my/foo thì đối số bindToENC sẽ là "my/foo".

- Jan Bartel www.webtide.com - Tư vấn, dịch vụ và hỗ trợ của nhà phát triển từ Jetty & Các chuyên gia của CometD. _______________________________________________ cầu cảng người sử dụng danh sách gửi thư [email protected] https://dev.eclipse.org/mailman/listinfo/jetty-users

Bây giờ, đó không phải là khá đủ (Tôi là một newbie cầu cảng). WEB-INF được gọi là WEB-INF bên trong tệp war cho servlet của tôi ... vì vậy tôi đã trích xuất nội dung của tệp chiến tranh vào một thư mục và sau đó tôi có thể dễ dàng đặt tệp jetty-env.xml trong WEB -INF thư mục.

Đây là quan trọng quá:

OK, tôi cho rằng một chút kiến ​​thức cầu cảng ở đó, và nghĩ rằng bạn muốn biết rằng những gì tôi gửi chỉ là một đoạn mã từ những gì bạn cần phải có cho tệp jetty-env.xml hoàn chỉnh.

Các trang wiki cho các tập tin cầu cảng-env.xml là ở đây: http://wiki.eclipse.org/Jetty/Reference/jetty-env.xml

Vì vậy, quấn phần tử gốc như thể hiện trên trang đó xung quanh đoạn I đăng và bạn nên được tốt.

Hiện tại/đó/đã nhận kết nối cơ sở dữ liệu. Sau đó, tôi đã nhận được lỗi connection refused from 127.0.0.1 trong /var/log/auth.log.

Hóa ra là tôi đã chạy lệnh denyhost, và chắc chắn có ai đó đã đặt ALL: 127.0.0.1 trong đó ... nghĩa là kết nối với máy cục bộ của tôi đã bị từ chối.

Khi chi tiết đó đã được sửa, servlet cuối cùng cũng có thể tiếp cận MySQL trên máy chủ của tôi.

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