我正在开发一个应用程序,我需要根据情况指定不同的数据源。我想在测试应用程序时使用一个数据库,而在生产中使用一个数据库。例如通过属性文件或环境变量指定驱动程序类和登录详细信息。目前我必须更改详细信息然后重新启动应用程序。有没有办法在不重新启动应用程序的情况下动态更改这些属性?
3 回答
使用 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>
希望这可以帮助。
您可以像这样使用资源标签+ Spring的系统属性占位符......
<import resource="/resources/myDataSourceBeans-${runtime.environment}.xml"/>
您需要做的就是使用正确的数据源 bean 将其放入项目的类路径中,并定义一个名为的系统属性/resources/myDataSourceBeans-prod.xml
并将其设置为等于or 。/resources/myDataSourceBeans-test.xml
runtime.environment
test
prod
在检查了我的来源后,我发现这个博客条目也可能对你有所帮助。
[更新] 我刚刚意识到您要求更改运行时。我的答案只适用于环境分离,这通常足够好,因为您不应该从非生产系统中访问生产数据源。
如果您真的不想在运行时更改(由于测试/生产切换的原因,这非常罕见),您可以使用DelegatingDataSource将目标更改为一个或另一个,而无需修改所有依赖的 bean。