我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > springMvc +hibernate 实现多数据源动态切换
总共48086条微博

动态微博

查看: 6970|回复: 1

springMvc +hibernate 实现多数据源动态切换

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2016-06-08 16:50:40 |只看该作者 |倒序浏览
    一、实现目的       

            最近在做任务统计平台,对平台大体做一个介绍。两个平台,学科学习资源管理平台和学科教学资源管理平台,每个平台下有三科(外数语),另外加统一认证平台,七个项目也就是说有7个数据源。

           虽然说是两个平台,但只是业务逻辑稍微不同罢了,各个科目下的dao和service以及JOB其实都是可以统用的。以前各个定时统计任务都是分布在各个科目中的,导致一开始做的时候就要拷贝多份,特别是业务逻辑修改的时候特别头疼,各种拷贝,还得写一堆上线单。

           所以采用springMvc+hibernate+mysql+dubbo 实现的多数据源切换 统计平台,实现对dao和
    service以及job层的统一调用,只需切换不同的数据源即可。dubbo这里只是做远程接口调用,暂且可以不用看。


    二、实现方式

    1、配置 applicationContext-datasource.xml
    这里是简单的配置了2个数据源做实例,统一配置和学科学习数学科目的数据源。  
    1. <!-- 统一配置数据源 -->
    2.     <bean id="dataSourceSSO" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    3.           <property name="driverClassName" value="${jdbc.driverClassName}" />
    4.           <property name="url" value="${jdbc.url_SSO}" />
    5.           <property name="username" value="${jdbc.user}" />
    6.           <property name="password" value="${jdbc.pass}" />
    7.     </bean>
    8.     <!-- 配置数学数据源 -->
    9.     <bean id="dataSourceFmM" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    10.           <property name="driverClassName" value="${jdbc.driverClassName}" />
    11.           <property name="url" value="${jdbc.url_Fm_M}" />
    12.           <property name="username" value="${jdbc.user}" />
    13.           <property name="password" value="${jdbc.pass}" />
    14.     </bean>
    15.     <bean id="multipleDataSource" class="com.acts.web.common.persistence.DynamicDataSource">
    16.         <property name="defaultTargetDataSource" ref="dataSourceFmM"/>
    17.         <property name="targetDataSources">
    18.             <map>     
    19.                 <!-- 注意这里的value是和上面的DataSource的id对应,key要和下面的CustomerContextHolder中的常量对应 -->
    20.                 <entry value-ref="dataSourceSSO"  key="SSODataSource"/>
    21.                 <entry value-ref="dataSourceFmM"  key="MDataSourceFm"/>
    22.             </map>   
    23.         </property>
    24.     </bean>
    25.     <!-- Annotation 配置sessionFactory,配置数据库连接,注入hibernate数据库配置 -->
    26.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    27.         <property name="dataSource" ref="multipleDataSource"/>
    28.         <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    29.         <property name="hibernateProperties">
    30.             <props>
    31.                 <!-- 链接释放策略 on_close | after_transaction | after_statement | auto  -->
    32.                 <prop key="hibernate.connection.release_mode">after_transaction</prop>
    33.                <!--  <prop key="hibernate.show_sql">true</prop>
    34.                 <prop key="hibernate.format_sql">true</prop> -->
    35.                 <!--数据库批量查询最大数 -->
    36.                 <prop key="hibernate.jdbc.fetch_size">50</prop>
    37.                 <!--  数据库批量更新、添加、删除操作最大数 -->
    38.                 <prop key="hibernate.jdbc.batch_size">50</prop>
    39.             </props>
    40.         </property>
    41.     </bean>
    42.     <!-- 统一配置AOP切面注入 直接切入dao层使用默认数据源-->
    43.     <aop:config>  
    44.         <aop:aspect id="dataSourceAspect" ref="dataSourceInterceptor">  
    45.             <aop:pointcut id="daoSSO" expression="within(com.acts.web.modules.rmp.dao.AnalysisQuesSsoDao)" />  
    46.             <aop:before pointcut-ref="daoSSO" method="setdataSourceSSO" />
    47.         </aop:aspect>  
    48.     </aop:config>
    复制代码


    2、applicationContext.xml 数据库参数配置

    1. <!-- 加載配置文件 -->
    2.     <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
    3.       <property name="order" value="1"/>  
    4.       <property name="ignoreUnresolvablePlaceholders" value="true"/>  
    5.       <property name="locations">  
    6.         <list>  
    7.             <value>classpath:persistence-mysql.properties</value>  
    8.         </list>  
    9.       </property>  
    10.     </bean>
    复制代码


    3、DatabaseContextHolder.java 多数据源

    1. /**
    2. * 多数据源
    3. * 创建者    张志朋
    4. * 创建时间    2016年5月26日
    5. *
    6. */
    7. public class DatabaseContextHolder {

    8.     public final static String DATA_SOURCE_SSO = "SSODataSource";
    9.     public final static String DATA_SOURCE_FM_MATH = "MDataSourceFm";
    10.     public final static String DATA_SOURCE_FM_ENGLISH = "EDataSourceFm";
    11.     public final static String DATA_SOURCE_FM_CHINESE = "LDataSourceFm";

    12.     public final static String DATA_SOURCE_K12_MATH = "MDataSourceK12";
    13.     public final static String DATA_SOURCE_K12_ENGLISH = "EDataSourceK12";
    14.     public final static String DATA_SOURCE_K12_CHINESE = "LDataSourceK12";

    15.     public final static String DATA_SOURCE_K12 = "K12DataSource";
    16.     public final static String DATA_SOURCE_K12_ONLINE = "K12OnlineDataSource";

    17.     private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  

    18.     public static void setCustomerType(String customerType) {  
    19.         contextHolder.set(customerType);  
    20.     }  
    21.     public static String getCustomerType() {  
    22.         return contextHolder.get();  
    23.     }  

    24.     public static void clearCustomerType() {  
    25.         contextHolder.remove();  
    26.     }
    27. }
    复制代码

    4、DynamicDataSource.java  动态据源实现

    1. /**
    2. * 动态据源实现
    3. * 创建者    张志朋
    4. * 创建时间    2016年5月25日
    5. *
    6. */
    7. public class DynamicDataSource extends AbstractRoutingDataSource {
    8.     @Override  
    9.     protected Object determineCurrentLookupKey() {  
    10.         return DatabaseContextHolder.getCustomerType();   
    11.     }
    12. }
    复制代码
    5、DataSourceInterceptor.java 拦截器实现 注入

    1. /**
    2. * 拦截器实现 注入
    3. * 创建者    张志朋
    4. * 创建时间    2016年5月26日
    5. *
    6. */
    7. @Component
    8. public class DataSourceInterceptor {
    9.     public void setdataSourceSSO(JoinPoint jp) {
    10.         DatabaseContextHolder.setCustomerType("SSODataSource");
    11.     }
    12. }
    复制代码

    6、MultipleDataSourceServiceImplTest.java  单元测试
    1. @ContextConfiguration({ "classpath:applicationContext-datasource.xml",
    2.     "classpath:applicationContext.xml"})
    3. @RunWith(SpringJUnit4ClassRunner.class)
    4. public class MultipleDataSourceServiceImplTest {
    5.     @Test
    6.     public void testDao() {
    7.         //数学科目 统计
    8.         DatabaseContextHolder.setCustomerType(DatabaseContextHolder.DATA_SOURCE_FM_MATH);
    9.         //英语科目 统计
    10.         DatabaseContextHolder.setCustomerType(DatabaseContextHolder.DATA_SOURCE_FM_ENGLISH);
    11.         //语文科目 统计
    12.         DatabaseContextHolder.setCustomerType(DatabaseContextHolder.DATA_SOURCE_FM_CHINESE);
    13.     }
    14. }
    复制代码

    运行单元测试,三科的统计 通过使用各自的数据源调用相同的JOB和service以及dao层实现任务统计。


    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    沙发
    发表于 2016-06-08 17:58:22 |只看该作者
    如果 有不明白的地方 可以加群 或者我的QQ 获得帮助
    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表