整合及注意事项,使用aop配置事务

引言

[html]  

Spring 整合 hibernate 配置

1、读写分离:能够经过Spring提供的AbstractRoutingDataSource类,重写determineCurrentLookupKey主意,达成动态切换数据源的成效;读写分离能够有效缓和写库的下压力,又足以把询问数据的乞请分发到差别读库;

<?xml version=”1.0″ encoding=”UTF-8″?>  

  1. spring 配置管理datasource 及 sessionFactory

2、写数据库:当调用insert、update、delete及部分实时数据运用的库;

<beans xmlns=””  

1) 引进相关jdbc配置文件。

3、读数据库:当调用select查询数据利用的库;

    xmlns:xsi=””  

 <context:property-placeholder location=”classpath:jdbc.properties”
/>    

4、JaveWeb工程通过AbstractRoutingDataSource类完结读写分离;

    xmlns:aop=””  

2) 配置datasource

一、jdbc.properties文件配置读写数据源

    xmlns:tx=””  

<bean id=”dataSourceUser”
class=”com.mchange.v2.c3p0.ComboPooledDataSource”>
        <property name=”driverClass” value=”${user.jdbc.driver}”
/>
        <property name=”jdbcUrl” value=”${user.jdbc.url}” />
        <property name=”user” value=”${user.jdbc.user}” />
        <property name=”password” value=”${user.jdbc.password}”
/>
        <!–连接池中保存的最达累斯萨拉姆接数。暗中认可值: 15 –>   
          <property name=”maxPoolSize” value=”500″/>  
          <!– 连接池中保存的微小连接数,默以为:3–>  
          <property name=”minPoolSize” value=”2″/>  
          <!–
起头化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,暗许为3–>
 
          <property name=”initialPoolSize” value=”2″/> 
         
<!–假诺为false,则收获连接退步将会引起全部等待连接池来获取连接的线程抛出格外,可是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试得到连接。借使设为true,那么在品味得到连接退步后该数量源将注明已断开并永远关闭。暗许:
false–>   
          <property name=”breakAfterAcquireFailure”
value=”false”/>  
 
          <!–每60秒检查有着连接池中的空闲连接。暗许值: 0,不反省
–>   
          <property name=”idleConnectionTestPeriod” value=”60″/>
 
         
<!–c3p0大局的PreparedStatements缓存的大大小小。假使maxStatements与maxStatementsPerConnection均为0,则缓存不见效,只要有二个不为0,则语句的缓存就能够立见成效。要是暗中同意值:
0–>   
          <property name=”maxStatements” value=”100″/>  
         
<!–maxStatementsPerConnection定义了接二连三池内单个连接所具有的最大缓存statements数。暗中同意值:
0 –>   
          <property name=”maxStatementsPerConnection” value=”0″/>
 

datasource.type=mysql

    xsi:schemaLocation=”   

    <!–  …  –>
    </bean>

datasource.driverClassName=com.mysql.jdbc.Driver

     

3) 配置sessionFactory
    <bean id=”sessionFactory”
      
 class=”org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>
        <!– 注入连接池 –>
        <property name=”dataSource” ref=”dataSource” />   
<!–可由
        <!– 配置Hibernate的别的的属性 –>
        <property name=”hibernateProperties”>
            <props>
                <!– <prop
key=”current_session_context_class”>thread</prop><prop
key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>
–>
                <prop
key=”hibernate.dialect”>org.shenyundata.cn.base.BlobMySQLDialect</prop>
                <prop
key=”hibernate.show_sql”>false</prop>
                <prop
key=”hibernate.format_sql”>false</prop>

datasource.username=root

     

      <!–  …  –>
            </props>
        </property>
        <!– 配置映射的笺注的实体类的包 –>
         <property name=”packagesToScan”>
            <list>
                <value>org.shenyundata.cn.model</value>
            </list>  
        </property>
    </bean>

