Spring+Hibernate 多数据源不同事务创建

摘要:
环境:Spring 3.0,Hibernate 3.5,同类型数据库前言:本片仅简要描述了使用Spring和Hibernate注入在不同事务中管理多个数据源的方法。):1.添加数据库连接配置jdbc。属性jdbcq。driverClassName=com。db2.jcc。DB2河流。url=jdbc:db2://192.168.1.11:50001/DB01:currentSchema=USER1;Jdbcq。username=user1jdbcq。password=user12.在Spring configurationapplicationContext中添加新的数据源配置。xmlclasspath:jdbc。properties新数据源:sessionFactory配置:此处的实体包是注释方法的必备项,只有在sessionFactory中扫描的实体包才能在注入sessionFactory的数据库操作中操作。--只有在包含实体的包中扫描的业务包才能被扫描--˃˂propertyname=”p

环境:Spring 3.0 ,Hibernate 3.5 ,同类型数据库(DB2)

编前语:此片仅粗略的描述使用Spring和Hibernate采用注入方式管理多数据源在不同事务的情况下使用的方法。

涉及到的文件三个:testDaoImpl (数据库操作文件),applicationContext.xml(Spring主配置文件) ,jdbc.properties (数据库连接和各种数据库相关配置文件)

总体分三步:

1.增加数据库连接

2.在Spring配置中增加新的数据源配置

3.在需要使用不同数据源的操作实现类中指定新的sessionFactory和transactional

具体使用修改如下(注意:所有配置仅用于多数据源连接测试,并非优化后配置,套用需谨慎!):

1.增加数据库连接配置(该配置文件中包含了cpool的配置和hibernate的配置信息在xml配置中直接调用) jdbc.properties

jdbcq.driverClassName=com.db2.jcc.DB2Driver
jdbcq.url=jdbc:db2://192.168.1.11:50001/DB01:currentSchema=USER1;
jdbcq.username=user1
jdbcq.password=user1

2.在Spring配置中增加新的数据源配置 applicationContext.xml

(前提配置)

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>    

新增数据源:

    <bean id="dataSourceQ" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbcq.driverClassName}" />
        <property name="jdbcUrl" value="${jdbcq.url}" />
        <property name="user" value="${jdbcq.username}" />
        <property name="password" value="${jdbcq.password}" />
        <property name="autoCommitOnClose" value="true" />
        <property name="checkoutTimeout" value="${cpool.checkoutTimeout}" />
        <property name="initialPoolSize" value="${cpool.minPoolSize}" />
        <property name="minPoolSize" value="${cpool.minPoolSize}" />
        <property name="maxPoolSize" value="${cpool.maxPoolSize}" />
        <property name="maxIdleTime" value="${cpool.maxIdleTime}" />
        <property name="acquireIncrement" value="${cpool.acquireIncrement}" />
        <property name="acquireRetryAttempts" value="30" />
        <property name="acquireRetryDelay" value="1000" />
        <property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}" />
    </bean>

sessionFactory配置:

此处实体包是注解方式必须有的,只有在sessionFactory 中进行扫描过的实体包才能在注入该sessionFactory的数据库操作impl中操作。否则会出现找不到对应实体的异常。此处仅扫描用于测试的包。

另外一点需要注意的是如果配置二级缓存那么需要使用不同的配置文件和配置,否则会出现缓存空间已经被使用的异常。当然用于测试可以直接去掉这部分配置

此处新建了另外一个配置文件,同时配置了不同的缓存空间

    <!-- 新的sessioinFactory--> 
    <bean id="sessionFactoryQ"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <!-- 新的数据源--> 
        <property name="dataSource" ref="dataSourceQ" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop>
                <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
                <!-- 使用ehcache -->
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                <!-- 最优化二级缓存 -->
                <prop key="hibernate.cache.use_structured_entries">true</prop>
                <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache-hibernate-q.xml</prop>
            </props>
        </property>
        <!--  扫描实体所在包 只扫描业务包-->
        <property name="packagesToScan" >
            <list>
                <value>com.back.entities.test</value>
            </list>
        </property>
    </bean>

事务管理配置:

    <!-- 指定事务管理 -->
    <bean id="transactionManagerQ" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactoryQ" />
    </bean>
    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManagerQ" />

3.在需要使用不同数据源的操作实现类中指定新的sessionFactory和transactional

@Repository
@Transactional("transactionManagerQ")
public class TestDaoImpl implements TestDao {
    
    private SessionFactory sessionFactory;
    
    @Resource(name="sessionFactoryQ")
    public void setSessionFactory(SessionFactory sessionFactoryQ) {
        this.sessionFactory = sessionFactoryQ;
    }
}

大概就是这样,需要配置和修改的地方都如上已经处理了。因为是注解所以和纯xml配置会有不同的地方。数据库操作的实现类在项目中其实会继承框架的一个实现类,但为了便于看到全貌,所以修改成以上的样子,从而可以看到sessionFactory的设置。

免责声明:文章转载自《Spring+Hibernate 多数据源不同事务创建》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇红米手机使用应用沙盒一键修改经纬度数据Maven--要点笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySql数据库优化、备份和恢复

一、数据库优化 1、为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 优化原则:减少系统瓶颈,减少资源占用,增加系统的反应速度。 2、数据库结构优化 需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。 将...

ZooKeeper的配置文件优化性能(转)

一、前言 ZooKeeper的功能特性通过ZooKeeper配置文件来进行控制管理( zoo.cfg配置文件)。 ZooKeeper这样的设计其实是有它自身的原因的。通过前面对ZooKeeper的配置可以看出,对ZooKeeper集群进行配置的时候,它的配置文档是完全相同的(对于集群伪分布模式来说,只有很少的部分是不同的)。这样的配置方使得在部署ZooKe...

SQL Server 锁

from:http://www.cnblogs.com/kissdodog/p/3170036.html  锁是一种防止在某对象执行动作的一个进程与已在该对象上执行的其他进行相冲突的机制。也就是说,如果有其他人在操作某个对象,那么你旧不能在该对象上进行操作。你能否执行操作取决于其他用户正在进行的操作。 通过锁可以防止的问题   锁可以解决以下4种主要问题:...

java事务

一、什么是事务   事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换成另一种状态。     事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写事务必须...

SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

五、锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误。设置事务隔离级别将影响整条连接。 SQL Server 数据库引擎支持所有这些隔离级别: · 未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的数据) · 已提交读(数据库引擎的默认级...

以银行转账为例分析分布式事务的解决方案

提起分布式系统,就会涉及分布式事务,本文就以金融项目的转账业务为例,分析各种业务场景下的转账业务的事物问题。 一、业务场景 以工商银行转账业务为例,那么项目的分布式架构大致如下,一个银行的一个支行部署一个节点,那么相同节点之间的业务就是本地事务、不同节点之间的就是分布式事务 转账业务包括以下三种情况 支行内转账:同为工行的相同支行内转账(本地事务) 行内...