2010-02-17 30 views
19

Tôi biết rằng đối với JBoss, bạn cần tệp [name] -ds.xml trong thư mục con/deploy của cá thể thích hợp. Tôi không có bất kỳ kinh nghiệm nào với các thùng chứa Java EE khác, nhưng tôi đang cố gắng tuân thủ các tiêu chuẩn càng nhiều càng tốt. có cách nào tiêu chuẩn để xác định nguồn dữ liệu JDBC và triển khai không? nếu có thể, tôi muốn bao gồm nguồn dữ liệu của mình bên trong tệp * .ear (ví dụ: nguồn dữ liệu HSQLDB được nhúng trong bộ nhớ cho mục đích demo)?có cách nào tiêu chuẩn để xác định nguồn dữ liệu JDBC cho các thùng chứa Java EE không?

nếu không có cách nào theo tiêu chuẩn, các thùng chứa khác có chấp nhận cách jboss ít nhất không? (/deploy/*-ds.xml)

Trả lời

21

Có cách nào tiêu chuẩn để xác định nguồn dữ liệu JDBC và triển khai không?

Có, có. Nó được thực hiện thông qua phần tử <data-source>, mà bạn có thể đặt trong web.xml, ejb-jar.xmlapplication.xml. Nếu bạn không thích XML, bạn cũng có thể sử dụng một chú thích cho thay này: @DataSourceDefinition

Ví dụ về một mục web.xml

<data-source> 
    <name>java:app/myDS</name> 
    <class-name>org.postgresql.xa.PGXADataSource</class-name> 
    <server-name>pg.myserver.com</server-name> 
    <database-name>my_db</database-name> 
    <user>foo</user> 
    <password>bla</password> 
    <transactional>true</transactional> 
    <isolation-level>TRANSACTION_READ_COMMITTED</isolation-level> 
    <initial-pool-size>2</initial-pool-size> 
    <max-pool-size>10</max-pool-size> 
    <min-pool-size>5</min-pool-size> 
    <max-statements>0</max-statements> 
</data-source> 

Đọc thêm:

p.s. Tôi ngạc nhiên tất cả các câu trả lời khác nói rằng điều này không tồn tại, trong khi nó rõ ràng không, ngay cả tại thời điểm câu hỏi này ban đầu được hỏi.

+0

Câu hỏi đặt ra là về cấu hình dành riêng cho vùng chứa, tôi tin? Giống như http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/Connectors_on_JBoss-Configuring_JDBC_DataSources.html Điều này không tương đương với điều đó nếu tôi hiểu đúng câu hỏi. Nhưng yeah bạn đang phải đây là câu trả lời đúng cho 90% trường hợp - đó là một vài tháng tuổi tại thời điểm này đã được yêu cầu và tôi chắc chắn không biết về nó! –

+1

@SeanOwen> 'Câu hỏi đặt ra là về cấu hình dành riêng cho vùng chứa, tôi tin '- tôi nghĩ Op đã hỏi một cách tiêu chuẩn cho một thứ có thể được thực hiện thông qua cấu hình dành riêng cho vùng chứa. Tôi đồng ý rằng vào thời điểm đó cơ chế này chỉ mới vài tháng tuổi, và các nhà cung cấp khác nhau đã không thực sự gây ra nhiều tiếng ồn về nó. –

+0

yup, OP chắc chắn đang tìm kiếm một cái gì đó như thế này :-) cảm ơn bạn rất nhiều Arjan. nó có nghĩa là tôi cần phải đi với triển khai phát nổ để làm cho cấu hình dễ dàng truy cập vào các tập lệnh/công cụ, nhưng nó là một tùy chọn rất hợp lệ. nếu bạn nhìn vào ngày mặc dù, tôi đã nhìn vào ~ 2010 vì vậy j2ee6 wasnt thực sự là một lựa chọn. – radai

0

triết lý Java EE của Sun xác định một số vai trò trong thiết kế, phát triển và triển khai ứng dụng doanh nghiệp. Thiết kế Java EE chứa đựng và phản ánh những mối quan tâm này.

Cụ thể, Sun muốn tách nhà phát triển khỏi quản trị viên của một ứng dụng, đó là một ý tưởng hay. Nhà phát triển viết các thành phần của doanh nghiệp theo cách không thể chứa đựng được. Trong web.xml, ví dụ, bạn tuyên bố DataSource của bạn trong một cách tiêu chuẩn:

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

này nói "điều này cơ sở dữ liệu các nhu cầu ứng dụng, làm cho nó có sẵn cho tôi, bất cứ cơ sở dữ liệu là gì và bất cứ điều gì bạn đang chứa chạy nó trong, thông qua JNDI tiêu chuẩn tại 'jdbc/myDB' ". Điều này là nhiều như các nhà phát triển có thể làm - phần còn lại nhất thiết phải là container cụ thể và do đó không chuẩn hóa.

Và sau đó cách "myDB" được định cấu hình thực sự là có vai trò khác, quản trị viên của vùng chứa.

Vì vậy, tôi lặp lại câu trả lời đúng ở trên: không. Nhưng lý do là, nếu không, bạn sẽ mã hóa ứng dụng của mình thành một loại cơ sở dữ liệu cụ thể trên một máy chủ và cổng cụ thể và điều quan trọng là bạn không thể thực hiện điều đó, vì vậy không có hỗ trợ chuẩn cho mục đích.

+0

trong khi bạn thích hợp cho trường hợp chung, trong trường hợp của tôi, tôi có kế hoạch sử dụng DB trong, bộ nhớ trong, có điều gì đó tôi hy vọng có thể được thực hiện theo kiểu di động – radai

+1

> đó là ý tưởng hay - đó là ý tưởng hay cho một số trường hợp sử dụng, nhưng không phải cho tất cả các trường hợp sử dụng. Java EE 6 bắt đầu cung cấp các lựa chọn thay thế (ví dụ: bạn có thể xác định nguồn dữ liệu từ bên trong ứng dụng của mình) và Java EE 7 đã tiếp tục xu hướng này (những thứ như đích JMS và phiên thư có thể được xác định từ ứng dụng). –

+1

> bạn không thể làm điều đó - Thông số kỹ thuật không được ủy quyền cho cách làm việc một và chỉ một. Lời giải thích này hoàn toàn không tính đến sự tồn tại của cơ sở dữ liệu cục bộ, riêng tư (có thể trong bộ nhớ) VÀ nó không quy mô xuống các ứng dụng đơn giản nhất. Giao diện và các mô-đun riêng biệt cho logic nghiệp vụ có thể là phương pháp hay nhất đối với một số trường hợp sử dụng, nhưng việc thực thi nó khiến EJB cảm thấy nặng ký. Từ Java EE 6 trở đi, sự lựa chọn là tùy thuộc vào nhà phát triển (Giao diện và một mô-đun EJB riêng biệt là tùy chọn bây giờ). –

5

Có cách nào tiêu chuẩn để xác định nguồn dữ liệu JDBC và triển khai không?

Không, đây là vùng chứa cụ thể. Là Application Component Provider, bạn phải ghi lại tài nguyên mình cần và Application deployer and Administrator sẽ định cấu hình chúng.

Nếu không có cách nào theo tiêu chuẩn, các thùng chứa khác có chấp nhận cách JBoss ít nhất không?

Không, vì đây là cách JBoss và do đó JBoss cụ thể.

  • Với Tomcat, bạn sẽ phải sử dụng tệp context.xml.
  • Với Cầu cảng, jetty-env.xml.
  • Với WebSphere, bạn có thể tạo một cái gọi là WebSphere Enhanced EAR.
  • Với WebLogic, bạn có thể đóng gói JDBC Module trong ứng dụng của mình.
  • Với GlassFish, bạn có thể sử dụng lệnh asadmin add-resources my.xml để thêm nguồn dữ liệu được mô tả trong tệp XML (ví dụ here).
  • Vv, v.v.

Lưu ý rằng có một số dự án đang cố gắng đạt được mục tiêu này theo cách phổ quát như jndi-resources hoặc Cargo. Ngoài ra còn có các giải pháp phức tạp hơn như ControlTier hoặc Chef.

Bây giờ, trong trường hợp của bạn (như tôi đã hiểu bạn muốn sử dụng cơ sở dữ liệu được nhúng kèm theo ứng dụng của bạn), tôi không nghĩ bạn nên định cấu hình nguồn dữ liệu ở cấp máy chủ ứng dụng. Bạn chỉ cần đóng gói jar của cơ sở dữ liệu trong ứng dụng của bạn với một nhóm kết nối độc lập như c3p0 hoặc DBCP.

+1

> đây là vùng chứa cụ thể. - Không, nó không nhất thiết là thùng chứa cụ thể. Có một cách tiêu chuẩn cũng như sử dụng phần tử '' trong ví dụ: web.xml (xem câu trả lời của tôi bên dưới). –

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