#写库w.datasource.url=jdbc\:mysql\://127.0.0.1\:3306/ddt?characterEncoding\=utf-8w.datasource.password=write123

           
 

  1. 一旦采取hibernateTemplate, 供给相关配置

#读库r.datasource.url=jdbc\:mysql\://IP\:3306/ddt?characterEncoding\=utf-8r.datasource.password=read123

              

<bean id=”hibernateTemplate”
class=”org.springframework.orm.hibernate3.HibernateTemplate”>
        <property name=”sessionFactory”
ref=”sessionFactory”></property>
    </bean>

#连接池配置

         
 ;  

  1. 事务处理器 相关安插

c3p0.acquireIncrement=3

  

    <bean id=”transactionManager”
      
 class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>
        <property name=”sessionFactory”
ref=”sessionFactory”></property>
    </bean>

c3p0.acquireRetryAttempts=10

    <bean id=”phrDS”  

  1. 事务管理器的切面逻辑配置

c3p0.acquireRetryDelay=1000

       
class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
 

<tx:advice id=”advice” transaction-manager=”transactionManager”>
        <!– 配置拦截 –>
        <tx:attributes>
            <tx:method name=”get*” />
            <tx:method name=”*” rollback-for=”Throwable”  />
        </tx:attributes>
    </tx:advice>
   
    <!– 配置拦截准则 –>
    <aop:config>
        <!– 拦截法则 –>
        <aop:pointcut id=”myPointcut”
            expression=”execution(* org.***.cn.service.*.*(..)) or
execution (* org.***.cn.task.*.*(..))  ” />
        <aop:advisor advice-ref=”advice” pointcut-ref=”myPointcut”
/>
    </aop:config>

c3p0.initialPoolSize=20

       <property name=”driverClassName”  

 

c3p0.idleConnectionTestPeriod=3600

            value=”org.logicalcobwebs.proxool.ProxoolDriver” />  

注意事项

c3p0.testConnectionOnCheckout=true

      <property name=”url” value=”proxool.phrConn” />  

1.spring 负责 管理service 及dao 的生成。

c3p0.minPoolSize=10

    </bean>  

2.action的生成 由struts2 spring 的plugin生成,不受spring 的管理。

c3p0.maxPoolSize=80

      

  1. OpenSessionInviewFilter 注意事项:

c3p0.maxStatements=100

     <bean id=”cdaDS”  

1).  必需配备在struts2 filter前面。

c3p0.numHelperThreads=10

       
class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
 

2).  Filter 须求 sessionfactory bean,假设急需改名
供给在filter配置消息中到场  param-name: sessionfactorybeanname
param-value

c3p0.maxIdleTime=10800

       <property name=”driverClassName”  

3).  假使不安顿 transaction,会出拾分 
InvaliddataaccessapiUsageException write operations are not allowed
**** readonly, 所以记得配置好专门的学业管理器

二、application.xml文件

            value=”org.logicalcobwebs.proxool.ProxoolDriver” />  

 

<?xml version=”1.0″ encoding=”UTF-8″?><beans
xmlns=””

      <property name=”url” value=”proxool.cdaConn” />  

  1. 相关annotation 配置

xmlns:xsi=””

    </bean>  

<context:annotation-config />
    <!– scanning package –>
<context:component-scan base-package=”com.****” />

xmlns:tx=””

  

8.假诺供给采纳aspectj语法,定义切面类逻辑,要求上边包车型大巴布署

xmlns:aop=””

    <!– CDA  

<aop:aspectj-autoproxy />  AOP annotation语法协理 ,不太重大

xmlns:task=””

    <bean id=”cdaDS”  

AOP xml配置 (重要)  见第6点。     

xsi:schemaLocation=”

       
class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
 

附相关jar包:

        <property name=”driverClassName”>  

数据库包及 日志的jar包会依照各集团的状态 略有不一致。

            <value>oracle.jdbc.driver.OracleDriver</value>  

Struts.2.1.6                    Spring 2.5.6   hibernate3.3.2           整合

