2009-10-23 43 views
15

Tôi muốn định cấu hình DataSource bằng JNDI trong ứng dụng Java SE. Cách tốt nhất để làm việc này là gì?Hết nguồn dữ liệu JNDI chứa

Cho đến nay, tôi đã đi qua 2 dự án:

  1. Apache Naming. Trang dự án có một ví dụ cụ thể để định cấu hình nguồn dữ liệu, nhưng có vẻ như dự án là siêu cũ và không còn hoạt động nữa.
  2. JBossNS. Có vẻ như thật dễ dàng để định cấu hình JNDI cục bộ bằng cách sử dụng LocalOnlyContextFactory, nhưng tôi chưa tìm thấy bất kỳ tài liệu nào về cách thực sự định cấu hình nguồn dữ liệu.

Nếu có thể, tôi cũng muốn định cấu hình nguồn dữ liệu bằng trình quản lý giao dịch JTA (sử dụng JOTM?).

Trả lời

10

Tại sao bạn sử dụng JNDI cho điều này? Nó không phải là một giải pháp tồi nếu bạn có một nhà cung cấp nhưng có những lựa chọn thay thế như tiêm phụ thuộc (IoC: qua Spring hoặc Guice).

Truy cập dữ liệu Spring JDBC được mô tả here. Điều tuyệt vời là bạn có thể sử dụng Spring để tiêm một DataSource vào mã của bạn:

<bean class="com.my.Persister"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

các nguồn dữ liệu có thể được xác định bằng cách sử dụng JNDI-lookup:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" /> 

Trong một môi trường kiểm tra, bạn có thể bơm các nguồn dữ liệu trực tiếp:

<bean id="dataSource" class="apache.db.PoolingDataSource"> 
    <!-- config goes here --> 
</bean> 
+0

Tôi nên đề cập đến điều này trong bài đăng. Tôi đang viết một thành phần sẽ chạy trong một ứng dụng web, nhưng tôi cũng muốn có thể gọi nó từ các ứng dụng dòng lệnh Java SE đơn giản và các bài kiểm tra JUnit. Ý tưởng ban đầu của tôi là tôi sẽ có thể thiết lập môi trường cần thiết (JNDI, DBCP, JTA) để mã thành phần luôn có thể dựa vào chúng. Tôi không muốn giới thiệu một khuôn khổ hoàn toàn mới như Spring vào ứng dụng, nhưng đó có thể là một lựa chọn. Có các trang tài liệu Spring cụ thể liên quan đến điều này mà bạn muốn giới thiệu không? – nikita

+0

Tôi đã chỉnh sửa câu trả lời để cung cấp liên kết và một số chỉ dẫn về việc cần làm. Spring JDBC rất mạnh mẽ –

+0

Cảm ơn bạn đã biết chi tiết. Tôi không có đủ điểm để đánh dấu câu trả lời là hữu ích: | – nikita

3

Một rất dễ sử dụng giải pháp cho JNDI độc lập là simple-jndi. Nó hoạt động giống như một sự quyến rũ miễn là bạn chỉ cần nó trong một JVM duy nhất, vì nó là một thư viện không có máy chủ mạng.

1

Phiên bản Simple-JNDI, được tham chiếu bởi klenkes74, không được phát triển hoạt động nữa. Bởi vì tôi gặp phải một số vấn đề với nó, tôi đã chia nhỏ nó, đã sửa một số lỗi và triển khai một số tính năng mới. Tôi đã sử dụng phiên bản cũ không chỉ để thử nghiệm mà còn trong quá trình sản xuất vì tôi thích một mẫu Service Locator hơn Dependency Injection mặc dù phiên bản thứ hai là hợp thời trang hơn hiện nay.

Bạn có thể dễ dàng sử dụng Simple-JNDI để xác định một DataSource hoặc một nhóm kết nối được khai báo và làm cho nó bị ràng buộc với một bối cảnh JNDI.

Xác định jndi.thuộc tính tập tin trong classpath của bạn:

java.naming.factory.initial=org.osjava.sj.SimpleContextFactory 
org.osjava.sj.root=[absolute_or_relative_path_to_a_property_file] 

Các tập tin bất động sản trông giống như:

type=javax.sql.DataSource 
driver=org.gjt.mm.mysql.Driver 
url=jdbc:mysql://localhost/testdb 
user=testuser 
password=testing 

Bây giờ bạn có thể truy cập vào DataSource của bạn từ bên trong mã của bạn theo cách này:

InitialContext ctxt = new InitialContext(); 
    DataSource ds = (DataSource) ctxt.lookup("name_of_your_datasource"); 

Để biết thêm thông tin xem https://github.com/h-thurow/Simple-JNDI

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