`
wangpx
  • 浏览: 198283 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring 和hibernate多数据源解决方案

阅读更多

Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承 AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源,每个数据源的表结构都是相同 的,所以要求数据源的变动对于编码人员来说是透明,也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下:
一、首先需要写一个静态的键值对照类:

java 代码
1. package cn.com.xinli.ccp.dynamicds;
2.
3. public class DataSourceMap {
4. public static final String Admin= "Admin" ;
5. public static final String Yxh = "Yxh" ;
6. }

 

 

这个类主要在使用的时候当作获得数据源的标志使用。
二、建立一个获得和设置上下文的类:

java 代码
1. package cn.com.xinli.ccp.dynamicds;
2.
3. public class CustomerContextHolder {
4. private static final ThreadLocal contextHolder =
5. new ThreadLocal();
6.
7. public static void setCustomerType(String customerType) {
8. contextHolder.set(customerType);
9. }
10.
11. public static String getCustomerType() {
12. return (String) contextHolder.get();
13. }
14.
15. public static void clearCustomerType() {
16. contextHolder.remove();
17. }
18.
19. }

 

 

这个主要负责设置上下文环境和获得上下文环境。
三、建立动态数据源类,这个类必须继承AbstractRoutingDataSource:

java 代码
1. package cn.com.xinli.ccp.dynamicds;
2.
3. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
4.
5. public class DynamicDataSource extends AbstractRoutingDataSource {
6.
7. protected Object determineCurrentLookupKey() {
8. // TODO Auto-generated method stub
9. return CustomerContextHolder.getCustomerType();
10. }
11.
12. }

 

 

这个类实现了determineCurrentLookupKey方法,该方法返回一个Object,一般是返回字符串,也可以是枚举类型。该方法 中直接使用了CustomerContextHolder.getCustomerType()方法获得上下文环境并直接返回。
四、编写spring的配置文件配置数据源

<bean id= "parentDataSource"      
              class = "org.springframework.jdbc.datasource.DriverManagerDataSource" >     
             <property name= "driverClassName" >     
                 <value>COM.ibm.db2.jdbc.net.DB2Driver</value>     
             </property>     
             <property name= "url" >     
                 <value>jdbc:db2: 127.0 . 0.1 :TEST</value>     
            </property>     
</bean>     
           
<bean id= "adminDataSource"  parent= "parentDataSource" >     
         <property name= "username"  value= "admin" />     
         <property name= "password"  value= "master997mb" />     
</bean>     
<bean id= "yxhDataSource"  parent= "parentDataSource" >     
         <property name= "username"  value= "yxh" />     
         <property name= "password"  value= "yxh" />     
 </bean>  

 

在这个配置中可以看到首先有个parentDataSource,这个主要配置一些数据源的公用信息,项目中都是链接DB2数据 库;adminDataSource和yxhDataSource是根据不同需要配置的个性化信息,但都必须加parent属性,值为 parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库,那么 parentDataSource就可以不要了,直接配置两个不同的数据源链接就可以了。
五、编写spring配置文件配置多数据源映射关系


<bean id= "dataSource"   class = "cn.com.xinli.ccp.dynamicds.DynamicDataSource" >     
        <property name= "targetDataSources" >     
           <map key-type= "java.lang.String" >     
              <entry key= "Yxh"  value-ref= "yxhDataSource" />     
           </map>     
        </property>     
        <property name= "defaultTargetDataSource"  ref= "adminDataSource" />     
</bean>  

 

在这个配置中第一个property属性配置目标数据源,<map key-type="java.lang.String">中的key-type必须要和静态键值对照类DataSourceMap中的值的类型相 同;<entry key="Yxh" value-ref="yxhDataSource"/>中key的值必须要和静态键值对照类中的值相同,如果有多个值,可以配置多个< entry>标签。第二个property属性配置默认的数据源。
六、配置hibernate。
Hibernate的配置和普通的hibernate、spring结合的配置一样

 


<bean id= "sessionFactory"      
          class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >     
        <!-- to override, use the  "SpringDatasourceConfig"  snippet in your project -->     
         <property name= "dataSource" >     
             <ref local= "dataSource"  />     
         </property>     
         <property name= "mappingResources" >     
             <list>     
                <value>     
                    cn/com/xinli/ccp/entity/User.hbm.xml      
                 </value>     
                <value>     
                    cn/com/xinli/ccp/entity/Test.hbm.xml      
                </value>     
            </list>     
         </property>     
         <property name= "hibernateProperties" >     
             <props>     
                 <prop key= "hibernate.dialect" >     
                    org.hibernate.dialect.DB2Dialect      
                 </prop>     
                       
                 <prop key= "hibernate.show_sql" > true </prop>     
                 <prop key= "hibernate.use_outer_join" > true </prop>     
                <prop key= "hibernate.jdbc.batch_size" > 50 </prop>     
                 <prop key= "hibernate.jdbc.fetch_size" > 5 </prop>     
                <prop key= "hibernate.connection.pool_size" > 2 </prop>     
                 <prop key= "hibernate.connection.autocommit" > false </prop>     
                 <prop key= "hibernate.cache.use_query_cache" > false </prop>     
                 <prop key= "hibernate.max_fetch_depth" > 1 </prop>     
                 <prop key= "hibernate.bytecode.use_reflection_optimizer" > true </prop>     
             </props>     
         </property>     
     </bean>     
      
 <bean id= "mydao"   class = "cn.com.xinli.ccp.dao.HibernateBaseDao" >     
         <property name= "sessionFactory" >     
            <ref local= "sessionFactory"  />     
        </property>     
 </bean>     

 

关于dao的代码这里就省略了。
七、配置结束,可以使用了。


 public   class  DaoTest  extends  TestCase {      
     
      public   void  testSave()  throws  Exception{      
         CustomerContextHolder.setCustomerType(DataSourceMap.Admin); //设置数据源      
          //hibernate 创建实体      
         Test test =  new  Test();      
        test.setTest( "22222222" );      
              
        mydao.save(test); //使用dao保存实体      
               
       CustomerContextHolder.setCustomerType(DataSourceMap.Yxh); //设置为另一个数据源      
               
       mydao.save(test); //使用dao保存实体到另一个库中      
               
     }      
}     

 

 

在项目中对于编码人员对多数据源的切换可以做成透明的,操作同样的dao,就可以访问不同的数据库了。

分享到:
评论

相关推荐

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    Spring攻略(第二版 中文高清版).part1

    1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...

    Spring攻略(第二版 中文高清版).part2

    1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...

    图书管理系统(struts+hibernate+spring+ext).rar

    图书管理系统是一个基于Struts+Hibernate+Spring+Ext的计算机专业JSP源码资料包,它为开发者提供了一套完整的图书管理解决方案。这个系统采用了经典的MVC架构,将业务逻辑、数据访问和界面展示分离,使得代码结构...

    OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar

    这个资料包为开发者提供了一个全面的、易于使用的、高效的办公自动化解决方案,旨在帮助企业实现信息化建设,提高工作效率,降低运营成本。Struts1.2作为MVC框架,负责处理请求分发、控制跳转和视图渲染,使得系统...

    xc-spring-cloud-alibaba:Spring Cloud阿里巴巴(2.2.1最新版)+ nacos + dubbo + gateWay + sentinel + rocketmq +(pgsqlmysql8.0的json支持)+ ignite集成可用于docker分布式框架+分布式自动化任务+ mybatis多数据源+ seate + shardingSphere分布式分库事务解决方案

    增加mybatis多数据源操作,引用seate1.2处理分布式事务,多数据源事务,引用shardingSphere进行分库分表处理 项目布署图 它有什么作用 本框架使用spring cloud为基本架构,结合阿里dubbo + nacos提供服务层 再结合...

    Spring.3.x企业应用开发实战(完整版).part2

    8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 9.1.2 数据并发的问题 9.1.3 数据库锁机制 9.1.4 事务隔离级别 9.1.5 JDBC对事务支持 9.2 ThreadLocal...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 ...

    Spring 2.0 开发参考手册

    9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1....

    Spring中文帮助文档

    3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...

    Spring API

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    spring chm文档

    9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1....

    Spring3.x企业应用开发实战(完整版) part1

    8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 9.1.2 数据并发的问题 9.1.3 数据库锁机制 9.1.4 事务隔离级别 9.1.5 JDBC对事务支持 9.2 ThreadLocal...

    基于struts+hibernate+spring+easyui+mysql的网上商城项目实战源码.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    高效Java数据访问组件Uncode-DAL全功能源码

    Uncode-DAL是一个功能全面的Java数据访问层组件,它深度整合了MyBatis、Spring JDBC以及Hibernate等主流ORM框架,致力于为开发者提供一套简便、高效的数据操作解决方案。该组件支持多数据源配置,能够实现读写分离、...

    计算机毕业设计-JavaSmart系统-系统框架设计与开发(源代码+论文)

    JavaSmart系统是一个基于Java EE平台开发的企业级系统框架,它为快速构建和部署复杂的业务应用程序提供了一套完整的解决方案。该系统框架采用模块化设计,利用Spring框架实现依赖注入和事务管理,使用Spring MVC处理...

    springmybatis

    3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 ...

    《MyEclipse 6 Java 开发中文教程》前10章

    第一章 安装配置开发环境 18 1.1系统需求 18 1.2 JDK 的下载,安装和配置(可...10.7.2 MyEclipse生成的Spring+Hibernate无法保存数据问题的解决方法2 - 用 CGLIB 来实现事务管理 258 10.7.3 Spring相关的参考资料 261

    基于Java的CRM客户关系管理系统的设计和实现项目源代码

    基于Java的CRM客户关系管理系统是一个全面的客户管理解决方案,旨在帮助企业更好地管理客户关系、提升客户满意度和增强竞争力。该系统采用了Java语言作为主要开发语言,并结合了Spring框架、Spring MVC框架以及...

    汇编程序:功能性,类型安全和无状态的Java API,用于解决多数据库和微服务聚合中的N + 1查询问题

    更具体地说,它被设计为一种非常轻量级的解决方案,用于解决聚合数据时的N + 1查询问题,这些问题不仅来自数据库调用(例如Spring Data JPA,Hibernate),而且来自任意数据源(关系数据库,NoSQL,REST,本地方法...

Global site tag (gtag.js) - Google Analytics