问题现象:
第一个用户投票不成功后,换第二个用户登录,然后投票,投票成功,投票数加1(由14票,变更为15票)。这时刷新页面发现投票数为未投票前的数(14票),再刷新又为更新后的值(15票),不停的刷新,投票数会在新旧值(14与15)之间交替出现。
查看数据库中的表,值是最新的15票。
通过跟踪程序发现,当投票不成功时事务没有正常关闭。代码如下:
TransactionStatus status = [color=Red]beginTransaction();[/color]
try {
if (list != null) {
for (int i = 0; i < list.size(); i++) {
if (((JczdTpWt) list.get(i)).getNRybh() == userid) {
return "fail";<!-- [color=Red]问题就在这 事务没有正常关闭就退出了[/color]。-->
}
}
}
JczdDa jczdDa = dao.getDaById(daid);
jczdDa.setNTpsl(jczdDa.getNTpsl() + 1);
dao.updateDa(jczdDa);
。。。省略
[color=Red]getTransactionManager().commit(status);[/color]
session由 spring的工厂BEAN 址 org.springframework.orm.hibernate3.LocalSessionFactoryBean生成。
当事务打开的时候,会去线程的上下文LocalThread中找SessionHolder,如果没有找到就打开一个新的Session。包装好,放到LocalThread中去。
当事务关闭的时候,会把LocalThread中的对象清空,当前线程持有的Session关闭。
(spring中由TransactionSynchronizationManager维护当前线程的session 及事务信息)
如果事务没有关闭,会导致session一直在当前线程的LocalThread中。当下次请求到过中间件的时候,由于中间件有线程池,可能会从池中调用上次持有Session的线程
来处理新的请求,当Session要加载对象时,会从session级的缓存中查找,找到后就直接返回了,这时就看到原来的旧值。
使用spring的HibernateTemplate时,由于当前SESSION中存在事务,在执行完doInHibernate后并不会关闭session,由此会引起一系统的问题,比如session中缓存的对象会越来越多。
分享到:
相关推荐
如果未绑定 Session 到线程, Hibernate 将无法正确地执行数据库操作。 解决方案 解决该错误的方法很简单,只需在相应的 manager 实现类中添加 @Transactional 注解。@Transactional 注解是 Spring 框架提供的一个...
然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为重要。本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么...
在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...
在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session释放模式。本文将深入探讨Hibernate Session的几种释放模式,以及它们在实际开发中的应用和优缺点。 ...
不正确地管理Session可能导致内存泄漏和资源浪费。 在实际应用中,通常推荐使用Transaction模板或者Spring的HibernateTemplate或JpaTemplate,它们可以帮助你更好地管理Session和事务。例如,Spring的`@...
在Java的持久化框架中,Hibernate是一个非常重要的组件,它为开发者提供了强大的对象关系映射(ORM)功能,...正确地使用Session,结合事务控制、查询语言和缓存策略,可以显著提升数据库操作的效率和应用的整体性能。
了解并熟练掌握这些概念和方法,能帮助开发者更好地理解和利用Hibernate的透明持久化能力,有效地管理对象的状态和事务,从而提高应用的性能和数据一致性。对于初学者来说,阅读Hibernate的javadoc是非常有益的,...
在上述代码中,我们首先通过`SessionFactory`获取`Session`实例,然后开启事务,接着创建一个新的`User`对象并保存到数据库,最后提交事务并关闭`Session`。 在实际应用中,我们通常会将`SessionFactory`和`Session...
5. **线程安全**:`Session`不是线程安全的,因此在多线程环境中,包装类可能需要考虑如何正确管理和关闭`Session`实例,避免并发问题。 6. **简化API**:根据项目需求,包装类可以提供一些简洁的API,比如`...
hibernate中session对象的状态详解
总的来说,理解并正确使用“当前线程中的Session”是Hibernate开发中的重要一环。它可以帮助我们更高效、安全地处理数据库事务,确保数据的完整性和一致性。在实际项目中,根据应用的需求和环境选择合适的事务管理...
"重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...
关于 Hibernate 中 Session 的关闭实例解析 Hibernate 是一个流行的 Java 持久层框架,它提供了许多强大功能来管理数据库交互。Session 是 Hibernate 中的一种基本概念,它扮演着关键角色来管理数据库交互。本文将...
在开发中,使用Hibernate的`Session`和`Transaction`能够有效提升开发效率,同时确保数据操作的正确性和一致性。熟练掌握这两者,对于理解和优化Hibernate应用程序至关重要。通过不断的实践和学习,我们可以更好地...
在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...
总的来说,`Session`在Hibernate中扮演着至关重要的角色,`delete()`方法是它实现对象持久化操作的一部分,正确理解和使用这些方法对于高效地操作数据库至关重要。理解`Session`的工作原理,以及与`SessionFactory`...
- **脱管态(Detached)**:对象曾是持久态,但Session关闭后,对象与Session的关联断开,此时对象的状态可能已与数据库不同步。 **2. Hibernate的事务管理** 在Java应用中,事务处理是确保数据一致性的重要手段。...
- **`flush()`**:强制Hibernate将所有未完成的数据库操作同步到数据库,这是在事务结束前通常需要执行的操作。 - **`close()`**:关闭Session,释放所有资源,包括连接池中的数据库连接。 #### 三、高级特性 ...
如上述示例所示,开始事务、执行操作、提交事务并关闭Session。 总的来说,Hibernate的Session接口提供了一套完整的对象持久化和数据库操作机制,使得开发者能够以面向对象的方式处理数据,极大地提高了开发效率和...
通过以上介绍,我们可以看到Hibernate Session在数据库操作中的核心地位,正确理解和使用Session是掌握Hibernate的关键。实践中的具体应用需要结合项目需求,灵活运用这些知识,以实现高效、稳定的数据库访问。