废话不多说,关键代码如下所示:
1. 代码: DbContextHolder
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class DbContextHolder {
//线程安全的ThreadLocal
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setDbType(String dbType) {
contextHolder.set(dbType);
}
public static String getDbType() {
return ((String)contextHolder.get());
}
public static void clearDbType() {
contextHolder.remove();
}
}
|
2. 代码 : DynamicDataSource
1
2
3
4
5
6
7
|
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
public Object determineCurrentLookupKey() {
return DbContextHolder.getDbType();
}
}
|
3.代码: spring.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<!-- 数据源属性配置文件 -->
<context:property-placeholder location= "classpath:ibatis.properties" />
<bean id= "jksh" class = "org.apache.commons.dbcp.BasicDataSource"
destroy-method= "close" >
<!-- Connection Info -->
<property name= "driverClassName" value= "${driver.jksh}" />
<property name= "url" value= "${url.jksh}" />
<property name= "username" value= "${username.jksh}" />
<property name= "password" value= "${password.jksh}" />
<!-- Connection Pooling Info -->
<property name= "maxIdle" value= "${maxIdle.jksh}" />
<property name= "maxActive" value= "${maxActive.jksh}" />
<property name= "defaultAutoCommit" value= "false" />
<property name= "timeBetweenEvictionRunsMillis"
value= "${timeBetweenEvictionRunsMillis.jksh}" />
<property name= "minEvictableIdleTimeMillis" value= "${minEvictableIdleTimeMillis.jksh}" />
</bean>
<bean id= "jclt" class = "org.apache.commons.dbcp.BasicDataSource"
destroy-method= "close" >
<!-- Connection Info -->
<property name= "driverClassName" value= "${driver.jclt}" />
<property name= "url" value= "${url.jclt}" />
<property name= "username" value= "${username.jclt}" />
<property name= "password" value= "${password.jclt}" />
<!-- Connection Pooling Info -->
<property name= "maxIdle" value= "${maxIdle.jclt}" />
<property name= "maxActive" value= "${maxActive.jclt}" />
<property name= "defaultAutoCommit" value= "false" />
<property name= "timeBetweenEvictionRunsMillis" value= "${timeBetweenEvictionRunsMillis.jclt}" />
<property name= "minEvictableIdleTimeMillis" value= "${minEvictableIdleTimeMillis.jclt}" />
</bean>
<bean id= "dataSource" class = "com.jclt.service.commons.DynamicDataSource" >
<property name= "targetDataSources" >
<map key-type= "java.lang.String" >
<entry key= "jksh" value-ref= "jksh" />
<entry key= "jclt" value-ref= "jclt" />
</map>
</property>
<property name= "defaultTargetDataSource" ref= "jksh" />
</bean>
|
4. 代码:main方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import javax.sql.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import com.jclt.service.commons.DbContextHolder;
import com.jclt.service.model.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
public class Text {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext appContext = new ClassPathXmlApplicationContext( "client-beans.xml" );
DbContextHolder.setDbType( "jclt" );
String res= "src/main/resources/ibatis-config.xml" ;
DataSource datasource=(DataSource) appContext.getBean( "dataSource" );
SqlSessionFactoryBean bean= new SqlSessionFactoryBean();
bean.setDataSource(datasource);
Resource resource= new FileSystemResource(res);
bean.setConfigLocation(resource);
try {
SqlSessionFactory sessionfactory = bean.getObject();
SqlSession session=sessionfactory.openSession();
User user=session.selectOne( "com.jclt.service.Dao.readJKSH.findOne" );
System.out.println(user.getName());
} catch (Exception e) {
e.printStackTrace();
}
DbContextHolder.setDbType( "jksh" );
String res1= "src/main/resources/ibatis-config.xml" ;
DataSource datasource1=(DataSource) appContext.getBean( "dataSource" );
SqlSessionFactoryBean bean1= new SqlSessionFactoryBean();
bean1.setDataSource(datasource1);
Resource resource1= new FileSystemResource(res1);
bean1.setConfigLocation(resource1);
try {
SqlSessionFactory sessionfactory = bean.getObject();
SqlSession session=sessionfactory.openSession();
User user=session.selectOne( "com.jclt.service.Dao.readJKSH.findOne" );
System.out.println(user.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
以上所述是小编给大家介绍的Spring与Mybatis相结合实现多数据源切换功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!