2012-02-09 53 views
8

Tôi đang cố gắng thiết lập kết nối tổng hợp để mysql databe với tomcat. ứng dụng đơn giản của tôi được gọi là Projekt, trong Projekt.xml tôi trong Apache/conf/Catalina/localhost Tôi cóTomcat và kết nối JDBC pooling

<Context docBase="Projekt.war" path="/Projekt"> 
    <Resource name="jdbc/mysqldb" 
     auth="Container" 
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     type="javax.sql.DataSource" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/Music" 
     username="andrzej" 
     password="qazxsw" 
     maxActive="20" 
     maxIdle="30" 
     maxWait="5" 
    /> 
</Context> 

web.xml của ứng dụng của tôi

<servlet> 
    <servlet-name>HelloServlet</servlet-name> 
    <servlet-class>org.jtp.HelloServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>HelloServlet</servlet-name> 
    <url-pattern>/Hai</url-pattern> 
</servlet-mapping> 

<resource-ref>  
     <description>DB Connection</description>  
     <res-ref-name>jdbc/mysqldb</res-ref-name>  
     <res-type>javax.sql.DataSource</res-type>  
     <res-auth>Container</res-auth>  
</resource-ref> 

và trong thư mục Apache/lib tôi có

mysql-connector-java-5.1.18-bin.jar 

nhưng khi tôi thực thi mã này:

Context initContext = new InitialContext(); 
dataSource = (DataSource)initContext.lookup("java:comp/env/jdbc/mysqldb"); 
System.out.println(dataSource.getConnection().createStatement(). 
      execute("select * from Users")); 

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

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' 

Tôi bối rối bây giờ, ở một số nơi tôi đọc rằng nó có thể là do không đặt trình điều khiển trong tomcat/lib, nhưng tôi có nó và nó hoạt động, bởi vì khi tôi đã thử nghiệm lái xe với các kết nối thủ công mà nó hoạt động.

Đối với thiết lập của tôi, tôi đã cố gắng để làm theo http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

EDIT: Cuối cùng đã nhận nó làm việc, có vẻ như tôi đã có một số thẻ bối cảnh trái trong một trong các tập tin như vậy khi phân tích cú pháp ông overriden thuộc tính khác, vì vậy nó là tất cả lỗi của tôi ở cuối.

Trả lời

10

Hình như bạn đang thiếu Context envCtx = (Context) initCtx.lookup("java:comp/env");
JNDI tra cứu nên được thực hiện như thế này:

// Obtain our environment naming context 
Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env"); 

// Look up our data source 
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); 

// Allocate and use a connection from the pool 
Connection conn = ds.getConnection(); 

tài liệu từ http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html.

+0

Vẫn còn lỗi tương tự, trước đây tôi đã sử dụng cấu trúc này, nhưng ở đâu đó tôi tìm thấy cấu trúc tôi đã trích dẫn, dù sao cả hai đều trả lại lỗi giống nhau. – Andna

+0

Nghe như anh chàng này có cùng một vấn đề và đã đăng một giải pháp http://blogs.agilefaqs.com/2009/11/23/cannot-create-jdbc-driver-of-class-for-connect-url-null/ – drobson

+0

Vẫn không có gì, tôi có thể viết thư mục này, tôi thậm chí còn tạo ra contex.xml trong webapp của tôi, vẫn còn lỗi tương tự. – Andna

13

Để đạt được kết nối JDBC kết hợp với Tomcat, có một thay thế đối với tệp cấu hình XML. Tôi chưa bao giờ có thể nhận được các thẻ Bối cảnhtài nguyên-ref này để hoạt động. Ngoài ra, các thẻ đó quá mức cần thiết nếu bạn không thực sự cần các tính năng JNDI.

Cách khác là sử dụng mã số Java để định cấu hình Kết nối JDBC của Tomcat. Xem mã ví dụ trong phần Đồng bằng Ol 'Java của trang tài liệu Tomcat 7, The Tomcat JDBC Connection Pool.

Về cơ bản, bạn:

  1. Khởi tạo một đối tượng PoolProperties để lưu trữ các thiết lập của bạn (URL cơ sở dữ liệu, tên người dùng db, db mật khẩu, và như vậy).
  2. Khởi tạo đối tượng Tomcat DataSource trong khi chuyển đối tượng PoolProperties từ bướC# 1 ở trên.

Dễ dàng peasy.Như thế này ...

PoolProperties p = new PoolProperties(); 
p.setUrl(jdbc:postgresql://localhost:5432/" + "my_database_name"); 
p.setDriverClassName("org.postgresql.Driver"); 
p.setUsername("someUserName"); 
p.setPassword("somePassword"); 
… 
DataSource datasource = new org.apache.tomcat.jdbc.pool.DataSource(p); 
datasource.setPoolProperties(p); 

Để sử dụng nguồn dữ liệu ...

Connection conn = null; 
try { 
    conn = datasource.getConnection(); 
    … 

Thể hiện DataSource thể được lưu trữ:

  • Như một trường thành viên trên Servlet của bạn.
  • Là một Singleton như được đề cập trong các nhận xét của câu trả lời khác.
  • Là “thuộc tính” trên ServletContext sử dụng ánh xạ tích hợp String đến Object, như được mô tả trên an Answer of mine và như được thảo luận trong Câu hỏi How to get and set a global object in Java servlet context.
+0

Điều này thật tuyệt vời. Cảm ơn. –

+0

đây là những gì đang tìm kiếm hơn 3 ngày ....! :) thankz để chia sẻ ....! – Saedawke

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