小弟刚开始学习spring方面的内容,遇到一个问题,我在一个项目中涉及到很多的数据库,想在spring中配置多个数据源如何操作呢。我的配置文件是这样的 在我的application.properties 有jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8
jdbc.url1=jdbc:mysql://localhost/test1?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
每当一个多一个数据库 我就在这个配置文件添加一个jdbc.url 命名为jdbc.url加一个数字名
在applicationContent.xml中<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" /> <!-- Connection Pooling Info -->
<property name="initialSize" value="5" />
<property name="maxActive" value="100" />
<property name="maxIdle" value="30" />
<property name="maxWait" value="1000" />
<property name="poolPreparedStatements" value="false" />
<property name="defaultAutoCommit" value="false" />
</bean>这样设置。
这里<property name="url" value="${jdbc.url}" /> property name="url" 如何根据程序传递一个datasource标识去动态的获取url的value值呢。如何设置默认的动态url连接呢。请赐教!
jdbc.url=jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8
jdbc.url1=jdbc:mysql://localhost/test1?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
每当一个多一个数据库 我就在这个配置文件添加一个jdbc.url 命名为jdbc.url加一个数字名
在applicationContent.xml中<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" /> <!-- Connection Pooling Info -->
<property name="initialSize" value="5" />
<property name="maxActive" value="100" />
<property name="maxIdle" value="30" />
<property name="maxWait" value="1000" />
<property name="poolPreparedStatements" value="false" />
<property name="defaultAutoCommit" value="false" />
</bean>这样设置。
这里<property name="url" value="${jdbc.url}" /> property name="url" 如何根据程序传递一个datasource标识去动态的获取url的value值呢。如何设置默认的动态url连接呢。请赐教!
这样并没有什么好处,可以写一个 .properties,动态配置数据库。但是,为什么要用多个数据库来做?而不是一个数据库,多张表,这不是添麻烦嘛
context.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.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<jee:jndi-lookup id="mysqlds" jndi-name="java:comp/env/jdbc/mysqlds" />
<jee:jndi-lookup id="orads" jndi-name="java:comp/env/jdbc/orads" />
<bean id="dataSource" class="util.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="0" value-ref="mysqlds" />
<entry key="1" value-ref="orads" />
</map>
</property>
<property name="defaultTargetDataSource" ref="orads" />
</bean>
</beans>
package util;public class DbContextHolder {
private static final ThreadLocal contextHolder = new ThreadLocal(); public static void setDbType(String dbType) {
contextHolder.set(dbType);
} public static String getDbType() {
return (String) contextHolder.get();
} public static void clearDbType() {
contextHolder.remove();
}
}
package util;import java.sql.SQLException;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource {
//static Logger log = Logger.getLogger("DynamicDataSource");
@Override
protected Object determineCurrentLookupKey() {
// TODO
return DbContextHolder.getDbType();
} @Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
} @Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
测试程序:DbContextHolder.setDbType("1");
UserDomain od = this.testService.queryUserAccount("admin");
System.out.println("username=="+od.getName());
DbContextHolder.setDbType("0");
d = this.testService.queryUserAccount("admin");
你的
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" /> <!-- Connection Pooling Info -->
<property name="initialSize" value="5" />
<property name="maxActive" value="100" />
<property name="maxIdle" value="30" />
<property name="maxWait" value="1000" />
<property name="poolPreparedStatements" value="false" />
<property name="defaultAutoCommit" value="false" />
</bean>
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" /> <!-- Connection Pooling Info -->
<property name="initialSize" value="5" />
<property name="maxActive" value="100" />
<property name="maxIdle" value="30" />
<property name="maxWait" value="1000" />
<property name="poolPreparedStatements" value="false" />
<property name="defaultAutoCommit" value="false" />
</bean><bean id="dataSource" class="util.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="0" value-ref="dataSource1" />
<entry key="1" value-ref="dataSource2" />
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1" />
</bean>
</beans>
不就行啦
然后在一个action里 有一个删除的方法我这样定义public String delete() throws Exception {
try {
DbContextHolder dh = new DbContextHolder();
dh.setDbType("1");
securityManager.deleteTestUser(id);
} catch (ServiceException e) {
}
return null;
}
setDbType("1");使用第二个datasource。但是这个方法调用的还是第一个datasource连接的数据库啊
看看这个个blog
看过这个博客写的内容,我觉得这个配置文件写的重复的内容太多。没定义datasource 就多写一些sessionFactoryGPS和transactionManagerGPS,我想定义一个datasource类似于接口的东西。去公共调用
DEBUG [main] - Converting String to [class [Ljava.lang.Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'friendou.fdidnews' doesn't exist
### The error may exist in friendou/ibatis3/mapping/FRIENDOU__FDIDNEWS_SqlMap.xml
### The error may involve friendou.ibatis3.dao.FdidnewsDAO.getinfofdidandshareid-Inline
### The error occurred while setting parameters
### SQL: select * from FRIENDOU.FDIDNEWS where FDID = ? and `INDEX`= ?
### Cause: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'friendou.fdidnews' doesn't exist