SpringMVC hibernate增加多数据源
(以类SSHE/SYPRO增加多数据源为例作说明)
注:适用与SpringMVC + Hibernate的项目。其它框架的仅仅能说作參考用
配置Spring
新建一个Spring的数据源配置文件,如spring-hibernate-aite.xml
怎么新建文件就不说了
新建的Spring的数据源配置文件的内容:
内容能够先将原有的spring-hibernate.xml全然copy过来,然后做对应改动
A.dataSource的对应改动
<!-- 配置数据源 ①bean的name属性,原来是dataSource 如今改成DataSourceAite --> <bean name="dataSourceAite" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc_url_aite}" /> <property name="username" value="${jdbc_username_aite}" /> <property name="password" value="${jdbc_password_aite}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="0" /> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="20" /> <!-- 连接池最大空暇 --> <property name="maxIdle" value="20" /> <!-- 连接池最小空暇 --> <property name="minIdle" value="0" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="60000" /> <property name="validationQuery" value="${validationQuery}" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="testWhileIdle" value="true" /> <!-- 配置间隔多久才进行一次检測,检測须要关闭的空暇连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间。单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="25200000" /> <!-- 打开removeAbandoned功能 --> <property name="removeAbandoned" value="true" /> <!-- 1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="1800" /> <!-- 关闭abanded连接时输出错误日志 --> <property name="logAbandoned" value="true" /> <!-- 监控数据库 --> <!-- <property name="filters" value="stat" /> --> <property name="filters" value="mergeStat" /> </bean>
<!-- 配置hibernate session工厂。 ①bean的id属性,原来的id是sessionFactory 如今改成sessionFactoryAite; ②dataSource的ref,原来是dataSource 如今改成上边配好新 数据源名字dataSourceAite --> <bean id="sessionFactoryAite" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSourceAite" /> <property name="hibernateProperties"> <props> <prop key="hibernate.hbm2ddl.auto">none</prop> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> </props> </property> <!-- 自己主动扫描注解方式配置的hibernate类文件 --> <property name="packagesToScan"> <list> <value>sy.*.model</value> </list> </property> </bean>
C.事物管理器的对应更改
<!-- <span style="white-space:pre"> </span>配置事务管理器 <span style="white-space:pre"> </span>①bean的name属性,原来是transactionManager 如今改成transactionManagerAite <span style="white-space:pre"> </span>②sessionFactory的ref,原来是sessionFactory 如今改成上边配好的新名字sessionFactoryAite <span style="white-space:pre"> </span>--> <span style="white-space:pre"> </span><bean name="transactionManagerAite" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <span style="white-space:pre"> </span><property name="sessionFactory" ref="sessionFactoryAite"></property> <span style="white-space:pre"> </span></bean>
<!-- 拦截器方式配置事物 ①用上边新创建的事物管理器来管理事物规则,原来id是transactionAdvice 如今改成transactionAdviceAite ②改动id。原来id是 transactionAdvice 如今改成 transactionAdviceAite --> <tx:advice id="transactionAdviceAite" transaction-manager="transactionManagerAite"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="append*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="edit*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="repair" propagation="REQUIRED" /> <tx:method name="delAndRepair" propagation="REQUIRED" /> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="load*" propagation="REQUIRED" read-only="true" /> <tx:method name="search*" propagation="REQUIRED" read-only="true" /> <tx:method name="datagrid*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" propagation="REQUIRED" read-only="true" /> </tx:attributes> </tx:advice>
E.Spring切面配置的对应更改
<!-- 将新的规则增加Spring的aop ①改动advice-ref,原来是transactionAdvice 先改成上边新名字transactionAdviceAite --> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* sy.*.service..*Impl.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdviceAite" /> </aop:config>
保存文件
到这儿,Spring要做的配置基本完事儿了
改动web.xml
要使新建的数据源配置文件spring-hibernate-aite.xml生效,须要在web.xml里边将增加classpath中
<context-param> <param-name>contextConfigLocation</param-name> <!-- 增加classpath:spring-hibernate-aite.xml --> <param-value>classpath:spring.xml,classpath:spring-hibernate.xml,classpath:spring-hibernate-aite.xml</param-value> </context-param>
保存文件
这个时候。能够启动执行一下项目,看看是否报错,在做下一步操作
新建dao使用新增的一个数据源
有几个dao就有几个数据源
新建daoI
这里能够直接将原来的sy.dao.BaseDaoI.java复制一个到同一包文件夹下,重命名为sy.dao.AiteBaseDaoI.java
新建daoImpl
这里能够直接将原来的sy.dao.impl.BaseDaoImpl.java复制一个到同一包文件夹下。重命名为sy.dao.AiteBaseDaoImpl.java
然后做一些小调整:
/**Repository原来是baseDao 这里改动成aiteBaseDao**/ @Repository("aiteBaseDao") public class AiteBaseDaoImpl<T> implements AiteBaseDaoI<T> { private static final Logger logger=Logger.getLogger(AiteBaseDaoImpl.class); /**sessionFactory名字原来是sessionFactory 如今改动成sessionFactoryAite**/ private SessionFactory sessionFactoryAite; public SessionFactory getSessionFactoryAite() { return sessionFactoryAite; } @Autowired public void setAiteSessionFactory(SessionFactory sessionFactoryAite) { this.sessionFactoryAite = sessionFactoryAite; } private Session getCurrentSession() { return this.sessionFactoryAite.getCurrentSession(); }
其它地方都不用改动
dao层写好了之后。能够启动执行下项目,看看有没有异常,没有异常则继续下一步操作
service层的调用
@Service("taskService") public class TaskServiceImpl implements TaskServiceI { /** 这里用新数据源的Dao就好了。其它的都和原来一致 **/ private AiteBaseDaoI<Ttask> tdao; public AiteBaseDaoI<Ttask> getTdao() { return tdao; } @Autowired public void setTdao(AiteBaseDaoI<Ttask> tdao) { this.tdao = tdao; }
到这里,从配置到使用都完毕了,接下来就来完毕你的应用吧