如果没有将Hibernate的Session交由Spring管理,那管理session将会是一件比较麻烦的事情,刚开始学Hibernate的时候,看的视频教程多是基于javase的简单关系操作实现。后来在一个web项目中,持久层打算使用Hibernate,就傻傻的按照以前使用JDBC实现DAO的方式,不断的连接断开数据库,最要命的是还配置了
<property name="hbm2ddl.auto">update</property>
最终结果就是效率极低,jvm内存满溢。
解决的问题的关键就是避免每次数据库操作都重新获取一个Session,要能实现Session重用,因为session并非线程安全,重用Session要保证线程安全。
可能很多人都知道这个方法,这里仅作为个人经验总结和交流之用--ThreadLocal(线程局部变量)。在JVM中为每个运行中的线程创建一个私有的存储空间,不会被其他线程访问.
以其中一个servlet为例:
private ThreadLocal session= new ThreadLocal();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
session.set(getSession());
dotask(request.getParameter("id"));
Session curSession = session.get();
if(curSession!=null)
{
curSession.flush();
curSession.close();
session.set(null);
}
}
private void dotask(String id)
{
Session tempSession =(Session)session.get();
Student stu=(Student)tempSession.get(Student.class,id);
StuClass stuCla = (StuClass)tempSession.get(StuClass.class,stu.getClassid());
}
分享到:
相关推荐
3. **如何使用ThreadLocal实现Session管理?** 首先,定义一个ThreadLocal变量来存储session对象: ```java public class SessionThreadLocal { public static final ThreadLocal<Session> SESSION_HOLDER = new...
总结起来,"Hibernage_Session_Manager_ThreadLocal"是一个关于使用ThreadLocal在多线程环境中优化Hibernate Session管理的技术实践,通过这种方式可以提升应用程序的性能和安全性。`HibernateUtil.java`是实现这一...
ThreadLocal与Session管理 #### 2.1 ThreadLocal 在多线程环境中,每个线程应拥有独立的Session实例,以避免数据混乱。ThreadLocal是一种在Java中实现线程局部变量的方法,它可以保证每个线程都有自己的Session...
1. **Hibernate的Session管理**: Hibernate框架在处理数据库操作时,使用ThreadLocal来管理Session,确保每个线程都有自己独立的Session对象。这样,即使多个线程并发执行,每个线程也不会干扰其他线程的Session,...
误区二:ThreadLocal与每个session相对应 在Java Web编程中,ThreadLocal与HTTP Session的概念混淆是常见的误解。虽然每个用户会话通常对应一个唯一的Session ID,但ThreadLocal并不直接与用户会话绑定。ThreadLocal...
ThreadLocal自JDK 1.2起就存在,它不是一个线程,而是一种管理线程局部变量的机制。每个线程都有其独立的ThreadLocal变量副本,这样每个线程都可以独立地修改自己的副本而不影响其他线程。这有助于避免并发问题,...
在实际开发中,除了使用ThreadLocal,还有其他几种Session管理策略,例如: 1. **Session per Request/Transaction**:每个HTTP请求或数据库事务分配一个Session。这通常是Web应用程序的最佳实践,因为HTTP请求是...
#### 四、ThreadLocal的生命周期与内存管理 值得注意的是,`ThreadLocal`变量的生命周期与线程的生命周期紧密关联。当线程结束时,与之关联的所有`ThreadLocal`变量也将自动被垃圾回收器回收。然而,如果线程持续...
【ThreadLocal模式管理Session的理解】 在使用Hibernate进行数据库操作时,正确管理Session是优化系统性能的关键。Session由SessionFactory创建,而SessionFactory是线程安全的,这意味着它可以被多个并发线程共享...
**目的**:管理 Hibernate 的 Session,确保每个线程都有独立的 Session 实例。 **关键代码段**: ```java public class HibernateUtil { private static Log log = LogFactory.getLog(HibernateUtil.class); ...
- 请求上下文:在Web应用中,可以使用ThreadLocal存储HttpServletRequest、Session等与请求相关的数据,确保这些数据只在当前请求的线程内可见。 - 数据库连接:在数据库连接池中,可以使用ThreadLocal为每个线程...
2. **请求上下文**:在Web应用中,可以使用`ThreadLocal`保存HttpServletRequest或Session对象,方便在同一个请求处理链路中访问。 3. **线程状态**:记录线程执行过程中的状态,例如事务管理、计数器等。 然而,...
因此,ThreadLocal非常适合在多层架构中管理数据库连接、用户认证信息等需要线程安全但又不宜在多线程间共享的资源。 数据库连接是一个经典的例子。在没有使用连接池的原始JDBC方式中,每次通过DriverManager.get...
在这个例子中,`currentSession()`方法检查当前线程的ThreadLocal变量是否有Session,如果没有,则打开新的Session并设置到ThreadLocal中,供后续代码使用。 了解这些Java多线程和ThreadLocal的基础知识对于Java...
使用ThreadLocal Session的一个关键好处是事务的自动管理。当开启一个新的Session时,Hibernate会隐式地开始一个事务;当Session关闭时,如果之前没有遇到异常,那么事务就会被提交;如果有异常,事务会被回滚,从而...
private static final ThreadLocal<Session> sessionThread=new ThreadLocal<Session>(); private static final ThreadLocal<Transaction> transactionThread=new ThreadLocal(); private static final Log log=...
例如,Spring 中的 TransactionTemplate 和 AOP 模块利用 `ThreadLocal` 存储当前事务信息,Hibernate 中的 Session 管理也依赖于 `ThreadLocal` 来保持线程绑定的 Session。 7. **线程安全** - `ThreadLocal` ...
* Hibernate 的 Session 管理 * 日志记录的线程关联 * 等等 ThreadLocal 的注意事项 在使用 ThreadLocal 时,我们需要注意以下几点: * ThreadLocal 变量应该是 private static 的,以避免外部访问和修改。 * 在...
ThreadLocal期望能够管理一个线程的状态,例如用户id或事务id。 ThreadLocal的使用有很多优点,例如可以解决多线程间共享变量的问题,避免了线程安全问题,提高了程序的稳定性和可靠性。 ThreadLocal的使用方式...