Antlr-2.7.6.jar

AspectJ.jar

Aspectjweaver.jar

Cglib-nodep-2.1.3.jar

Common-annotations.jar

Commons-collections-3.1.jar

Commons-fileupload-1.2.1.jar

Commons-io-1.3.2.jar

Commons-logging-1.1.1.jar

Dom4j-1.6.1.jar

Ejb3-persistence.jar

Freeemarker-2.3.13.jar

Hibernate3.jar

Hibernate-annotations.jar

Hibernate-common-annotations.jar

Javaassist-3.9.0.GA.jar

Jta-1.1.jar

Junit4.5.jar

Mysql 驱动包

Ognl-2.6.11.jar

Slf4j-api-1.5.8.jar

Slf4j-nop-1.5.8.jar

Spring.jar

Struts2-core-2.1.6.jar

Xwork-2.1.2.jar

Commons-dbcp.jar

Commons-pool.jar

Struts-spring-plugin2.1.6.jar

        </property>  

 

        <property name=”url”>  

私家整理,如有错误,接待各位留言告知,多谢!

            <value>${dbconn.cda.url}</value>  

        </property>  

        <property name=”username”>  

            <value>${dbconn.cda.userName}</value>  

        </property>  

        <property name=”password”>  

使用annotation 自动注册bean,并保险@Required,@Autowired的质量被注入 –>

            <value>${dbconn.cda.password}</value>  

<context:component-scan base-package=”com.eb3″>

        </property>  

<context:include-filter
type=”annotation”expression=”org.springframework.stereotype.Service”/>

    </bean> –>  

<context:exclude-filter
type=”annotation”expression=”org.springframework.stereotype.Controller”/>

  

</context:component-scan>

    <!–文书档案数据库数据源配置-Oracle数据源配置 –>  

<bean >

    <bean id=”docstoreDS”  

<property name=”ignoreResourceNotFound”value=”true”/>

       
class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
 

<property name=”properties”ref=”configProperties”/>

        <property name=”driverClassName”>  

</bean>

            <value>oracle.jdbc.driver.OracleDriver</value>  

<bean >

        </property>  

<property name=”locations”>

        <property name=”url”>  

<list>

            <value>${dbconn.docstore.url}</value>  

<value>classpath*:jdbc.properties</value>

        </property>  

</list>

        <property name=”username”>  

</property>

            <value>${dbconn.docstore.userName}</value>  

</bean>

        </property>  

<context:property-placeholder location=”classpath:jdbc.properties”/>

        <property name=”password”>  

<!– 定义Hibernate读数据源 –>

            <value>${dbconn.docstore.password}</value>  

<bean color: #333333; background-color: #ffcc00″>dataSourceRead”

        </property>  

destroy-method=”close”>

    </bean>  

<property name=”driverClass”>

  

<value>${datasource.driverClassName}</value>

    <bean id=”phrSessionFactory”  

</property>

       
class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>  

<property name=”jdbcUrl”>

        <property name=”dataSource” ref=”phrDS” />  

<value>${r.datasource.url}</value>

        <property name=”mappingDirectoryLocations”>  

</property>

            <list>  

<property name=”user”>

               
<value>${dbconn.docstore.mappingDirectory}</value>  

<value>${datasource.username}</value>

            </list>  

</property>

        </property>  

<property name=”password”>

        <property name=”hibernateProperties”>  

<value>${r.datasource.password}</value>

            <props>  

</property>

                <prop key=”hibernate.dialect”>  

<!–当连接池中的连接耗尽的时候c3p0贰遍同期获得的连接数。–>

                    ${dbconn.docstore.dialect}  

<property name=”acquireIncrement”>

                </prop>  

<value>${c3p0.acquireIncrement}</value>

                <prop key=”hibernate.show_sql”>  

</property>

                    ${dbconn.docstore.showsql}  

<!–定义在从数据库获取新连接退步后重新尝试的次数。–>

                </prop>  

