概念簡介
sessionSession直接翻譯成中文比較困難,一般都譯成時域。在計算機專業術語中,Session是指一個終端用戶與交互系統進行通信的時間間隔,通常指從注冊進入系統到注銷退出系統之間所經過的時間以及如果需要的話,可能還有一定的操作空間。
具體到Web中的Session指的就是用戶在浏覽某個網站時,從進入網站到浏覽器關閉所經過的這段時間,也就是用戶浏覽這個網站所花費的時間。因此從上述的定義中我們可以看到,Session實際上是一個特定的時間概念。
需要注意的是,一個Session的概念需要包括特定的客戶端,特定的服務器端以及不中斷的操作時間。A用戶和C服務器建立連接時所處的Session同B用戶和C服務器建立連接時所處的Session是兩個不同的Session。
session的工作原理
(1)當一個session第一次被啟用時,一個唯一的标識被存儲于本地的cookie中。
(2)首先使用session_start()函數,PHP從session倉庫中加載已經存儲的session變量。
(3)當執行PHP腳本時,通過使用session_register()函數注冊session變量。
(4)當PHP腳本執行結束時,未被銷毀的session變量會被自動保存在本地一定路徑下的session庫中,這個路徑可以通過php.ini文件中的session.save_path指定,下次浏覽網頁時可以加載使用。
解決方法
session那什麼是Session的解決方案呢?我們知道,用戶訪問一個網站時往往需要浏覽許多網頁。Session的使用在不同的語言中的使用方法特點不盡相同。對于一個通過PHP構築的網站來說,用戶在訪問的過程中需要執行許多的PHP腳本。然而由于HTTP協議自身的特點,用戶每執行一個PHP腳本都需要和Web服務器重新建立連接。
又由于無狀态記憶的特點,此次連接無法得到上次連接的狀态。這樣,用戶在一個PHP腳本中對一個變量進行了賦值操作,而在另外一個PHP腳本中卻無法得到這個變量的值。
例如,用戶在負責登錄的PHP腳本中設置了$user="wind",卻無法在另一個PHP腳本中通過調用$user來獲得“wind”這個值。也就是說,在PHP中無法設置全局變量。每個PHP腳本中所定義的變量都是隻在這個腳本内有效的局部變量。
Session解決方案,就是要提供在PHP腳本中定義全局變量的方法,使得這個全局變量在同一個Session中對于所有的PHP腳本都有效。上面我們提到了,Session不是一個簡單的時間概念,一個Session中還包括了特定的用戶和服務器。因此更詳細地講,在一個Session定義的全局變量的作用範圍,是指這個Session所對應的用戶所訪問的所有PHP。
例如A用戶通過Session定義了一個全局變量$user=“wind”中,而B用戶通過Session定義的全局變量$user=“jane”。那麼在A用戶所訪問的PHP腳本中,$user的值就是wind。
深度認識
1,對于值類型的變量,Session中保存的是值類型的拷貝
Session["__test0"] = 1;
int i = (int)Session["__test0"]+1;
int j = (int)Session["__test0"];
結果:i=2,j=1
2,對于引用類新的變量,Session中保存的是引用
CDACommon cda = new CDACommon();
Session["__test"] = cda.GetDataSet("select top 1 * from tb_customer");
DataSet ds = (DataSet)Session["__test"];
DataSet ds2 = (DataSet)Session["__test"];
ds.Tables[0].Rows[0][0]="9999";
結果:
ds.Tables[0].Rows[0][0]=="9999"
ds2.Tables[0].Rows[0][0]=="9999";
3,Session周期
新的浏覽器窗口啟動後,開始一個新的Session,觸發Global的Session_Start的調用,從第一個浏覽器窗口打開的浏覽器窗口不啟動新的Session。Session過期後,執行頁面的提交也會觸發Session_Start,等于是新的一個Session。
4,調用Session
對于Web Service,每個方法的調用都會啟動一個Session,可以用下面的方法來使多個調用在同一個Session裡CWSSyscfg cwsCfg = new CWSSyscfg(); cwsCfg.CookieContainer = new System Net.CookieContainer(); CWSSyscfg是一個Web Service類,Web Service的給代理類設置CookieContainer屬性,隻要多個代理的CookieContainer屬性是相同的值,則對這些Web Service的調用在同一個Session。可以用單例模式來實現。
5,Session數據有效期
隻要頁面有提交活動,則Session的所有項都會保持,頁面在20分鐘(默認配置)内沒有任何提交活動時Session會失效。Session内存儲的多個數據項是整體失效的。
6,Session的保存
在Session中如果保存的是非序列化的類比如DataView,在用SQLServer保存Session的模式下,無法使用。查看一個類是否是序列化的方法是,需看是否用[Serializable]來标記了該類。
運用情況
sessionJsp的session是使用bean的一個生存期限,一般為page,session意思是在這個用戶沒有離開網站之前一直有效,如果無法判斷用戶何時離開,一般依據系統設定,tomcat中設定為30分鐘。
我們使用session功能,可以達到多個jsp程序從操作同一個java bean,那麼這個java bean可以作為我們傳統意義上的"全局變量池"。(在java中我們可以使用static靜态化一個變量和方法,使用singleton唯一化對象。)
在項目實踐中,我們Jsp程序中很多參數需要從數據庫中讀取,有的參數實際讀取一次就可以,如果設計成每個用戶每産生一個頁面都要讀取數據庫,很顯然,數據庫的負載很大,同時也浪費時間,雖然可能有數據庫連接池優化,但是盡量少使用數據庫是我們編程的原則。
JSP使用一個叫HttpSession的對象實現同樣的功能。HTTPSession 是一個建立在cookies 和URL-rewriting上的高質量的界面。Session的信息保存在服務器端,Session的id保存在客戶機的cookie中。
事實上,在許多服務器上,如果浏覽器支持的話它們就使用cookies,但是如果不支持或廢除了的話就自動轉化為URL-rewriting,session自動為每個流程提供了方便地存儲信息的方法。
Httpsession具有如下API:
getId 此方法返回唯一的标識,這些标識為每個session而産生。當隻有一個單一的值與一個session聯合時,或當日志信息與先前的sessions有關時,它被當作鍵名用。
GetCreationTime 返回session被創建的時間。最小單位為千分之一秒。為得到一個對打印輸出很有用的值,可将此值傳給Date constructor 或者GregorianCalendar的方法setTimeInMillis.
GetLastAccessedTime 返回session最後被客戶發送的時間。最小單位為千分之一秒。
GetMaxInactiveInterval 返回總時間(秒),負值表示session永遠不會超時。
getAttribute 取一個session相聯系的信息。(在jsp1.0中為 getValue)
Integer item = (Integer) session.getAttribute("item") //檢索出session的值并轉化為整型
setAttribute 提供一個關鍵詞和一個值。會替換掉任何以前的值。(在jsp1.0中為putValue)
session.setAttribute("ItemValue", itemName);// ItemValue 必須不是must簡單類型
在應用中使用最多的是getAttribute和setAttribute.現以一個簡單的例子來說明session的應用,test1.jsp(信息寫入session),test2.jsp(從session讀出信息)。
test1.jsp
<%
session.setAttribute("str",new String(“this is test”));
%>
test2.jsp
<%
String ls_str=null;
ls_str=(String)session.getAttribute("str");
out.println(“從session裡取出的值為:”+ls_str);
%>
使用詳解
php中的Session與Cookie
在PHP開發中對比起Cookie,session是存儲在服務器端的會話,相對安全,并且不像Cookie那樣有存儲長度限制,本文簡單介紹 session 的使用。
由于Session是以文本文件形式存儲在服務器端的,所以不怕客戶端修改 Session 内容。實際上在服務器端的 Session 文件,PHP 自動修改 session 文件的權限,隻保留了系統讀和寫權限,而且不能通過 ftp 修改,所以安全得多。
對于 Cookie 來說,假設我們要驗證用戶是否登陸,就必須在 Cookie 中保存用戶名和密碼(可能是 md5 加密後字符串),并在每次請求頁面的時候進行驗證。如果用戶名和密碼存儲在數據庫,每次都要執行一次數據庫查詢,給數據庫造成多餘的負擔。因為我們并不能隻做一次驗證。為什麼呢?因為客戶端Cookie 中的信息是有可能被修改的。
假如你存儲 $admin變量來表示用戶是否登陸,$admin 為 true 的時候表示登陸,為 false 的時候表示未登錄,在第一次通過驗證後将 $admin 等于 true 存儲在 Cookie,下次就不用驗證了,這樣對麼?錯了,假如有人僞造一個值為 true 的 $admin 變量那不是就立即取的了管理權限麼?非常的不安全。
而Session就不同了,Session是存儲在服務器端的,遠程用戶沒辦法修改session文件的内容,因此我們可以單純存儲一個 $admin變量來判斷是否登陸,首次驗證通過後設置$admin值為true,以後判斷該值是否為true,假如不是,轉入登陸界面,這樣就可以減少很多數據庫操作了。
而且可以減少每次為了驗證Cookie而傳遞密碼的不安全性了(session驗證隻需要傳遞一次,假如你沒有使用SSL安全協議的話)。即使密碼進行了md5加密,也是很容易被截獲的。
當然使用session還有很多優點,比如控制容易,可以按照用戶自定義存儲等(存儲于數據庫)。我這裡就不多說了。
session在php.ini是否需要設置呢?一般不需要的,因為并不是每個人都有修改PHP.ini的權限,默認session的存放路徑是服務器的系統臨時文件夾,我們可以自定義存放在自己的文件夾裡,這個稍後我會介紹。
Php如何創建Session
開始介紹如何創建session。非常簡單,真的。
啟動session會話,并創建一個$admin變量:
// 啟動 session
session_start();
// 聲明一個名為admin的變量,并賦空值。
$_session["admin"] = null;
>
如果你使用了Session,或者該PHP文件要調用Session變量,那麼就必須在調用Session之前啟動它,使用session_start()函數。其它都不需要你設置了,PHP 自動完成 session 文件的創建。執行完這個程序後,我們可以到系統臨時文件夾找到這個 session 文件一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,後面是32位編碼後的随機字符串。用編輯器打開它,看一下它的内容:
admin|N;
Session是什麼呢?簡單來說就是服務器給客戶端的一個編号。當一台WWW服務器運行時,可能有若幹個用戶浏覽正在運行這台服務器上的網站。當每個用戶首次與這台WWW服務器建立連接時,他就與這個服務器建立了一個Session,同時服務器會自動為其分配一個SessionID,用以标識這個用戶的唯一身份。
這個SessionID是由WWW服務器随機産生的一個由24個字符組成的字符串,我們會在下面的實驗中見到它的實際樣子。
這個唯一的SessionID是有很大的實際意義的。當一個用戶提交了表單時,浏覽器會将用戶的SessionID自動附加在HTTP頭信息中,(這是浏覽器的自動功能,用戶不會察覺到),當服務器處理完這個表單後,将結果返回給SessionID所對應的用戶。
試想,如果沒有SessionID,當有兩個用戶同時進行注冊時,服務器怎樣才能知道到底是哪個用戶提交了哪個表單呢。當然,SessionID還有很多其他的作用,我們會在後面提及到。
除了SessionID,在每個Session中還包含很多其他信息。但是對于編寫ASP或ASP .NET的程序員來說,最有用的還是可以通過訪問ASP/ASP .NET的内置Session對象,為每個用戶存儲各自的信息。例如我們想了解一下訪問我們網站的用戶浏覽了幾個頁面,我們可能在用戶可能訪問到每個的頁面中加入:
通過以下這句話可以讓用戶得知自己浏覽了幾個頁面:
可能有些讀者會問:這個看似像是數組的Session(“..”)是哪裡來的?需要我定義嗎?實際上,這個Session對象是具有ASP解釋能力的的WWW服務器的内建對象。
也就是說ASP的系統中已經給你定義好了這個對象,你隻需要使用就行了。其中Session(“..")中的..就好像變量名稱,Session(“..")=$中的$就是變量的值了。你隻需要寫上句話,在這個用戶的每個頁面中都可以訪問..變量中的值了。
其實ASP會話一共内建了7個對象,有Session、Application、Cookie、Response、Request、Server等。在其他的服務器端腳本語言如JSP、PHP等中也有其類似的對象,隻是叫法或者使用方法上不太一樣。
一般内容結構
變量名|類型:長度:值;
并用分号隔開每個變量。有些是可以省略的,比如長度和類型。
我們來看一下驗證程序,假設數據庫存儲的是用戶名和 md5 加密後的密碼:
//表單提交後...
$posts = $_POST;
// 清除一些空白符号
foreach ($posts as $key => $value)
{
$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];
$query = "SELECT `username` FROM `user` WHERE `password` = '$password'";
// 取得查詢結果
$userInfo = $DB->getRow($query);
if (!empty($userInfo))
{
if ($userInfo["username"] == $username)
{
// 當驗證通過後,啟動 session
session_start();
// 注冊登陸成功的 admin變量,并賦值 true
$_SESSION["admin"] = true;
}
else
{
die("用戶名密碼錯誤");
}
}
else
{
die("用戶名密碼錯誤");
}
我們在需要用戶驗證的頁面啟動 session,判斷是否登陸:
// 防止全局變量造成安全隐患
$admin = false;
// 啟動會話,這步必不可少
session_start();
// 判斷是否登陸
if (isset($_SESSION["admin"]) && $_SESSION["admin"] == true)
{
echo "您已經成功登陸";
}
else
{
// 驗證失敗,将 $_session["admin"] 置為 false
$_SESSION["admin"] = false;
die("您無權訪問");
}
>
是不是很簡單呢?将 $_session 看成是存儲在服務器端的數組即可,我們注冊的每一個變量都是數組的鍵,跟使用數組沒有什麼分别。
如果要登出系統怎麼辦?銷毀 session 即可。
session_start();
// 這種方法是将原來注冊的某個變量銷毀
unset($_SESSION["admin"]);
// 這種方法是銷毀整個 session 文件
session_destroy();
>
釋放當前在内存中已經創建的所有$_SESSION變量,但不删除session文件以及不釋放對應的session id
session_start();
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);
?>
session_destroy()
删除當前用戶對應的session文件以及釋放session id,内存中的$_SESSION變量内容依然保留
因此,釋放用戶的session所有資源,需要順序執行如下代碼:
$_SESSION['user'] = ‘user1′;
session_unset();
session_destroy();
?>
Session 能否像 Cookie 那樣設置生存周期呢?有了 Session 是否就完全抛棄 Cookie 呢?我想說,結合 Cookie 來使用 session 才是最方便的。
Session 是如何來判斷客戶端用戶的呢?它是通過 Session ID 來判斷的,什麼是 Session ID,就是那個 Session 文件的文件名,Session ID 是随機生成的,因此能保證唯一性和随機性,确保 Session 的安全。
一般如果沒有設置 Session 的生存周期,則 Session ID 存儲在内存中,關閉浏覽器後該 ID 自動注銷,重新請求該頁面後,重新注冊一個 session ID。
如果客戶端沒有禁用 Cookie,則 Cookie 在啟動 Session 會話的時候扮演的是存儲 Session ID 和 session 生存期的角色。
我們來手動設置 session 的生存期:
session_start();
// 保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(),session_id(),time() + $lifeTime,"/");
>
其實 Session 還提供了一個函數 session_set_cookie_params(); 來設置 Session 的生存期的,該函數必須在 session_start()函數調用之前調用:
// 保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_session["admin"] = true;
>
如果客戶端使用 IE 6.0 , session_set_cookie_params(); 函數設置 Cookie 會有些問題,所以我們還是手動調用setcookie函數來創建 cookie。
假設客戶端禁用 Cookie 怎麼辦?沒辦法,所有生存周期都是浏覽器進程了,隻要關閉浏覽器,再次請求頁面又得重新注冊 Session。那麼怎麼傳遞 Session ID 呢?
通過 URL 或者通過隐藏表單來傳遞,PHP 會自動将 session ID 發送到 URL 上,URL 形如:http://www.openphp.cn /index.php?PHPSESSID=bba5b2a240a77e5b44cfa01d49cf9669,其中 URL 中的參數 PHPSESSID 就是 Session ID了,我們可以使用 $_GET 來獲取該值,從而實現 session ID 頁面間傳遞。
// 保存一天
$lifeTime = 24 * 3600;
// 取得當前 session 名,默認為 PHPSESSID
$sessionName = session_name();
// 取得 session ID
$sessionID = $_GET[$sessionName];
// 使用 session_id() 設置獲得的 session ID
session_id($sessionID);
session_set_cookie_params($lifeTime);
session_start();
$_session["admin"] = true;
>
對于虛拟主機來說,如果所有用戶的 Session 都保存在系統臨時文件夾裡,将給維護造成困難,而且降低了安全性,我們可以手動設置 Session 文件的保存路徑,session_save_path()就提供了這樣一個功能。我們可以将 session 存放目錄指向一個不能通過 Web 方式訪問的文件夾,當然,該文件夾必須具備可讀寫屬性。
// 設置一個存放目錄
$savePath = "./session_save_dir/";
// 保存一天
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_session["admin"] = true;
>
同 session_set_cookie_params(); 函數一樣,session_save_path() 函數也必須在 session_start() 函數調用之前調用。
我們還可以将數組,對象存儲在 session 中。操作數組和操作一般變量沒有什麼區别,而保存對象的話,PHP 會自動對對象進行序列化(也叫串行化),然後保存于 session 中。下面例子說明了這一點:
class person
{
var $age;
function output() {
echo $this->age;
}
function setAge($age) {
$this->age = $age;
}
}
>
setage.PHP
session_start();
require_once "person.PHP";
$person = new person();
$person->setAge(21);
$_session['person'] = $person;
echo "check here to output age";
>
output.PHP
// 設置回調函數,确保重新構建對象。
ini_set('unserialize_callback_func','mycallback');
function mycallback($classname) {
$classname . ".PHP";
}
session_start();
$person = $_session["person"];
// 輸出 21
$person->output();
>
當我們執行 setage.php 文件的時候,調用了 setage() 方法,設置了年齡為 21,并将該狀态序列化後保存在 session 中(PHP 将自動完成這一轉換),當轉到 output.php 後,要輸出這個值,就必須反序列化剛才保存的對象,又因為在解序列化的時候需要實例化一個未定義類,所以我們定義了以後回調函數,自動包含 person.PHP 這個類文件,因此對象被重構,并取得當前 age 的值為 21,然後調用 output() 方法輸出該值。
有效期
PHP中的session有效期默認是1440秒(24分鐘)【weiweiok 注:php5裡默認的是180分】,也就是說,客戶端超過24分鐘沒有刷新,當前session就會失效。很明顯,這是不能滿足需要的。
一個已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存儲到數 據庫,這樣可以通過SQL語句來删除所有過期的session,精确地控制session的有效期。這也是基于PHP的大型網站常用的方法。但是,一般的 小型網站,似乎沒有必要這麼勞師動衆。
但是一般的Session的生命期有限,如果用戶關閉了浏覽器,就不能保存Session的變量了!那麼怎麼樣可以實現Session的永久生命期呢?
大 家知道,Session儲存在服務器端,根據客戶端提供的SessionID來得到這個用戶的文件,然後讀取文件,取得變量的值,SessionID可以 使用客戶端的Cookie或者Http1.1協議的Query_String(就是訪問的URL的“?”後面的部分)來傳送給服務器,然後服務器讀取 Session的目錄……
要實現Session的永久生命期,首先需要了解一下php.ini關于Session的相關設置(打開php.ini文件,在“[Session]”部分):
1、session.use_cookies:默認的值是“1”,代表SessionID使用Cookie來傳遞,反之就是使用Query_String來傳遞;
2、session. name:這個就是SessionID儲存的變量名稱,可能是Cookie,也可能是Query_String來傳遞,默認值是“PHPSESSID”;
3、session.cookie_lifetime:這個代表SessionID在客戶端Cookie儲存的時間,默認是0,代表浏覽器一關閉SessionID就作廢……就是因為這個所以Session不能永久使用!
4、session.gc_maxlifetime:這個是Session數據在服務器端儲存的時間,如果超過這個時間,那麼Session數據就自動删除!
asp中的session使用方法詳解
Session是什麼呢?簡單來說就是服務器給客戶端的一個編号。當一台WWW服務器運行時,可能有若幹個用戶浏覽正在運正在這台服務器上的網站。當每個用戶首次與這台WWW服務器建立連接時,他就與這個服務器建立了一個Session,同時服務器會自動為其分配一個SessionID,用以标識這個用戶的唯一身份。這個SessionID是由WWW服務器随機産生的一個由24個字符組成的字符串,我們會在下面的實驗中見到它的實際樣子。
這個唯一的SessionID是有很大的實際意義的。當一個用戶提交了表單時,浏覽器會将用戶的SessionID自動附加在HTTP頭信息中,(這是浏覽器的自動功能,用戶不會察覺到),當服務器處理完這個表單後,将結果返回給SessionID所對應的用戶。
試想,如果沒有SessionID,當有兩個用戶同時進行注冊時,服務器怎樣才能知道到底是哪個用戶提交了哪個表單呢。當然,SessionID還有很多其他的作用,我們會在後面提及到。
除了SessionID,在每個Session中還包含很多其他信息。但是對于編寫ASP或ASP.NET的程序與來說,最有用的還是可以通過訪問ASP/ASP.NET的内置Session對象,為每個用戶存儲各自的信息。例如我們想了解一下訪問我們網站的用戶浏覽了幾個頁面,我們可能在用戶可能訪問到每個的頁面中加入:
通過以下這句話可以讓用戶得知自己浏覽了幾個頁面:
可能有些有些讀者會問:這個看似像是數組的Session(“..”)是哪裡來的?需要我定義嗎?實際上,這個Session對象是具有ASP解釋能力的的WWW服務器的内建對象。也就是說ASP的系統中已經給你定義好了這個對象,你隻需要使用就行了。其中Session(“..”)中的..就好像變量名稱,Session(“..”)=$中的$就是變量的值了。你隻需要寫上句話,在這個用戶的每個頁面中都可以訪問..變量中的值了。
其實ASP一共内建了7個對象,有Session、Application、Cookie、Response、Request、Server等。在其他的服務器端腳本語言如JSP、PHP等中也有其類似的對象,隻是叫法或者使用方法上不太一樣。
ASP Session的功能的缺陷
目前ASP的開發人員都正在使用Session這一強大的功能,但是在他們使用的過程中卻發現了ASP Session有以下缺陷:
進程依賴性:ASP Session狀态存于IIS的進程中,也就是inetinfo.exe這個程序。所以當inetinfo.exe進程崩潰時,這些信息也就丢失。另外,重起或者關閉IIS服務都會造成信息的丢失。
Session狀态使用範圍的局限性:剛一個用戶從一個網站訪問到另外一個網站時,這些Session信息并不會随之遷移過去。例如:新浪網站的WWW服務器可能不止一個,一個用戶登錄之後要去各個頻道浏覽,但是每個頻道都在不同的服務器上,如果想在這些WWW服務器共享Session信息怎麼辦呢?
Cookie的依賴性:實際上客戶端的Session信息是存儲與Cookie中的,如果客戶端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
鑒于ASP Session的以上缺陷,微軟的設計者們在設計開發 ASP.NET Session時進行了相應的改進,完全克服了以上缺陷,使得ASP.NET Session成為了一個更加強大的功能。
HIbernate中的Session
Session是JAVA應用程序和Hibernate進行交互時使用的主要接口,它也是持久化操作核心API,
注意這裡的Session的含義,它與傳統意思上web層的HttpSession并沒有關系,Hibernate Session之與Hibernate,相當于JDBC Connection相對與JDBC。
Session對象是有生命周期的,它以Transaction對象的事務開始和結束邊界
Session作為貫穿Hibernate的持久化管理器核心,提供了衆多的持久化的方法,如save(), update ,delete ,find(Hibernate 3中已經取消了此方法)等,通過這些方法我們可以透明的完成對象的增删改查(CRUD-- create read update delete),這裡所謂的透明是指,Session在讀取,創建和删除影射的實體對象的實例時,這一系列的操作将被轉換為對數據庫表中數據的增加,修改,查詢和删除操作。
Session有以下的特點
1,不是線程安全的,應該避免多個線程共享同一個Session實例
2,Session實例是輕量級的,所謂輕量級:是指他的創建和删除不需要消耗太多資源
3,Session對象内部有一個緩存,被稱為Hibernate第一緩存,他存放被當前工作單元中加載的對象,每個Session實例都有自己的緩存。
org.hibernate Interface Session
public interface Session extends Serializable : 是一個Java application 和Hibernate之間主要的運行時接口,這是執行持久化服務的中心API
主要方法:
public Transaction beginTransaction() throws HibernateException:返回和當前Session對象相互聯系的Transaction對象(表示在數據庫中重新開始一個事務)
public Transaction getTransaction(): 返回和當前session聯系的Transaction對象
public Connection connection close() throws HibernateExcepton:結束當前的Session對象
public void clear() :清空Session,清除所有保存在當前Session緩存中的實體對象,終止所有正在執行的方法(eg: save() , update() ,delete() .....)
public Serializable save(Object object)throws HibernateException 對當前參數指定的對象進行持久化(系統會首先賦予參數對象一個标識符OID),他相當于insert語句 後面在詳細介紹
public Connection connection() throws HibernateException 得到當前Session 中包含的Connection對象。
public boolean contains(Object object):判斷參數給出的對象(持久化類)是否在當前Session的緩存中
public void evict(Object object) throws HibernateException :将參數給出的Object從當前Session對象類中删除,使這個對象從持久态變成遊離态,這種狀态的改變不會引起對數據庫的同步,後面詳細介紹
public Object load(Class theclass ,Serializable id) throws HibernateException 返回第一個參數指定類對應的表中,第二個參數指定的行(第二個參數就是要取得對象的OID,他對應表中主鍵列的值)
public void update(Object object) throws HibernateException :更新一個對象到數據庫中,後面在詳細介紹
public void delete (Object object)throws HibernateException:從數據庫中删除和參數指定的對象對應的記錄
public Object get(Class class,Serializable id) throws HibernateException:和load()方法一樣區别在于,如果數據庫表中沒有對應的記錄,get()方法返回null,load()方法将報異常
Transanction
Transanction接口是Hibernate的數據庫事務接口,用于管理事務,他對底層的事務作出了封裝,用戶可以使用Transanction對象定義自己的對數據庫的原子操作,底層事務包括:JDBC API ,JTA(Java Transaction API)。
一個Transaction對象的事務可能會包括多個對數據庫進行的操作
org.hibernate Interface Transaction
public interface Transaction
常用方法:
public void commit() throws HibernateException 刷新當前的Session以及結束事務的工作,這個方法将迫使數據庫對當前的事務進行提交
public void rollback() throws HibernateException :強迫回滾當前事務
public boolean isActive() throws HibernateException: 這個事務是否存活
----------------------------------------------------------------------------------------
Session:當中包含一個Connection對象
Connection c =session.getConnection();
Session的緩存用于臨時保存持久化的對象,等到一定時候,再将緩存中的對象保存到數據庫中。
應用程序事務:如果一個Session中包含有多個Transaction(數據庫事務),這些Transaction的集合稱為應用程序事務
标準使用形式:
Configuration config=new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionfactory=config.buildSessionFactory();
Session session=sessionfactory.openSession();
Transaction tx=session.beginTransaction();
try
{
session.save();
tx.commit();
}
catch(Exception e)
{
if(tx!=null) tx.rollback();
}
finally
{
session.close ();
}
Hibernate中的Session接口
Hibernate的session不同于JSP應用中的HttpSession。這裡當使用session這個術語時,其實指的是Hibernate中的session。Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句)。
但需要注意的是Session接口是非線程安全的。它是Hibernate的核心接口6個中的1個,其它5個為:SessionFactory、Transaction、Query、Criteria和Configuration。Session對象就是由SessionFactory生成。



















