2011-10-07 28 views
12

Có ý nghĩa hơn khi phải kết nối nhóm ở cấp JNDI hoặc ở cấp độ webapp? Ví dụ, tôi có thể tạo ra tại đơn giản javax.sql.DataSource thusly:Hồ bơi kết nối hoặc nguồn dữ liệu? Tôi nên đưa vào JNDI?

<Context antiJARLocking="true"> 
    <Resource name="jdbc/myDataSource" 
    auth="Container" 
    type="javax.sql.DataSource" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost/myDataSource" user="user" password="password" /> 
</Context> 

và sau đó cấu hình các hồ bơi trong mùa xuân thusly:

<bean id="myDataSource" class="com.mchange.v2.c3p0.DataSources" 
    factory-method="pooledDataSource"> 
    <constructor-arg> 
    <jee:jndi-lookup jndi-name="java:comp/env/jdbc/myDataSource" /> 
    </constructor-arg> 
</bean> 

Hoặc, tôi có thể cấu hình các hồ bơi trực tiếp trong JNDI bản thân:

<Resource name="jdbc/myDataSource" 
    auth="Container" 
    factory="org.apache.naming.factory.BeanFactory" 
    type="com.mchange.v2.c3p0.ComboPooledDataSource" 
    driverClassName="com.mysql.jdbc.Driver" 
    jdbcUrl="jdbc:mysql://localhost/myDataSource" 
    user="user" password="password" 
    minPoolSize="3" 
    maxPoolSize="15" 
    maxIdleTime="5000" 
    idleConnectionTestPeriod="300" 
    acquireIncrement="3" /> 

Rời mùa xuân này:

<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" /> 

Trong cả hai trường hợp, bean mùa xuân myDataSource sẽ là nguồn dữ liệu kết nối c3p0, nhưng cái nào tốt hơn? Tôi nghĩ rằng có hồ bơi trong JNDI làm cho ý nghĩa nhất, nhưng nhược điểm là bạn phải đẩy lib c3p0 của bạn để cấp container servlet mà có thể gây ra xung đột với servlet hiện tại nếu họ hiện đang sử dụng một phiên bản khác nhau. Tuy nhiên, đặt nó trong JNDI có nghĩa là các ứng dụng của bạn không phải lo lắng về việc gộp chung. Bạn nghĩ sao?

+0

Do nó theo cách bạn thích, nếu bạn có thể. Tốt nhất để có tất cả ở một nơi chắc chắn, nếu có thể. – EJP

Trả lời

23

Bạn không cần phải hồ bơi các nguồn dữ liệu, thu được từ JNDI, vì nó đã được gộp :)

Sự khác biệt duy nhất giữa có một container-manager hồ bơi v.s. hồ bơi ứng dụng là trong trường hợp đầu tiên bạn có khả năng theo dõi khối lượng công việc trên hồ bơi bằng cách sử dụng các giao diện chuẩn (ví dụ: bảng điều khiển JBoss). Sau đó, quản trị viên của máy chủ ứng dụng quản lý quyết định về việc tăng kích thước nhóm, nếu cần. Anh ta cũng có thể chuyển ứng dụng sang một máy chủ DB khác (ví dụ: di chuyển theo kế hoạch từ MySQL sang Oracle). Điểm bất lợi là bạn cần nhiều nỗ lực hơn để thiết lập nguồn dữ liệu thử nghiệm JNDI cho các bài kiểm tra đơn vị của bạn (xem here).

Và trong trường hợp thứ hai, có, bạn phải đóng gói DBCP hoặc c3p0 cộng với trình điều khiển JDBC cùng với ứng dụng của bạn. Trong trường hợp này, việc thu thập số liệu thống kê về tất cả các hồ bơi cho tất cả các ứng dụng đang chạy trong Tomcat là không dễ dàng. Ngoài ra, việc di chuyển sang trình điều khiển JDBC mới hơn (MySQL 4 đến MySQL 5) không thể được thực hiện cho tất cả các ứng dụng cùng một lúc. Và các thuộc tính kết nối được kết nối với ứng dụng của bạn, ngay cả khi bạn sử dụng tệp .property (vì vậy việc thay đổi cần phải hợp lại và triển khai lại dự án). Có lẽ bạn không cần tất cả những điều đó, vì bạn chỉ có ứng dụng, một DB và không có phí quản lý.

Nhiều chủ đề về chủ đề này:

+5

Ngoài ra còn có Tomcat JDBC Pool (http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html) cần được xem xét. – rit

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