2009-10-23 66 views
15

我想在Java SE應用程序中使用JNDI配置數據源。做這個的最好方式是什麼?超出容器JNDI數據源

到目前爲止,我遇到2個項目:

  1. Apache Naming。項目頁面具有配置數據源的特定示例,但看起來項目已超舊且不再處於活動狀態。
  2. JBossNS。看起來使用LocalOnlyContextFactory配置僅限本地的JNDI很容易,但我還沒有找到關於如何實際配置數據源的任何文檔。

如果可能,我想用JTA事務管理器(使用JOTM?)配置數據源。

回答

10

你爲什麼使用JNDI?這並不是說如果你有一個提供者,這是一個糟糕的解決方案,但是還有替代方法,例如依賴注入(IoC:通過SpringGuice)。

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> 
+0

我應該在帖子中提到這一點。我正在編寫一個將在Web應用程序中運行的組件,但我希望能夠從簡單的Java SE命令行應用程序和JUnit測試中調用它。 我最初的想法是我應該能夠設置必要的環境(JNDI,DBCP,JTA),以便組件代碼始終可以依賴這些環境。 我不願意在應用程序中引入像Spring這樣的全新框架,但這可能是一個選項。是否有與此有關的特定的Spring文檔頁面,你會推薦? – nikita 2009-10-23 20:56:35

+0

我編輯了答案以提供鏈接和某些指示。 Spring JDBC非常強大 – 2009-10-23 21:16:55

+0

感謝您的詳細信息。我沒有足夠的觀點將答案標記爲有用:| – nikita 2009-10-27 14:11:27

3

單機JNDI一個非常容易使用的解決方案是simple-jndi。只要你只需要一個JVM就可以工作,因爲它是一個沒有網絡服務器的庫。

1

由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