<property name=”acquireRetryAttempts”>

                <prop
key=”hibernate.format_sql”>true</prop>  

<value>${c3p0.acquireRetryAttempts}</value>

                <prop
key=”hibernate.cache.use_second_level_cache”>  

</property>

                    false  

<!–四次接二连三中间隔时间,单位皮秒。–>

                </prop>  

<property name=”acquireRetryDelay”>

                <prop key=”hibernate.cache.provider_class”>  

<value>${c3p0.acquireRetryDelay}</value>

                    org.hibernate.cache.EhCacheProvider  

</property>

                </prop>  

<property name=”initialPoolSize”>

                <prop
key=”hibernate.cache.use_query_cache”>false</prop>  

<value>${c3p0.initialPoolSize}</value>

  

</property>

                <!–<prop
key=”current_session_context_class”>jta</prop>  

<property name=”testConnectionOnCheckout”>

                <prop key=”hibernate.transaction.factory_class”>
 

<value>${c3p0.testConnectionOnCheckout}</value>

                    org.hibernate.transaction.JTATransactionFactory  

</property>

                </prop>  

<property name=”minPoolSize”>

                  

<value>${c3p0.minPoolSize}</value>

                    for jta compatilibility (jta)  

</property>

                    org.hibernate.context.JTASessionContext  

<property name=”maxPoolSize”>

                –>  

<value>${c3p0.maxPoolSize}</value>

                <prop
key=”hibernate.cglib.use_reflection_optimizer”>  

</property>

                    true  

<property name=”maxIdleTime”>

                </prop>  

<value>${c3p0.maxIdleTime}</value>

            </props>  

</property>

        </property>  

<property name=”idleConnectionTestPeriod”>

    </bean>  

<value>${c3p0.idleConnectionTestPeriod}</value>

  

</property>

    <bean id=”cdaSessionFactory”  

<property name=”maxStatements”>

       
class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>  

<value>${c3p0.maxStatements}</value>

        <property name=”dataSource” ref=”cdaDS” />  

</property>

      

<property name=”numHelperThreads”>

        <property name=”mappingDirectoryLocations”>  

<value>${c3p0.numHelperThreads}</value>

            <list>  

</property>

               
<value>${dbconn.docstore.mappingDirectory}</value>  

</bean>

            </list>  

<!– 定义Hibernate写多少源 –>

        </property>  

<bean background-color: #ffcc00″>dataSourceWrite”

        <property name=”hibernateProperties”>  

destroy-method=”close”>

            <props>  

<property name=”driverClass”>

                <prop key=”hibernate.dialect”>  

<value>${datasource.driverClassName}</value>

                    ${dbconn.docstore.dialect}  

</property>

                </prop>  

<property name=”jdbcUrl”>

                <prop key=”hibernate.show_sql”>  

<value>${w.datasource.url}</value>

                    ${dbconn.docstore.showsql}  

</property>

                </prop>  

<property name=”user”>

                <prop
key=”hibernate.format_sql”>true</prop>  

<value>${datasource.username}</value>

                <prop
key=”hibernate.cache.use_second_level_cache”>  

</property>

                    false  

<property name=”password”>

                </prop>  

<value>${w.datasource.password}</value>

                <prop key=”hibernate.cache.provider_class”>  

</property>

                    org.hibernate.cache.EhCacheProvider  

<!–当连接池中的连接耗尽的时候c3p0叁回同期获得的连接数。–>

                </prop>  

<property name=”acquireIncrement”>

                <prop
key=”hibernate.cache.use_query_cache”>false</prop>  

<value>${c3p0.acquireIncrement}</value>

                <!–  

</property>

                    for jta compatilibility (jta)  

<!–定义在从数据库获取新连接战败后再一次尝试的次数。–>

                    org.hibernate.context.JTASessionContext  

<property name=”acquireRetryAttempts”>

                  

<value>${c3p0.acquireRetryAttempts}</value>

                <prop
key=”current_session_context_class”>jta</prop>  

