在Spring下配置多数据源
最近在使用hibernate框架的时候遇见问题:我前台需要json格式的字符创,而根据hibernate的ROM映射的规律,在SQL执行完了以后返回的是List<Object[]>,很遗憾,不能直接转换成json格式的数据,这样就增加了开发工作量,而且在java的代码层我们在将List<Object[]>转换成List<Map<String,object>>类型的时候也增加服务的负担,或多或少的影响到了系统的性能。这是我要配置多数据源的原因之一。(对于复杂的SQL查询不能进行ROM映射的,hibernate返回不了列名)
原因二:说起使用spring其实本身我一开对spring不怎么感冒,由于工作流使用了hibernate,为了干掉其中的懒加载机制,才在项目中添加了spring,(具体技术实现就不说了,比较繁琐,工作流是我从工作至今感觉到项目里面用的技术的逻辑最复杂的一个,也是投入时间精力最多的一次技术研究。)。
为了实现查询能直接返回json,我在这里使用了spring提供的JdbcTemplate,然后为了保证工作流的正常同时在spring 上下文中配置了:hibernateTempalte
具体说配置过程,正常配置数据源和hibernateTemplate,application.xml文件代码如下:
1、配置hibernate的session工厂:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource1_hibernate"/>
</property>
<property name="mappingLocations">
<list>
<!-- load jbpm beans files -->
<!--
<value>classpath:jbpm.execution.hbm.xml</value>
<value>classpath:jbpm.history.hbm.xml</value>
<value>classpath:jbpm.identity.hbm.xml</value>
<value>classpath:jbpm.repository.hbm.xml</value>
<value>classpath:jbpm.task.hbm.xml</value>
-->
<!-- actomatic scan your define of bussiness beans
<value>classpath:com/kaide/workflow/bean/*/*.hbm.xml</value>
-->
</list>
</property>
<property name="packagesToScan">
<value>com.kaide.bean</value>
</property>
<!-- hibernate properties -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
</props>
</property>
</bean>
2、配置hibernateTemplate:
<!-- Hibernate Template -->
<bean id="ht" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
3、接下来开始配置JdbcTemplate:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"><ref bean="dataSource1_hibernate"/></property>
</bean>
就这么简单,到此就完成双数据源的配置工作!!!!
这里选用的是spring3的版本,使用了注解,完成了整个框架的搭建工作,可以说很大程度上提高了开发效率。
接下来说关于在HibernateBaseDao和JdbcBaseDao中对于JdbcTemplate、hibernateTemplate的调用:
这里不得不说注解注入的强大,省去很多在实体类中的工作:
4、在HibernateBaseDao中使用HibernateTemplate:
根据上边的上下文配置文件:
/**
*
* @deprecated baseDao:DAO层基本数据类
*
* @author ywp
* @date 2013/12/01 21:55;
*
*/
@Scope("prototype")
@Repository
public class HibernateBaseDao extends OpenSessionInViewFilter{
@Autowired
private HibernateTemplate ht;
private String reString;
/**
* get sessionFactory
*/
protected SessionFactory getSessionFactory() {
return ht.getSessionFactory();
}
/**
* get session
*/
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.COMMIT);
return session;
}
/**
* close session
*/
protected void closeSession(Session session, SessionFactory factory) {
session.flush();
super.closeSession(session, factory);
}
5、在JdbcBaseDao中使用JdbcTemplate:@Scope("prototype")
@Repository
public class JdbcBaseDao {
/**
* 注入spring JdbcTemplate;
*/
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 使用SQL查询,返回的是符合封装成json格式的list<Map<String,Object>>
*/
public List<Map<String,Object>> querySqlToMap(String sql){
return jdbcTemplate.queryForList(sql);
}
这里就不往下写了,只要会用JDBC,你懂得到此就完成了spring下对于多数据源的配置使用的是proxool连接池。
PS:杜大坑应了你的要求哈~
最后:
感谢群里的小伙伴们,感谢你们遇见问题帮我顶帖子,虽然没起作用,最后还是我自己解决的,嘿嘿...
杜大坑、家敏(66)、(2Y、2票)你俩真心2、小妖、迷雾、水杯(捡起来节操哦)、琪琪大妈、旋律、地瓜、小P、小姑娘、double半夏(说的就是你俩!)、香油(谢啦,m3)、绿乌龟(嘿嘿)、小凡、胡阿尤、蛋蛋、不要放弃治疗的猴子、小毛球(战斗力只有0.5的渣渣)、麒麟、水军总督、城管、从小贼帅(说好的dota局呢?)、亡灵、婆婆(破破)、晓梦、小设、小白兔白又白,两边赶紧(你们懂得)...
就不一一点名了。排名就是分的先后顺序,怎么着...
有你们在才不至于在codeing太枯燥;谢谢你们的一路陪伴...
祝大家新的一年:
早日升值,最少PM;早日逆袭女神;年底红包大大有,BOSS最少给1...0W....
工作顺利,万事如意!
自由
2014/01/09 22:58