我正在开发一个应用程序,我需要根据具体情况指定不同的数据源。我想在测试应用程序时使用一个数据库,一个用于生产。通过属性的文件或环境变量指定驱动程序类和登录详细信息。目前我必须更改细节然后重新启动应用程序。有没有办法动态更改这些属性而无需重新启动应用程序?。
答案 0 :(得分:2)
你可以使用resource tag + Spring's system property place holder这样......
<import resource="/resources/myDataSourceBeans-${runtime.environment}.xml"/>
您需要做的就是使用正确的数据源bean将/resources/myDataSourceBeans-prod.xml
和/resources/myDataSourceBeans-test.xml
放入项目的类路径中,并定义一个名为runtime.environment
的系统属性,并将其设置为{{1} }或test
。
检查我的来源后,我发现this blog entry也可能对您有所帮助。
[更新]我刚刚意识到您要求运行时更改。我的答案只适用于环境分离,这通常很好,因为你不应该从非生产系统中获取生产数据源。
答案 1 :(得分:2)
使用JNDI数据源。
从Spring in Action中提到:
Spring应用程序通常会部署在JEE应用程序服务器(如WebSphere,JBoss)或甚至像Tomcat这样的Web容器中运行。这些服务器允许您配置要通过JNDI检索的数据源。以这种方式配置数据源的好处是可以完全外部管理它们 到应用程序,让应用程序在准备好访问数据库时简单地询问数据源。此外,应用程序服务器中管理的数据源通常用于提高性能,并且可以由系统管理员进行热交换。
示例applicationContext-dataSource.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<!-- D A T A S O U R C E S -->
<jee:jndi-lookup id="dataSource"
jndi-name="jdbc/myDatasource"
resource-ref="true" />
</beans>
希望这有帮助。
答案 2 :(得分:1)
如果您真的不想在运行时更改(由于测试/生产切换的原因,这种情况非常罕见),您可以使用DelegatingDataSource将目标更改为一个或另一个,而无需修改所有依赖bean。 / p>