我想在Java SE應用程序中使用JNDI配置數據源。做這個的最好方式是什麼?超出容器JNDI數據源
到目前爲止,我遇到2個項目:
- Apache Naming。項目頁面具有配置數據源的特定示例,但看起來項目已超舊且不再處於活動狀態。
- JBossNS。看起來使用
LocalOnlyContextFactory
配置僅限本地的JNDI很容易,但我還沒有找到關於如何實際配置數據源的任何文檔。
如果可能,我想用JTA事務管理器(使用JOTM?)配置數據源。
我想在Java SE應用程序中使用JNDI配置數據源。做這個的最好方式是什麼?超出容器JNDI數據源
到目前爲止,我遇到2個項目:
LocalOnlyContextFactory
配置僅限本地的JNDI很容易,但我還沒有找到關於如何實際配置數據源的任何文檔。如果可能,我想用JTA事務管理器(使用JOTM?)配置數據源。
你爲什麼使用JNDI?這並不是說如果你有一個提供者,這是一個糟糕的解決方案,但是還有替代方法,例如依賴注入(IoC:通過Spring或Guice)。
Spring JDBC數據訪問被描述爲here。偉大的事情是,你可以使用Spring的DataSource
注入代碼:
<bean class="com.my.Persister">
<property name="dataSource" ref="dataSource" />
</bean>
數據源可以用一個JNDI查找定義:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" />
在測試環境中,你可以直接注入數據源:
<bean id="dataSource" class="apache.db.PoolingDataSource">
<!-- config goes here -->
</bean>
這些引用是很老,但可能有助於利用jnpserver(JBoss命名服務提供商):
單機JNDI一個非常容易使用的解決方案是simple-jndi。只要你只需要一個JVM就可以工作,因爲它是一個沒有網絡服務器的庫。
由klenkes74引用的Simple-JNDI版本不再處於活動開發之中。因爲我遇到了一些問題,我分叉它,做了一些錯誤修復並實現了一些新功能。我已經使用舊版本不僅用於測試,而且還用於生產,因爲我更喜歡服務定位器模式而不是依賴注入模式,儘管後者現在比較流行。
您可以輕鬆使用Simple-JNDI以聲明方式定義DataSource或連接池並將其綁定到JNDI上下文。
定義jndi。屬性文件在classpath:
java.naming.factory.initial=org.osjava.sj.SimpleContextFactory
org.osjava.sj.root=[absolute_or_relative_path_to_a_property_file]
屬性文件看起來像:
type=javax.sql.DataSource
driver=org.gjt.mm.mysql.Driver
url=jdbc:mysql://localhost/testdb
user=testuser
password=testing
現在你可以從你的代碼中使用這種方法訪問您的數據源:
InitialContext ctxt = new InitialContext();
DataSource ds = (DataSource) ctxt.lookup("name_of_your_datasource");
欲瞭解更多信息,請參閱https://github.com/h-thurow/Simple-JNDI
我應該在帖子中提到這一點。我正在編寫一個將在Web應用程序中運行的組件,但我希望能夠從簡單的Java SE命令行應用程序和JUnit測試中調用它。 我最初的想法是我應該能夠設置必要的環境(JNDI,DBCP,JTA),以便組件代碼始終可以依賴這些環境。 我不願意在應用程序中引入像Spring這樣的全新框架,但這可能是一個選項。是否有與此有關的特定的Spring文檔頁面,你會推薦? – nikita 2009-10-23 20:56:35
我編輯了答案以提供鏈接和某些指示。 Spring JDBC非常強大 – 2009-10-23 21:16:55
感謝您的詳細信息。我沒有足夠的觀點將答案標記爲有用:| – nikita 2009-10-27 14:11:27