前言
本文主要介绍的是关于Spring MVC配置双数据源实现一个java项目同时连接两个数据库的方法,分享出来供大家参考学习,下面来看看详细的介绍:
实现方法:
数据源在配置文件中的配置
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
<pre name= "code" class = "java" ><?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:aop= "http://www.springframework.org/schema/aop" xmlns:cache= "http://www.springframework.org/schema/cache" xmlns:context= "http://www.springframework.org/schema/context" xmlns:jdbc= "http://www.springframework.org/schema/jdbc" xmlns:jee= "http://www.springframework.org/schema/jee" xmlns:jms= "http://www.springframework.org/schema/jms" xmlns:lang= "http://www.springframework.org/schema/lang" xmlns:mvc= "http://www.springframework.org/schema/mvc" xmlns:oxm= "http://www.springframework.org/schema/oxm" xmlns:p= "http://www.springframework.org/schema/p" xmlns:task= "http://www.springframework.org/schema/task" xmlns:tx= "http://www.springframework.org/schema/tx" xmlns:util= "http://www.springframework.org/schema/util" xsi:schemaLocation="http: //www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http: //www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http: //www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd http: //www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http: //www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd http: //www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd http: //www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.1.xsd http: //www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd http: //www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http: //www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd http: //www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd http: //www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http: //www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"> <context:annotation-config /> <context:component-scan base- package = "com" ></context:component-scan> <bean class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name= "locations" > <list> <value>classpath:com/resource/config.properties</value> </list> </property> </bean> <bean id= "dataSourceOne" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method= "close" > <property name= "driverClass" value= "${dbOne.jdbc.driverClass}" /> <property name= "jdbcUrl" value= "${dbOne.jdbc.url}" /> <property name= "user" value= "${dbOne.jdbc.user}" /> <property name= "password" value= "${dbOne.jdbc.password}" /> <property name= "initialPoolSize" value= "${dbOne.jdbc.initialPoolSize}" /> <property name= "minPoolSize" value= "${dbOne.jdbc.minPoolSize}" /> <property name= "maxPoolSize" value= "${dbOne.jdbc.maxPoolSize}" /> </bean> <bean id= "dataSourceTwo" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method= "close" > <property name= "driverClass" value= "${dbTwo.jdbc.driverClass}" /> <property name= "jdbcUrl" value= "${dbTwo.jdbc.url}" /> <property name= "user" value= "${dbTwo.jdbc.user}" /> <property name= "password" value= "${dbTwo.jdbc.password}" /> <property name= "initialPoolSize" value= "${dbTwo.jdbc.initialPoolSize}" /> <property name= "minPoolSize" value= "${dbTwo.jdbc.minPoolSize}" /> <property name= "maxPoolSize" value= "${dbTwo.jdbc.maxPoolSize}" /> </bean> <bean id= "dynamicDataSource" class = "com.core.DynamicDataSource" > <property name= "targetDataSources" > <map key-type= "java.lang.String" > <entry value-ref= "dataSourceOne" key= "dataSourceOne" ></entry> <entry value-ref= "dataSourceTwo" key= "dataSourceTwo" ></entry> </map> </property> <property name= "defaultTargetDataSource" ref= "dataSourceOne" > </property> </bean> <bean id= "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean" > <property name= "dataSource" ref= "dynamicDataSource" /> <property name= "hibernateProperties" > <props> <prop key= "hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop> <prop key= "hibernate.current_session_context_class" >org.springframework.orm.hibernate4.SpringSessionContext</prop> <prop key= "hibernate.show_sql" > false </prop> <prop key= "hibernate.format_sql" > true </prop> <prop key= "hbm2ddl.auto" >create</prop> </props> </property> <property name= "packagesToScan" > <list> <value>com.po</value> </list> </property> </bean> <bean id= "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager" > <property name= "sessionFactory" ref= "sessionFactory" /> </bean> <aop:config> <aop:pointcut id= "transactionPointCut" expression= "execution(* com.dao..*.*(..))" /> <aop:advisor advice-ref= "txAdvice" pointcut-ref= "transactionPointCut" /> </aop:config> <tx:advice id= "txAdvice" transaction-manager= "transactionManager" > <tx:attributes> <tx:method name= "add*" propagation= "REQUIRED" /> <tx:method name= "save*" propagation= "REQUIRED" /> <tx:method name= "update*" propagation= "REQUIRED" /> <tx:method name= "delete*" propagation= "REQUIRED" /> <tx:method name= "*" read-only= "true" /> </tx:attributes> </tx:advice> <aop:config> <aop:aspect id= "dataSourceAspect" ref= "dataSourceInterceptor" > <aop:pointcut id= "daoOne" expression= "execution(* com.dao.one.*.*(..))" /> <aop:pointcut id= "daoTwo" expression= "execution(* com.dao.two.*.*(..))" /> <aop:before pointcut-ref= "daoOne" method= "setdataSourceOne" /> <aop:before pointcut-ref= "daoTwo" method= "setdataSourceTwo" /> </aop:aspect> </aop:config> </beans> |
DynamicDataSource.class
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.core; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource{ @Override protected Object determineCurrentLookupKey() { return DatabaseContextHolder.getCustomerType(); } } |
DatabaseContextHolder.class设置数据源的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package com.core; public class DatabaseContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); <span style= "white-space:pre" > </span> //设置要使用的数据源 public static void setCustomerType(String customerType) { contextHolder.set(customerType); } <span style= "white-space:pre" > </span> //获取数据源 public static String getCustomerType() { return contextHolder.get(); } <span style= "white-space:pre" > </span> //清除数据源,使用默认的数据源 public static void clearCustomerType() { contextHolder.remove(); } } |
DataSourceInterceptor.class
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.core; import org.aspectj.lang.JoinPoint; import org.springframework.stereotype.Component; @Component public class DataSourceInterceptor { <span style= "white-space:pre" > </span> //数据源1 public static final String SOURCE_PLAN = "<span style=" font-family: Arial, Helvetica, sans-serif; ">dataSourceOne</span><span style=" font-family: Arial, Helvetica, sans-serif; ">" ;</span> //数据源2 <pre name= "code" class = "java" ><span style= "white-space:pre" > </span> public static final String SOURCE_FUND = "<span style=" font-family: Arial, Helvetica, sans-serif; ">dataSourceTwo</span>" ; } |
springMVC数据源
1
2
|
jdbc_driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver <pre name= "code" class = "java" >dataSourceOne<span style= "font-family: Arial, Helvetica, sans-serif;" >=jdbc:sqlserver: //115.29.***.**;DatabaseName=DB_GuiHua</span> |
jdbc_username=**jdbc_password=**
1
|
dataSourceTwo<span style= "font-family: Arial, Helvetica, sans-serif;" >=jdbc:sqlserver: //115.29.***.*;DatabaseName=DB_Fund</span> |
Spring MVC会默认有一个数据源,当需要更换数据源时,要在调用事务之前配置
1
|
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_FUND); //更换数据源 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/** * @ClassName: DataSourceContextHolder * @Description: 数据库切换工具类 * @author: wzx * @date: 2016-07-27 上午10:26:01 */ public class DataSourceContextHolder { 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(); } } |
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://blog.csdn.net/a347911/article/details/52055070