2009-10-23 65 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