如何使用spring指定可以动态更改的数据源

时间:2012-05-27 21:25:44

标签: java spring spring-mvc jdbc

我正在开发一个应用程序,我需要根据具体情况指定不同的数据源。我想在测试应用程序时使用一个数据库,一个用于生产。通过属性的文件或环境变量指定驱动程序类和登录详细信息。目前我必须更改细节然后重新启动应用程序。有没有办法动态更改这些属性而无需重新启动应用程序?。

3 个答案:

答案 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>