我有一个Spring应用程序,我想动态更改数据源。当输入DS URL时,Spring Bean和所有依赖项将自动更新。我知道这有些奇怪,但是无论如何我都想实现。我的Spring配置如下:
<bean id="majorDataSource" class="org.postgresql.ds.PGSimpleDataSource">
<property name="serverName" value="${jdbc.serverName}" />
<property name="portNumber" value="${jdbc.portNumber}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="databaseName" value="${jdbc.databaseName}" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="majorDataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="majorDataSource"/>
<property name="configLocation" value="classpath:sqlmap-config.xml"/>
</bean>
问题是:
JDBC URL存储在属性中,可以在运行时更改它。
更改URL后,我需要重新创建数据源,可能还需要重新创建相关对象。我不知道Spring如何优雅地做呢?
我知道Spring确实可以基于一个键动态路由数据源,但是数据源URL是在Spring中预定义的,不会更改运行时。这不是我的情况。
你可以通过扩展spring 并覆盖应该返回引用要使用的数据源spring bean的键的方法来使用spring的AbstractRoutingDataSourcedetermineCurrentLookupKey()
。
基本上要回答你的问题,你需要做的是在XML配置中将两个数据源定义为不同的spring bean。无需动态创建一个,spring会同时加载两者,并根据determineCurrentLookupKey()
方法中的条件动态使用一个或另一个。
这将导致类似:
XML配置
<!-- first data source -->
<bean id="majorDataSource" class="org.postgresql.ds.PGSimpleDataSource">
<property name="serverName" value="${jdbc.major.serverName}" />
<property name="portNumber" value="${jdbc.major.portNumber}" />
<property name="user" value="${jdbc.major.username}" />
<property name="password" value="${jdbc.major.password}" />
<property name="databaseName" value="${jdbc.major.databaseName}" />
</bean>
<!-- second data source -->
<bean id="minorDataSource" class="org.postgresql.ds.PGSimpleDataSource">
<property name="serverName" value="${jdbc.minor.serverName}" />
<property name="portNumber" value="${jdbc.minor.portNumber}" />
<property name="user" value="${jdbc.minor.username}" />
<property name="password" value="${jdbc.minor.password}" />
<property name="databaseName" value="${jdbc.minor.databaseName}" />
</bean>
<!-- facade data source -->
<bean id="dataSource" class="blog.datasource.CustomerRoutingDataSource">
<property name="targetDataSources">
<map>
<entry key="MINOR" value-ref="minorDataSource"/>
<entry key="MAJOR" value-ref="majorDataSource"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="majorDataSource"/>
</bean>
<!-- wiring up -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:sqlmap-config.xml"/>
</bean>
java
public class MyRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// get the current url
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
if (request.getRequestURL().toString().endsWith("/minor"))
return "MINOR";
else
return "MAJOR";
}
}
我有一个Spring应用程序,我想动态更改数据源,即。当输入DS URL时,Spring bean和所有依赖项将自动更新。我知道这有点奇怪,但无论如何我想实现这一点。我的Spring配置如下: 问题是: > 一旦URL被更改,我需要重新创建数据源,可能还有依赖对象。我不知道如何在Spring优雅地做这件事? 我知道Spring可以基于一个键动态路由数据源,但数据源URL是在Spring中预定义的,
我正在尝试对我的应用程序做类似的事情。我正在使用以下版本的Spring boot和Cassandra: Spring数据卡桑德拉-2.0。8.释放Spring护套启动器父级-2.0。4.RELEASE我需要动态更改Cassandra的一些属性(主要是主机名),并希望它与应用程序建立新的连接。对于配置更改,我们有内部云配置更改管理,它在更改时运行良好,并侦听更改。这是我的班级: 但是,当我尝试将@R
我想在Spring MyBatis项目中动态更改数据源属性。 问题是在Spring MyBatis集成中,我们无法在运行时动态设置数据源属性。 目前我正在使用以下代码来设置凭据: 我尝试使用UserCredentialsDataSourceAdapter选项在运行时更改密码,但我无法将用于连接的数据源对象作为MyBatis返回 我被困在这里了,我不能使用数据源元素ds来连接MyBatis。请帮我解
全部的 我是骆驼的开胃菜。我有一些问题。这里有一个场景。 文件正文中有2个字段。(seq, date, OR no.)所以,我为这个数据格式生成了pojo类。 我申请了骆驼队。几天后,关于添加名称字段,dataformat发生了更改。 所以,我们需要修改pojo类并再次重建应用程序。但我们不想再次构建应用程序并为dataformat生成pojo类。 如果我们可以在运行时使用xsd动态生成Pojo类
问题内容: 我正在从数据库中成功获取数据值。我也将它们存储到一个数组中。我需要将String数组作为项的加载,以响应执行的关键操作。每当获取按键值时,如何获取按键值,就如何重新加载项目。相反,我需要动态刷新项目。 问题答案:
现在,我有一个简单的Spring Boot应用程序,它为静态图像提供服务,我将这些图像放在了resources/static/img中。这对于显示实际内容来说很好,但我想解决两件事: > 我不希望这些图像中的任何一个与生成的文件捆绑在一起,我知道将这些图像放在文件夹中会做到这一点。 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到文件夹并重新启动。相反,我希望Spring提供特定