真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

Hibernate中怎么利用ThreadLocal模式管理Session

今天就跟大家聊聊有關Hibernate中怎么利用ThreadLocal模式管理Session,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

為周村等地區(qū)用戶提供了全套網頁設計制作服務,及周村網站建設行業(yè)解決方案。主營業(yè)務為做網站、成都做網站、周村網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

一、ThreadLocal模式 (線程局部變量模式) 管理Session的理解

(1)在利用Hibernate開發(fā)的時候如何合理的管理Session,避免Session的頻繁創(chuàng)建和銷毀,對于提高系統(tǒng)的性能來說是非常重要的!

(2)我們知道Session是由SessionFactory負責創(chuàng)建的,而SessionFactory的實現是線程安全的,多個并發(fā)的線程可以同時訪問一個SessionFactory并從中獲取Session實例,但是遺憾的是Session不是線程安全的。

(3)Session中包含了數據庫操作相關的狀態(tài)信息,那么說如果多個線程同時使用一個Session實例進行CRUD(數據庫的增刪改查),就很有可能導致數據存取的混亂,我們根本無法想像那些你根本不能預測執(zhí)行順序的線程對你的一條記錄進行操作的情形!

(4)在Session的眾多管理方案中,在今天的學習中知道ThreadLocal模式是一種很不錯的解決方案,特分享給大家!

(5)我們首先要明白的是ThreadLocal并非是一個線程的本地實現版本,它并不是一個Thread,而是thread local variable(線程局部變量)。(也許把它命名為ThreadLocalVar更加合適)。線程局部變量(ThreadLocal)其實的功用非常簡單,就是為每一個使用某變量的線程都提供一個該變量值的副本,是每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。從線程的角度看,就好像每一個線程都完全擁有一個該變量。

(6)更具體的來說就是:ThreadLocal并非等同于線程成員變量,ThreadLocal該類提供了線程局部變量。這個局部變量與一般的成員變量不一樣,ThreadLocal的變量在被多個線程使用時候,每個線程只能拿到該變量的一個副本,這是Java API中的描述,但更準確的說,應該是ThreadLocal類型的變量內部的注冊表(Map)發(fā)生了變化,但ThreadLocal類型的變量本身的確是一個,這才是本質!

(7)ThreadLocal的原理:在ThreadLocal類中有一個Map,用于存儲每一個線程的變量的副本。比如下面的示例實現:

public class ThreadLocal {
 private Map values = Collections.synchronizedMap(new HashMap());
 public Object get() {
 Thread curThread = Thread.currentThread();
 Object o = values.get(curThread);
 if (o == null && !values.containsKey(curThread)) {
  o = initialValue();
  values.put(curThread, o);
 }
 values.put(Thread.currentThread(), newValue);
 return o;
 }
 public Object initialValue() {
 return null;
 }
}

二、代碼的展示

(1)使用ThreadLocal模式 (線程局部變量模式) 管理Session的代碼如下:

package com.lc.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
 * 升級的MySessionFactory 線程局部模式
 * @author xuliugen
 */
public class HibernateUtil {
 private static SessionFactory sessionFactory = null;
 // 使用線程局部模式
 private static ThreadLocal threadLocal = new ThreadLocal();
 /*
 * 默認的構造函數
 */
 private HibernateUtil() {
 }
 /*
 * 靜態(tài)的代碼塊
 */
 static {
 sessionFactory = new Configuration().configure().buildSessionFactory();
 }
 /*
 * 獲取全新的的session
 */
 public static Session openSession() {
 return sessionFactory.openSession();
 }
 /*
 * 獲取和線程關聯的session
 */
 public static Session getCurrentSession() {
 Session session = threadLocal.get();
 // 判斷是是是否得到
 if (session == null) {
  session = sessionFactory.openSession();
  // 把session放到 threadLocal,相當于該session已經于線程綁定
  threadLocal.set(session);
 }
 return session;
 }
}

(2)測試代碼如下:

package com.lc.view;
import org.hibernate.Session;
import com.lc.util.HibernateUtil;
public class TestHibernateUtil {
 public static void main(String[] args) {
 Session s1 = HibernateUtil.getCurrentSession(); 
 Session s2 = HibernateUtil.getCurrentSession();
 System.out.println(s1.hashCode()+"  "+s2.hashCode());
 /*
  * 1432950766  1432950766
  * 結果是兩個hashCode是一樣的,證明是線程相關的
  */
 }
}

看完上述內容,你們對Hibernate中怎么利用ThreadLocal模式管理Session有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯行業(yè)資訊頻道,感謝大家的支持。


文章標題:Hibernate中怎么利用ThreadLocal模式管理Session
URL鏈接:http://weahome.cn/article/jphiho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部