【发布时间】:2011-03-03 15:43:25
【问题描述】:
我想测试一些新功能,它是内部网络应用程序的一部分。此新代码使用通常由应用服务器 (tomcat) 提供的数据库连接。
我不想在本地机器上重新创建整个网络应用程序来测试新代码,因为我只需要运行一个函数。
有谁知道我如何“欺骗”上下文或数据源来检索数据库配置,而无需在服务器上实际创建 Web 应用实例?
【问题讨论】:
标签: java datasource jndi
我想测试一些新功能,它是内部网络应用程序的一部分。此新代码使用通常由应用服务器 (tomcat) 提供的数据库连接。
我不想在本地机器上重新创建整个网络应用程序来测试新代码,因为我只需要运行一个函数。
有谁知道我如何“欺骗”上下文或数据源来检索数据库配置,而无需在服务器上实际创建 Web 应用实例?
【问题讨论】:
标签: java datasource jndi
使用 TomcatJNDI,您可以访问您在 Tomcat 中配置的每个 JNDI 资源,就像在您的 Web 应用程序中所做的那样。实现它的代码很简单,看起来像
TomcatJNDI tomcatJNDI = new TomcatJNDI();
tomcatJNDI.processContextXml(contextXmlFile);
tomcatJNDI.start();
DataSource ds = (DataSource) InitialContext.doLookup("java:comp/env/path/to/datasource")
【讨论】:
这里列出的解决方案看起来比我大约一年前提出的解决方案要简单一些,当时我不得不做同样的事情。我基本上做了我自己的非常简单的 DataSource 实现并将它添加到一个新的 Initial Context。
http://penguindreams.org/blog/running-beans-that-use-application-server-datasources-locally/
【讨论】:
在 Spring SimpleNamingContextBuilder 和 Apache BasicDataSource 的帮助下,您可以执行以下操作(我通常在需要 JNDI 的测试类中的静态块中使用它):
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(db_driver_name);
dataSource.setUrl(db_connection_url);
dataSource.setUsername(db_username);
dataSource.setPassword(db_password);
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind(jndi_name, dataSource);
builder.activate();
jndi_name 的值可能如下所示:java:comp/env/jdbc/my-db
设置完成后,通常通过 JNDI 查找数据库连接的代码应该可以工作。例如,上面的代码将与此 Spring 配置一起使用:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/my-db"/>
</bean>
【讨论】:
JndiObjectFactoryBean 怎么知道在 Spring 目录中查找 my-db?您不必提供上下文环境吗?特别是,在这种环境下,您会将属性java.naming.factory.initial 设置为什么值?