</property>

                <prop key=”hibernate.transaction.factory_class”>
 

<!–五遍一而再中间隔时间,单位皮秒。–>

                    org.hibernate.transaction.JTATransactionFactory  

<property name=”acquireRetryDelay”>

                </prop>–>  

<value>${c3p0.acquireRetryDelay}</value>

            </props>  

</property>

        </property>  

<property name=”initialPoolSize”>

    </bean>  

<value>${c3p0.initialPoolSize}</value>

  

</property>

    <!– Template配置 –>  

<property name=”testConnectionOnCheckout”>

    <bean id=”phrJDBCTemplate”  

<value>${c3p0.testConnectionOnCheckout}</value>

        class=”org.springframework.jdbc.core.JdbcTemplate”>  

</property>

        <property name=”dataSource” ref=”phrDS” />  

<property name=”minPoolSize”>

    </bean>  

<value>${c3p0.minPoolSize}</value>

  

</property>

    <!– HibernateTemplete 配置 –>  

<property name=”maxPoolSize”>

    <bean id=”phrHibernateTemplete”  

<value>${c3p0.maxPoolSize}</value>

        class=”org.springframework.orm.hibernate3.HibernateTemplate”>
 

</property>

        <property name=”sessionFactory” ref=”phrSessionFactory” />
 

<property name=”maxIdleTime”>

    </bean>  

<value>${c3p0.maxIdleTime}</value>

  

</property>

    <!– HibernateDAO配置 –>  

<property name=”idleConnectionTestPeriod”>

    <bean id=”phrHibernateDao”  

<value>${c3p0.idleConnectionTestPeriod}</value>

        class=”com.xbzc.phr.dao.HibernateSuperDAOImpl”>  

</property>

        <property name=”sessionFactory” ref=”phrSessionFactory” />
 

<property name=”maxStatements”>

    </bean>  

<value>${c3p0.maxStatements}</value>

    <!– HibernateDAO配置-CDA查看使用 –>  

</property>

    <bean id=”cdaHibernateDao”  

<property name=”numHelperThreads”>

        class=”com.xbzc.phr.dao.CdaHibernateSuperDAOImpl”>  

<value>${c3p0.numHelperThreads}</value>

        <property name=”sessionFactory” ref=”cdaSessionFactory” />
 

</property>

    </bean>  

</bean>

      

<!– 动态数据源 –>

   <span style=”color:#ff0000;”> <bean
id=”springTransactionManager”  

<bean color: #333333; background-color:
#ffcc00″>dynamicDataSource”color: #333333; background-color:
#ffcc00″>DynamicDataSource”>

       
class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>
 

<!– 通过key-value关联数据源 –>

        <property name=”sessionFactory” ref=”phrSessionFactory” />
 

<property name=”targetDataSources”>

    </bean>  

<map>

    <!– 布告安顿–>  

<entry value-ref=”dataSourceWrite”key=”dataSourceWrite”></entry>

    <tx:advice id=”txAdvice”  

<entry value-ref=”dataSourceRead”key=”dataSourceRead”></entry>

        transaction-manager=”springTransactionManager”>  

</map>

        <tx:attributes>  

</property>

            <tx:method name=”save*” propagation=”REQUIRED”
rollback-for=”DaoException”/>  

<property name=”defaultTargetDataSource”ref=”dataSourceWrite”/>

        </tx:attributes>  

</bean>

    </tx:advice>   

<!– 设置sessionFactory
–>

  

<bean

    <!– 事务切面配置 ,配置加入业务的类–>  

>

    <aop:config>  

<!– 信赖注入数据源,注入正是上文定义的dataSource –>

        <aop:pointcut id=”point”  

<property name=”dataSource”ref=”dynamicDataSource”/>

            expression=” execution(*
com.xbzc.phr.service.um.UserManageSrv.*(..))” />  

<property
name=”packagesToScan”value=”com.eb3.ddt.pojo,com.eb3.loan.pojo”/>

        <!– 钦赐使用jta事务的类、方法 –>  

