我想在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