Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用spring指定可以动态更改的数据源_Java_Spring_Spring Mvc_Jdbc - Fatal编程技术网

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

Java 如何使用spring指定可以动态更改的数据源,java,spring,spring-mvc,jdbc,Java,Spring,Spring Mvc,Jdbc,我正在开发一个应用程序,需要根据具体情况指定不同的数据源。我希望在测试应用程序时使用一个数据库,在生产时使用一个数据库。类似于通过属性文件或环境变量指定驱动程序类和登录详细信息。目前我必须更改详细信息,然后重新启动应用程序。有没有一种方法可以在不重新启动应用程序的情况下动态更改这些属性?您可以使用+like so <import resource="/resources/myDataSourceBeans-${runtime.environment}.xml"/> 您所需要做的就是

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

您可以使用+like so

<import resource="/resources/myDataSourceBeans-${runtime.environment}.xml"/>
您所需要做的就是将/resources/myDataSourceBeans-prod.xml和/resources/myDataSourceBeans-test.xml放入具有适当数据源bean的项目的类路径中,并定义一个名为runtime.environment的系统属性,并将其设置为test或prod

在查阅了我的资料后,我发现这也可能对你有所帮助

[更新]我刚刚意识到您请求了运行时更改。我的答案只适用于环境隔离,这通常已经足够好了,因为您不应该从非生产系统访问生产数据源。

您可以像这样使用+

<import resource="/resources/myDataSourceBeans-${runtime.environment}.xml"/>
您所需要做的就是将/resources/myDataSourceBeans-prod.xml和/resources/myDataSourceBeans-test.xml放入具有适当数据源bean的项目的类路径中,并定义一个名为runtime.environment的系统属性,并将其设置为test或prod

在查阅了我的资料后,我发现这也可能对你有所帮助


[更新]我刚刚意识到您请求了运行时更改。我的答案只适用于环境隔离,这通常已经足够好了,因为您不应该从非生产系统中访问生产数据源。

如果您真的不想在运行时进行更改,这在测试/生产切换中非常少见,您可以使用依赖bean。

如果您真的不愿意在运行时进行更改,这是由于测试/生产切换的原因而非常罕见的,那么您可以使用一个命令将目标更改为一个或另一个,而无需修改所有依赖bean。

使用JNDI数据源

参考《行动中的春天》:

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>
希望这有帮助。

使用JNDI数据源

参考《行动中的春天》:

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>

希望这有帮助。

这似乎没有帮助,因为给出的要求是能够在运行时切换数据源。除非所有直接或间接依赖于数据源的bean都是非单例的,或者使用了一些magic Spring注入的东西,否则这是行不通的。这似乎没有帮助,因为给出的要求是能够在运行时切换数据源。除非所有直接或间接依赖于数据源的bean都是非单例的,或者使用了一些神奇的Spring注入功能,否则这是行不通的。我在做一些研究,发现Spring中有一个新特性,允许您指定配置文件,例如。很像grails,例如生产、测试和开发概要文件。我在做一些研究,发现spring中有一个新特性,允许您指定概要文件。与grails非常相似,例如生产、测试和开发配置文件。您应该真正将测试和生产分离到单独的系统/环境中,而不是将其作为运行时切换。您应该真正将测试和生产分离到单独的系统/环境中,而不是将其作为运行时切换。