<!–定义Hibernate的SessionFactory的属性 –>

        <aop:advisor advice-ref=”txAdvice” pointcut-ref=”point” />
 

<property name=”hibernateProperties”>

    </aop:config>   

<props>

  

<!– 钦赐Hibernate的连接方言–>

</span></beans>  

<prop key=”hibernate.dialect”>

 

${hibernate.dialect}

上面是小编的配置文件,首借使革命的代码, rollback-for=”DaoException”  
 很要紧,这里笔者内定的要回滚的十分是本人的自定义格外DaoException,因而在程序中,假若抛出了未被擒获的该非常,则事务回滚,参见上边代码:

</prop>

[java]  

<prop
key=”hibernate.connection.autocommit”>${hibernate.connection.autocommit}</prop>

public RPCMessage saveUser(TUmUserDTO entity)<span
style=”color:#ff0000;”> throws DaoException </span>{  

<!– 制定Hibernate是或不是打字与印刷SQL语句 –>

  

<prop
key=”hibernate.show_sql”>${hibernate.show_sql}</prop>

        log.info(“服务层操作:增添从业者 saveUser (TUmUserDTO [” +
entity + “])”);  

<prop
key=”hibernate.format_sql”>${hibernate.format_sql}</prop>

  

<!– 设create(运营创制),create-drop(运转创立,退出删除),update(运维更新),validate(运营验证) –>

        try {  

<prop
key=”hibernate.hbm2ddl.auto”>${hibernate.hbm2ddl.auto}</prop>

            if (entity == null) {  

<prop key=”connection.characterEncoding”>utf-8</prop>

                throw new ServiceException(  

<!– 设置二级缓存 –>

                        ServiceException.ERRORCODE_PARAM_NULL);  

<prop
key=”hibernate.cache.user_query_cache”>${hibernate.cache.user_query_cache}</prop>

            }  

<prop
key=”hibernate.user_second_level_cache”>${hibernate.user_second_level_cache}</prop>

设若rollback-for=”ServiceException”  
 ,不过程序中catch住了该极其,则事务不回滚,因为这个被生吞了,事务已经被提交了,参见下边代码:

<prop
key=”hibernate.cache.provider_class”>${hibernate.cache.class}</prop>

[java]  

<prop
key=”hibernate.cache.provider_configuration_file_resource_path”>${hibernate.ehcache_config_file}</prop>

log.debug(“服务层操作:从业者剧中人物编辑完结”);  

</props>

  

</property>

        return this.getRPCMessage();  

</bean>

    }catch (<span style=”color:#ff0000;”>ServiceException
</span>e){  

<!– 事务管理器配置,单数据源事务 –>

        return this.getRPCMessage(e);  

<bean >

    }  

<property name=”sessionFactory”ref=”sessionFactory”/>

 

</bean>

只要rollback-for=”Exception”  
,则属于Exception以及Exception包蕴的那一个都会事务回滚,这里因为DaoException,瑟维斯Exception都以继续自Exception,由此也会回滚。

<tx:advice transaction-manager=”transactionManager”>

 

<tx:attributes>

配置中的:expression=” execution(*
com.xbzc.phr.service.um.UserManageSrv.*(..))” />
 的效果与利益是,事务回滚时,对怎么类中的方法起效果 。

<tx:method
name=”save*”propagation=”REQUIRED”rollback-for=”Exception”/>

比如未有安顿rollback-for=” ”
 则默许只回滚未被破获的运作时特别引起的操作。

<tx:method
name=”add*”propagation=”REQUIRED”rollback-for=”Exception”/>

] ?xml version=1.0 encoding=UTF-8? beans
xmlns=
xmlns:xsi=
xmlns:aop=…

<tx:method
name=”delete*”propagation=”REQUIRED”rollback-for=”Exception”/>

<tx:method
name=”update*”propagation=”REQUIRED”rollback-for=”Exception”/>

