- 浏览: 421767 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (318)
- js (20)
- JQuery (2)
- Java (46)
- Oracle (4)
- mysql (21)
- ExtJs (17)
- Excel (2)
- Linux (8)
- Sql (8)
- Jsp (2)
- hibernate (12)
- jbpm (17)
- eclipse (8)
- 名博收藏 (1)
- Junit (2)
- 应用集成 (3)
- web (10)
- jboss (3)
- Rest (3)
- 其它 (7)
- 磁盘分区管理 (1)
- spring (18)
- SSO (4)
- tomcat (4)
- CSS (7)
- MemCached (6)
- EhCache (4)
- weblogic (1)
- apache (6)
- Exception design (1)
- db (1)
- 分析模式 (1)
- jstl (1)
- jsf (0)
- firefox (2)
- MongoDB (4)
- androidpn (1)
- hadoop (1)
- cvs (1)
- 微信公众号 (2)
- 高并发 (4)
- 技术论坛 (1)
- CDN (1)
- JVM (16)
- 加密 (4)
- maven (2)
- jenkins (1)
- hessian (1)
- 大数据处理 (2)
- NIO (0)
- netty (1)
- redis (1)
- git (1)
- Elastic Job (0)
最新评论
-
zgw06629:
或者<pre>aaaabbbbcccc</p ...
javaDoc注释换行 -
ddnzero:
...
StringBuffer换行 -
maosijun:
。。。。
EXT CExt.form.ComboBox选择一次后只剩一个选项 -
ysa198584:
你这有问题,当我的代码出现User.class的时候,反编绎的 ...
java的class文件批量反编译 -
dongj0325:
看到您的博客,很受启发,但还有关于jbpm4.4 timer使 ...
JBPM定时器(Timer)之Repeat属性不能使用变量
{
super.setUp();
context = new FileSystemXmlApplicationContext(springConfigFile);
if (bHoldSession)
{
sessionFactory = (SessionFactory) context.getBean("sessionFactory");
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
}
}
public abstract class TransactionSynchronizationManager
{
……
private static final ThreadLocal currentTransactionName = new ThreadLocal();
private static final ThreadLocal currentTransactionReadOnly = new ThreadLocal();
private static final ThreadLocal actualTransactionActive = new ThreadLocal(); ……
}
再看看方法SessionHolder的理解
先看一段代码:
Connection conn = Conn.getConnection();
conn.setAutoCommit(false);
……..
……...
conn.rollback();
conn.commit();
数据库的事务是针对 Connection 的。
接着再看一段代码:( spring 中事务的一段学习代码,这段代码是把 spring 和 hibernate 结合在一起的,增加了理解上的难度,因为我的出发点一开始不要 hibernate ,就光用 jdbc 来进行数据库事务,但是没有其他好的代码,就这样吧)
public Long addLineItem(Long orderId, LineItem lineItem){
log("OrderListDAOHibernate.addLineItem : Start...");
OrderList orderList = (OrderList) getHibernateTemplate().load(OrderList.class, orderId);
lineItem.setOrderList(orderList);
getHibernateTemplate().saveOrUpdate(lineItem);
getHibernateTemplate().saveOrUpdate(orderList);
log("OrderListDAOHibernate.addLineItem : Ending...");
return lineItem.getId();
}
在这个代码的配置文件中,把 addLineItem 做为一个切入点,进行事务,也就是说,在 addLineItem 的外面,再包上一层事务的外壳。
但是这个时候,问题出来了,事务是针对 Connection 的,而上面的两个连续的 HibernateTemplate 执行的 saveOrUpdate 中的 Connection 必须是一致才能用事务, spring 怎么做到这一点的呢?(这个问题也就是在找 spring 的事务例子前,我想的 spring 中用 jdbc 来进行事务,怎么样让 Connection 保持一致呢?但是没有 jdbc 的例子,只有整合 hibernate 或者 ibatis 的例子,但是,我想,原理是一样的吧。)
解决问题的思路: HibernateTemplate 中的 Connection 必定一致。那么就从 HibernateTemplate 入手。
看 spring 的源代码,既然是 Hibernate ,那么,就没有 Connection 给你看,只有 Session ,由 Session 来管理 Connection ,那么用事务来控制的话,这个 Session 必定在所有该事务中是一致的。于是在 HibernateTemplate 中找到:
protected Session getSession() {
if (isAlwaysUseNewSession()) {
return SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor());
}
else if (!isAllowCreate()) {
return SessionFactoryUtils.getSession(getSessionFactory(), false);
}
else {
return SessionFactoryUtils.getSession(
getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
}
}
看来在 SessionFactoryUtils 里面,接着在 SessionFactoryUtils.getSession 中找:
这个方法太长了,太复杂了,从简,发现了非常关键的一点:
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
假如 sessionHolder 不等于空,说明,在事务中有这样一个还没有 commit 的 session ,那么就返回这个 session ,假如等于空,新建一个 session ,并且在事务里加入这个 session 。这段代码的意思大概是这样,太繁杂了,只能猜,也肯定是如此。
再看 getHibernateTemplate() 方法来自继承 HibernateDaoSupport ,看了电子书《 spring-reference 》的第九章“ Dao 支持”, Dao 的支持类可以有好多,如: JdbcDaoSupport , HibernateDaoSupport , JdoDaoSupport 等等。
既然前面一开始就是从 jdbc 的 spring 事务控制引起的,那么看到了同样的 HibernateDaoSupport---JdbcDaoSupport ,那么 JdbcDaoSupport 也应该有 getJdbcTemplate() 这个方法,并且返回 JdbcTemplate 这个类。
果然如此。
于是剖析 JdbcTemplate 是不是和 HibernateTemplate 一样。果然一样。
注意到:
Connection con = DataSourceUtils.getConnection(getDataSource());
Connection 是从 DataSourceUtils.getConnection() 来的,继续跟踪 DataSourceUtils.getConnection() 。
找到:
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
和 Hibernate 中的一模一样,因为没有了 session 的封装,条理在 jdbc 中更加清晰了。
发表评论
-
Spring Security认识
2015-07-28 15:29 589先来谈一谈Acegi的基础知识,Acegi的架构比较复杂,但 ... -
acegi第一个实例
2015-07-28 14:30 385目前acegi(Spring Security)主要是针对简 ... -
Acegi (Spring Security)入门
2015-07-28 13:25 936一、Acegi Security 介绍 1 ... -
Spring JMS MessageListener实现类不能参与事务拦截
2015-06-04 11:29 1372Spring JMS MessageListener实现类不 ... -
spring配置定时器的时间设置
2014-01-10 16:26 543转自:http://blog.csdn.net/zhaoz ... -
Spring跨库事务JOTM
2012-08-18 22:16 660http://sprone.iteye.com/blog/89 ... -
spring+hibernate+jotm分布式事务配置总结
2012-03-10 17:44 869在前段开拓的体系 中 ... -
用Spring集成的JOTM配置分布式事务
2012-03-10 17:38 1227【藏自】http://boy00fly.iteye.com ... -
spring分布式事务实现
2012-03-10 17:27 1069藏自:http://log-cd.iteye.com/blog ... -
Spring声明式事务管理源码解读之事务提交
2012-03-04 22:43 763其实我的感觉就是事务提交要比事务开始复杂,看事务是否提交我们还 ... -
主题:解惑:在spring+hibernate中,只读事务是如何被优化的。
2011-08-28 11:00 1247出自:http://www.iteye.com/topic/9 ... -
【收藏】Spring TransactionManager和hibernate吐血经验谈
2011-08-22 20:45 1015http://lsk.iteye.com/blog/17879 ... -
【收藏】Spring事务王国架构
2011-08-20 10:12 645http://book.51cto.com/art/20090 ... -
【收藏】主题:解惑 spring 嵌套事务
2011-08-18 23:08 697http://www.iteye.com/topic/3590 ... -
主题:Spring源码浅析 -- XML配置文件的载入与解析
2011-07-31 11:06 1073原文:http://www.iteye.com/topic/7 ... -
主题:Spring源代码解析(一):IOC容器
2011-07-31 08:45 776以下内容引自博客:http://jiwenke-spring. ... -
Spring MVC中的IoC容器初始化
2011-06-30 10:16 822http://blog.csdn.net/prince2270 ...
相关推荐
### Spring Boot多数据源配置详解 #### 一、多数据源背景及应用场景 在实际的Spring Boot项目开发过程中,通常我们会为项目配置一个...希望本文能帮助开发者们更好地理解和掌握Spring Boot多数据源配置的相关知识。
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); if ((!switchDb || !(dataSource instanceof AbstractRoutingDataSource)) && (conHolder != null...
Spring提供了TransactionSynchronization接口和TransactionSynchronizationManager类来支持事务的同步处理。 - **TransactionSynchronization接口**:定义了事务开始、提交、回滚、完成时需要执行的方法,如...
11. **事务同步**:Spring的TransactionSynchronization接口和TransactionSynchronizationManager类允许开发者在事务的生命周期中插入自定义的行为,如清理资源或执行后置处理。 12. **Spring Boot中的事务管理**:...
DataSource 数据源对象和 jfinal 的配置类 com.jfinal.plugin.activerecord.Config和 spring事务相关的 DataSourceUtils.getConnection、ConnectionHolder、TransactionSynchronizationManager.getResource 类和方法...
首先,我们需要理解什么是多数据源。在Java应用中,数据源(DataSource)是用于存储数据库连接信息的对象,多数据源意味着系统中存在两个或更多的数据源,每个数据源对应一个独立的数据库。在Spring Boot中,我们...
判断当前方法是否处于Spring事务的关键在于`TransactionSynchronizationManager.isSynchronizationActive()`,这个方法返回true表示当前存在Spring事务,可以根据事务的readOnly属性决定数据源。 iBatis的`...
Spring框架也支持使用ThreadLocal进行事务管理,比如使用`TransactionSynchronizationManager`类,它可以管理和协调事务同步,提供更高级别的事务控制。 通过上述方式,开发者可以利用ThreadLocal在Java Web环境中...
视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 1、课程简介 Spring框架是一系列应用框架的核心,也可以说是整合其他应用框架的基座。...n 源码分析-TransactionSynchronizationManager
例如,Spring框架中的TransactionSynchronizationManager、RequestContextHolder、AopContext、LocaleContextHolder等都是利用ThreadLocal来保证线程安全。 在多层架构的应用中,例如从请求接入到响应返回,整个...
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(hibernateSession)); ``` 然后,在类中加入以下两个私有函数: ```java private SessionFactory lookupSessionFactory...
例如,RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder 等 Bean 都使用 ThreadLocal 来处理非线程安全的状态。 线程安全问题通常是由全局变量及静态变量引起的。若每个线程中对全局...
All Classes AbstractAdvisorAutoProxyCreator AbstractApplicationContext AbstractApplicationEventMulticaster AbstractAspectJAdvice AbstractAspectJAdvisorFactory AbstractAspectJAdvisorFactory....
TransactionStatus status = TransactionSynchronizationManager.getCurrentTransactionStatus(); if (status != null) { return status.getTransaction().toString(); // 假设事务ID可以区分数据源 } return ...