jdbctemplate手动提交事务(Hibernate 与 Spring的JDBCTemplate,效率分别怎样,那个高一些)

本文目录
- Hibernate 与 Spring的JDBCTemplate,效率分别怎样,那个高一些
- jdbctemplate不会加入事务
- 请问DAO层采用JdbcTemplate操作数据,如何在Service层控制事务
- 如何解决jpaTemplate和jdbcTemplate 共享一个事务处理
Hibernate 与 Spring的JDBCTemplate,效率分别怎样,那个高一些
现在许多项目都采用hibernateTemplate和JDBCTemplate混用的方式
HibernateTemplate一般是为了加快开发效率,还有就是使用Hibernate的时候,更简洁,更便利,而统一的声明事务,又让本来就已经很简洁的Hibernate对事务的处理,大大简化
但任何事务都有两面性,在带来大量便捷的同时,Hibernate也给我们留下了一点小小的遗憾,比如众所周知的,在处理大批量数据查询的时候,Hibernate的查询效率,是不尽人意的,有人做过测试,在高并发查询的时候,hibernate的查询效率,仅仅相当于使用jdbc效率7成左右,这对于对速度有着很高要求的互联网应用来说,不能不说是悲剧。
Hibernate在做批量操作时,效率不是很理想。所以现在采用JDBCTemplate和Hibernate混用,这时有几个注意事项.
1.如果采用JDBCTemplate的部分只涉及到查询,则可以使用Hibernate的应用缓存,即二级缓存。
2.如果采用JDBCTemplate的部分涉及到对数据库的更新操作,即增,删,改.则不能开启Hibernate的二级缓存,如果系统有缓存的需要,我觉得可以自己在逻辑层实现缓存.Java的缓存方案还是很多的。
3.在使用Spring做为容器的系统中,混用JDBCTemplate和Hibernate,事务管理请统一使用HibernateTransactionManager,前提是JDBCTemplate和Hibernate共用一个DataSource.
jdbctemplate不会加入事务
是的。
jdbcTemplate是不能支持事务的。
JDBCTemplate是Spring框架提供的对JDBC封装对象,目的是简化JDBC开发,是因为传统JDBC代码有着大量的重复。
请问DAO层采用JdbcTemplate操作数据,如何在Service层控制事务
Service层调用DAO层方法。
由于一个Service方法可能需要调用多个DAO对象的方法,需要在Service层进行事务控制。
由于一些原因,需要采用编程式事务(现使用TransactionTemplate)。
可是存在一个问题:
只有当创建TransactionTemplate对象的DataSourceTransactionManager使用的DataSource对象和DAO对象创建JdbcTemplate对象使用的DataSource是同一个对象时才能在transactionTemplate.execute()方法中控制事务。暂时想到如下设计:
1. BasicDao类
所有DAO的父类,提供静态变量DataSource用于为所有的DAO类创建JdbcTemplate对象。
同时提供DataSource的get方法,用于在Service方法中创建DataSourceTransactionManager对象。
public class BasicDao { private static DataSource dataSource; protected JdbcTemplate jdbc; static { dataSource = new MyDataSource(); } public BasicDao() { jdbc = new JdbcTemplate(dataSource); } //....getters and setters } 2. DAO类
继承自BasicDao类,完成数据库操作。
3. Service类
调用DAO类的方法,完成业务。
DataSource dataSource = BasicDao.getDataSource(); DataSourceTransactionManager txManager = new DataSourceTransactionManager(dataSource); TransactionTemplate txTemplate = new TransactionTemplate(txManager ); final Dao1 dao1= new Dao1(); final Dao2 dao2= new Dao2(); transactionTemplate.execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { dao1.function1(); dao2.function2(); //.... return null; } }); 暂时只能这样来实现,请问各位有什么更好的实现吗?不要使用Spring的IOC容器和声明式事务。
以上面的Service方法为例吧:
1.在ProxyClass中进行事务的控制,将DataSource保存到ThreadLocal。
2.在ProxyClass中调用代理的具体Service类的service方法。
3.Service类的service方法只完成具体的业务dao方法调用。
4.Dao类的DataSource对象从ThreadLoacl中取得。
public class ProxyClass { public static final ThreadLocal threadLocal = new ThreadLocal(); private DataSourceTransactionManager txManager; private TransactionTemplate txTemplate; TargetService target; //代理的具体的目标服务对象 public ProxyClass() { DataSource dataSource = new MyDataSource(); txManager = new DataSourceTransactionManager(dataSource); txTemplate = new TransactionTemplate(txManager ); threadLocal.set(dataSource); } public void service() { transactionTemplate.execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { target.service(); //调用具体服务方法 } }); } //...... } 问题补充:finallygo 写道不对的,你的代码编译可以通过吗?
如果是直接使用JDBC进行操作的话,在ThreadLocal应该存储Connection。
如何解决jpaTemplate和jdbcTemplate 共享一个事务处理
1.xml
xml version="1.0" encoding="UTF-8"?》
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
《bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"》
《!-- property name="proxyTargetClass" value="true"》《/property --》
《/bean》
《bean id="railWeightEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"》
《property name="persistenceUnitName" value="railWeightEntityManager" /》
《property name="jpaProperties"》
《props》《/props》
《/property》
《/bean》
《bean id="railWeightTransactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager"》
《property name="entityManagerFactory" ref="railWeightEntityManagerFactory" /》
《/bean》
《bean id="railWeightTransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"》
《property name="transactionManager" ref="railWeightTransactionManager" /》
《property name="transactionAttributeSource"》
《bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" /》
《/property》
《/bean》
《bean id="railWeightTransactionAttributeSourceAdvisor"
class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"》
《property name="transactionInterceptor" ref="railWeightTransactionInterceptor" /》
《/bean》
《/beans》
《?xml version="1.0" encoding="UTF-8"?》
***隐藏网址***
《persistence-unit name="railWeightEntityManager" transaction-type="RESOURCE_LOCAL"》
《!-- provider》org.hibernate.ejb.HibernatePersistence《/provider--》
《!-- jta-data-source》java:comp/env/jdbc/opendb《/jta-data-source--》
《properties》
《property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" /》
《property name="hibernate.max_fetch_depth" value="3" /》
《property name="hibernate.show_sql" value="true" /》
《property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2Driver" /》
《property name="hibernate.connection.url" value="jdbc:db2://10.1.1.21:50001/matDev" /》
《property name="hibernate.connection.username" value="db2inst1" /》
《property name="hibernate.connection.password" value="admin" /》
《/properties》
《/persistence-unit》
《/persistence》
要使用jdbctemplate 必须要依赖datasource 如何配置可以解决使得jpaTemplate和jdbcTemplate 共享一个事务处理

本文相关文章:
sql2000怎么新建查询(sql server 新建查询功能怎么实现)
2026年10月5日 14:10
local是什么文件夹(C:\Users\hp\AppData\Local这文件夹是做什么用的)
2026年10月3日 21:50
undergraduate怎么读(这3个英语yawn ;undergraduate; teenager ;怎么读的)
2026年10月2日 03:30
microsoft silverlight v3(Microsoft Silverlight安装失败)
2026年9月28日 22:50
mousewithoutborders(mouse without borders在win7不能启动)
2026年9月19日 14:10
sql server2008支持什么系统(sql server 2008 都可以安装在什么操作系统中)
2026年9月5日 23:10
assertequals断言的使用(python断言assertequals是什么意思)
2026年9月4日 09:30
更多文章:
teammate(teammate,company,partner)
2026年10月11日 06:10
javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)
2026年10月11日 04:00
text函数公式(excel中round和text函数的区别是什么)
2026年10月11日 03:50
google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)
2026年10月11日 02:00
websocket整合springboot(Springboot整合Websocket遇到的坑)
2026年10月11日 01:40
drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)
2026年10月10日 19:20
xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)
2026年10月10日 17:50
perl数组中最多的元素(用perl实现,得到一个数组中重复次数最多的元素)
2026年10月10日 17:00

