我想动态改变Spring+MyBatis项目中的Datasource属性。
问题出在 Spring + MyBatis 集成中,我们无法在运行时动态设置数据源属性。
目前我正在使用以下代码来设置凭据:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}" p:username="${jdbc.username}"
p:password="${jdbc.password}" />
我尝试使用 UserCredentialsDataSourceAdapter 的选项在运行时更改密码,但我无法返回数据源对象以作为 MyBatis 用于连接
ApplicationContext context = ApplicationContextUtils.getApplicationContext();
UserCredentialsDataSourceAdapter ds = (UserCredentialsDataSourceAdapter) context.getBean("dataSource");
ds.setCredentialsForCurrentThread("test", "test");
我卡在这里了,我不能使用数据源元素 ds
来为 MyBatis 建立连接。请帮我解决这个问题。
最佳答案
我想你使用 mybatis-spring .
您使用 UserCredentialsDataSourceAdapter
的方法无效,因为您使用的是连接池,因此连接在使用后不会关闭,但会返回到池中并在以后重新使用,即使您更改了用户名和密码也是如此。
要解决此问题,只需摆脱池:
<bean id="targetDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter">
<property name="targetDataSource" ref="targetDataSource"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
并在 SqlSessionFactoryBean 配置中使用后面的 bean:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
如果不使用mybatis-spring,直接使用mybatis那么问题就是让mybatis使用配置好的DataSource。这可以通过 registering 来完成JNDI 和 configure mybatis 中的数据源从 JNDI 获取数据源。
关于spring - 动态(运行时)更改 Spring Mybatis 中的数据源凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21639235/