<tx:method
name=”merge*”isolation=”READ_COMMITTED”propagation=”REQUIRED”rollback-for=”Exception”/>

<tx:method name=”get*”read-only=”true”/>

<tx:method name=”find*”read-only=”true”/>

<tx:method name=”list*”read-only=”true”/>

<tx:method name=”select*”read-only=”true”/>

<tx:method name=”*”propagation=”REQUIRED”/>

</tx:attributes>

</tx:advice>

<aop:config>

<aop:pointcut expression=”execution(* com.eb3.*.service.*.*”/>

<aop:advisor
advice-ref=”txAdvice”pointcut-ref=”interceptorPointCuts”/>

</aop:config>

<aop:aspectj-autoproxy proxy-target-/>

<!– 沙漏配置 task:scheduler@pool-size调整线程池的轻重缓急,调整线程在被调节职责到位前不会没事
task:executor/@pool-size:能够内定推行线程池的发端大小、最大尺寸

task:executor/@queue-capacity:等待推行的职责队列的体量 task:executor/@rejection-policy:当等待队已满时的国策,分为舍弃、由义务实践器直接运维等格局

@Async 异步职务时 task职责实践线程数 task:scheduler 和 task:executor 多个线程池同样起成效 未有异步声明时

task任务实践线程数只受task:scheduler的线程池大小影响 –>

<!– 声贝拉米个有着十个线程的池,每贰个对象将获得同样的运营机会–>

<task:scheduler pool-size=”10″/>

<task:executor keep-alive=”3600″pool-size=”100-300″
queue-capacity=”500″rejection-policy=”CALLER_RUNS”/>

<task:annotation-driven executor=”executor”scheduler=”scheduler”/>

</beans>

三、承接AbstractRoutingDataSource类的动态数据源类DynamicDataSource

packagecom.eb3.ddt;

importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

publicclassDynamicDataSource extendsAbstractRoutingDataSource {

/**

* 重写determineCurrentLookupKey方法

*/

@Override

protectedObject determineCurrentLookupKey() {

Object obj = DBHelper.getDbType();

returnobj;

}

}

四、DBHelper工具类

packagecom.eb3.ddt;

importorg.apache.commons.lang.StringUtils;

publicclassDBHelper {

privatestaticThreadLocal<String> dbContext =
newThreadLocal<String>();

// 写数据源标记

publicfinalstaticString DB_WRITE = “dataSourceWrite”;

// 读数据源标记

publicfinalstaticString DB_READ = “dataSourceRead”;

/**

* 获取数据源类型,便是写数据源,依然读数据源

*

* @return

*/

publicstaticString getDbType() {

String db_type = dbContext.get();

if(StringUtils.isEmpty {

// 私下认可是写数据源

db_type = DB_WRITE;

}

returndb_type;

}

/**

* 设置该线程的数量源类型

*

* @paramstr

*/

publicstaticvoidsetDbType(String str) {

dbContext.set;

}

}

五、服务层调用

/*@Aspect 此评释会影响数据源切换,运转代码得知不加的话会先实行DynamicDataSource里的determineCurrentLookupKey方法,后进行Service层里DBHelper.setDbType()方法,导致数据源切换失利!*/

@Aspect

@Component(“userService”)publicclassUserServiceImpl
extendsBaseServiceImpl<User, User, Integer> implementsUserService
{

@Resource

privateUserDao userDao;

@Override

protectedBaseDao<User, Integer> getDao() {

returnthis.userDao;

}

@Override

publicvoidsave(User user) {

DBHelper.setDbType(DBHelper.DB_W大切诺基ITE);
// 写库(向数据库中写)

this.userDao.save;

}

@Override

publicUser findByUserName(String username) {

DBHelper.setDbType(DBHelper.DB_READ);
// 读库(从数据库中向外读)

List<User> userList = this.userDao.findBy(“username”, username);

returnCollectionUtils.isNotEmpty ? userList.get : null;

}

}

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website