2009-05-04 51 views
7

Tôi mới dùng jboss và tôi đã được yêu cầu kết hợp cơ chế gộp kết nối jboss với một ứng dụng web hiện có. Xem xét rằng một lớp cơ sở dữ liệu ứng dụng web được viết đúng nghĩa là tất cả các kết quả, câu lệnh và kết nối được đóng đúng khi không cần thiết, tất cả những thay đổi mã tôi sẽ phải thực hiện trong ứng dụng web của mình sau khi đã cấu hình đúng nguồn dữ liệu jboss.Hồ bơi kết nối cơ sở dữ liệu JBoss

Ai cũng có thể chỉ cho tôi hướng dẫn hoặc mẫu mã sử dụng nguồn dữ liệu jboss trong ứng dụng web.

+0

Cấu hình JBoss là một phần của thỏa thuận này, có khá vài mẫu và hướng dẫn có sẵn trực tuyến. Những gì tôi quan tâm là những thay đổi có thể được yêu cầu trong cơ sở mã. Ai đó có thể xin vui lòng chỉ cho tôi một mẫu hoặc hướng dẫn, nơi tôi có thể xem làm thế nào để chúng tôi lấy một kết nối từ JBoss darasource và làm thế nào nó nên được xử lý sau đó, tức là đóng hoặc miễn phí kết nối. Cảm ơn. –

Trả lời

8

Tất cả các hồ bơi trong JBoss đều được xử lý trong cấu hình DataSource. Here là HowTo. Ứng dụng web sẽ phải thực hiện tìm kiếm JNDI cho nguồn dữ liệu để có được kết nối cơ sở dữ liệu thay vì thực hiện một URL JDBC trực tiếp, và sau đó bạn sẽ có tổng hợp. Tuy nhiên,

Giao dịch là một câu chuyện khác.

EDIT: Đáp lại bình luận của bạn về làm thế nào điều này ảnh hưởng mã, đây là những gì nó trông giống như:

String jndiPath = "java:DataSourceJNDIName"; //The exact prefix here has a lot to do with clustering, etc., but if you are using one JBoss instance standalone, this works. 
Context ctx = new InitialContext(); 
DataSource ds = (DataSource) PortableRemoteObject.narrow(ctx.lookup(jndiPath), DataSource.class); 
Connection c = ds.getConnection(); 

Về mặt kỹ thuật các PortableRemoteObject.narrow là không cần thiết trong một JBoss (4.2.2 nào) cấu hình máy chủ đơn chắc chắn, nhưng nó là mã chuẩn J2EE phù hợp hơn, vì các máy chủ ứng dụng chung không phải trả về một đối tượng đúng kiểu chỉ để thực hiện một Context.lookup.

Ở trên không bao gồm các vấn đề về sử dụng tài nguyên và xử lý lỗi. Bạn phải đóng đối tượng Context đó khi bạn hoàn thành nó, và dĩ nhiên là kết nối cơ sở dữ liệu, mặc dù JBoss sẽ hét lên với bạn nếu bạn quên đóng kết nối cơ sở dữ liệu và giao dịch kết thúc và đóng nó lại cho bạn.

Dù sao, đối tượng kết nối đó có thể sử dụng được nhiều như DriverManager.getConnection (url);

1

Bạn không phải thay đổi bất kỳ thứ gì. Khi bạn chọn đúng loại nguồn dữ liệu (local-tx-datasource/xa-datasource), xử lý kết nối và TX được thực hiện cho bạn. Trong $ JBoss/docs/examples/jca, bạn sẽ tìm thấy các khuôn mẫu cho hầu như mọi cơ sở dữ liệu, mà bạn có thể sử dụng lại.

Nếu bạn đang sử dụng XA, bạn cần định cấu hình khôi phục Tx. Xem bài đăng này trên cách thực hiện: http://management-platform.blogspot.com/2008/11/transaction-recovery-in-jbossas.html (tốt, có thể không phải là cách thực hiện ở chế độ độc lập, nhưng kết hợp với mã nguồn Jopr).

9

đầu tiên tạo ra một tập tin xml theo tên xxx-ds.xml và đặt tập tin này trong server/default/deploy/xxx-ds.xml

<datasources> 
<local-tx-datasource> 
<jndi-name>/jdbc/Exp</jndi-name> 
<type-mapping>SQL</type-mapping> 
<connection-url>jdbc:microsoft:sqlserver://   </connection-url> 
<driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class> 
<user-name></user-name> 
<password></password> 
<min-pool-size>5</min-pool-size> 
<max-pool-size>1000</max-pool-size> 
</local-tx-datasource> 
</datasources> 

jboss-web.xml

<jboss-web> 
<!-- <security-domain flushOnSessionInvalidation="false"/>--> 
<!-- <context-root>/BSI</context-root>--> 
    <resource-ref> 
     <description>Database connection resource</description> 
     <res-ref-name>jdbc/Exp</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <jndi-name>java:/jdbc/Exp</jndi-name> 
     <res-auth>Container</res-auth> 
    </resource-ref> 
</jboss-web> 

web.xml

<resource-ref> 
    <description>Database connection resource</description> 
    <res-ref-name>jdbc/Exp</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

và bây giờ trong file .java bạn

javax.naming.Context ctx1 = new javax.naming.InitialContext(); 
javax.sql.DataSource ds = (javax.sql.DataSource) ctx1.lookup("java:comp/env/jdbc/Exp"); 
con = ds.getConnection(); 

***** hãy chắc chắn rằng tên ref tài nguyên nên giống nhau trong mọi nơi

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