我们知道,Session是Hibernate运行的核心,通过它来对对象的生命周期,事务的管理和数据库的存取进行管理。
首先我们来看一下threadLocal类。
我们从上一篇文章已经知道,SessionFactory是线程安全的,不同的线程对它的实例进行调用,不会发生数据共享方面的问题。而 Session是又SessionFactory创建的,它却不是线程安全的,我们不能让session来进行数据共享。为了解决这个问题我们引入了 ThreadLocal类。下面看一下代码:
Java代码
1. package com.jnotnull;
2. import org.hibernate.*;
3. import org.hibernate.cfg.*;
4. public class SessionTest{
5. private static final SessionFactory sessionFactory;
6. static{
7. try{
8. sessionFactory = new Configuration().configure().buildSessionFactory();
9. }catch(Exception e){
10. }
11.
12. public static final ThreadLocal threadlocal = new ThreadLocal();
13. public static Session currentSession(){
14. Session s = (Session)threadlocal.get();
15. if(s==null){
16. s=sessionFactory.openSession();
17. threadlocal.set(s);
18. }
19. return s;
20. }
21. }
22.
23. public static void closeSession(){
24. Session s =(Session)threadlocal.get();
25. if(s != null)
26. s.close();
27. threadlocal.set(null);
28. }
29.
30. }
package com.jnotnull;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class SessionTest{
private static final SessionFactory sessionFactory;
static{
try{
sessionFactory = new Configuration().configure().buildSessionFactory();
}catch(Exception e){
}
public static final ThreadLocal threadlocal = new ThreadLocal();
public static Session currentSession(){
Session s = (Session)threadlocal.get();
if(s==null){
s=sessionFactory.openSession();
threadlocal.set(s);
}
return s;
}
}
public static void closeSession(){
Session s =(Session)threadlocal.get();
if(s != null)
s.close();
threadlocal.set(null);
}
}
这里我们可以看到运用 ThreadLocal,可以在每一个线程中创建一个单独的Session,这样就保证了线程的安全了。
这里还要注意的是,这里的Session是保留着对各种操作的结果,和http中的session是不同的。
分享到:
相关推荐
1. 在ThreadLocal类中,有一个内部的Map,用于存储每个线程的变量副本。这个Map的键是Thread对象,值是ThreadLocal变量的副本。 2. 当调用ThreadLocal.get()时,它会找到当前线程对象,并从Map中查找对应的值。如果...
在这个例子中,getSession()方法会检查ThreadLocal中是否存在Session,若不存在则创建并设置,而closeSession()方法则负责关闭并移除当前线程的Session副本。 总结来说,ThreadLocal是Java中解决多线程数据隔离问题...
在`TestServlet`的例子中,我们创建一个ThreadLocal类型的`localSession`变量,然后在`doGet`方法中将从SessionFactory获取的Session保存到ThreadLocal中。在`doSomething`方法中,我们通过ThreadLocal的`get`方法...
- **实现原理**:通过在 ThreadLocal 类中维护一个 Map 结构来存储每个线程的变量副本。 **应用场景**: - 在多线程环境中,避免共享资源竞争,如数据库连接、Session 等。 - 避免使用 synchronized 同步机制带来的...
因此,开发者在使用ThreadLocal时必须小心,避免在ThreadLocal中存储长期有效的数据,防止其他线程意外访问。 误区四:ThreadLocal可以随意多用 ThreadLocal虽然能提供方便的线程隔离,但过度依赖ThreadLocal可能...
在实际应用中,如上文所示的Hibernate示例,通过`set()`方法可以将`Session`对象与当前线程绑定,而`get()`方法则用于获取当前线程的`Session`对象。这种设计模式避免了在多线程环境中直接操作共享资源可能带来的...
`HibernateSessionFactory` 类是Hibernate应用中常见的一个工具类,用于管理和提供与当前线程相关的Session实例。让我们详细了解一下`HibernateSessionFactory`类中的关键方法和其背后的原理。 1. **配置和初始化...
例如,在 HibernateUtil 类中,我们可以定义一个 ThreadLocal 变量来保存 Hibernate 的 Session。 ```java public class HibernateUtil { private static Log log = LogFactory.getLog(HibernateUtil.class); ...
本文将深入探讨Hibernate中的事务处理,特别是“当前线程中的Session”这一概念,以及如何在实际开发中有效地利用它。 在Hibernate中,Session是与持久化层交互的主要接口,它负责对象的持久化、检索、更新和删除等...
ThreadLocal 类中的方法包括: * void set(T value):将此线程局部变量的当前线程副本中的值设置为指定值。 * void remove():移除此线程局部变量当前线程的值。 * protected T initialValue():返回此线程局部变量...
在加载配置文件时,`Configuration`类会优先考虑`hibernate.cfg.xml`中的配置,如果存在相同的配置项,那么`hibernate.cfg.xml`中的值将覆盖`hibernate.properties`中的值。此外,通过`Configuration`类提供的方法,...
- **自动对象关系映射**:通过配置文件(通常是 XML 文件),Hibernate 能够自动将 Java 对象持久化到数据库中,并能从数据库中加载对象。 **2. Hibernate 架构** - **PO (Persistent Objects 持久化对象)**:这些...
每当线程开始处理请求时,会从ThreadLocal中获取或创建一个新的Session。 4. **Session的生命周期管理**:每个线程在开始操作数据库之前,从ThreadLocal获取Session;完成后,关闭Session并清理ThreadLocal中的引用...
例如,Spring 中的 TransactionTemplate 和 AOP 模块利用 `ThreadLocal` 存储当前事务信息,Hibernate 中的 Session 管理也依赖于 `ThreadLocal` 来保持线程绑定的 Session。 7. **线程安全** - `ThreadLocal` ...
2. **ThreadLocal模式**:在多线程环境下,使用ThreadLocal来管理Hibernate的Session可以避免线程安全问题。每个线程都有自己的Session实例,这样可以确保数据访问的线程安全性。 3. **静态工厂方法**:为了提高...
在Hibernate中,通常使用`ThreadLocal`来管理`Session`,确保每个线程拥有自己的`Session`实例,从而避免并发问题。 - **示例**: - 创建一个`ThreadLocal`实例来管理`Session`: - `private static ThreadLocal...
接下来,我们需要创建一个名为`HibernateSessionFactory`的类,该类负责初始化Hibernate会话工厂(SessionFactory)并提供获取会话(Session)的方法。具体实现如下: ```java package com.jk2.dao; import org....