亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

讓不同的Servlet在一個Session共享連接

2024-09-05 00:16:55
字體:
來源:轉載
供稿:網友

==== 問題所在 ====

如果要編寫一個購物車,通常需要寫很多個不同功能的servlet。例如用戶登錄、添加商品、查詢購物車、結帳等。

在這些 servlet 中都需要讀寫數據庫。如果我們在每個 servlet 中都進行連接 -> 讀寫 -> 斷開連接的操作,就會消耗大量的服務器資源,不僅程序響應速度減緩,而且會加重服務器和數據庫的負擔。

==== 把希望寄托于 HttpSession ====

如我們所學,Servlet API 提供了一些方法和類來專門處理短期的會話跟蹤。網站的每個用戶都和 javax.servlet.http.HttpSession 對象有關,servlet使用這個對象來記錄和檢索每個用戶的信息。

幸運的是,我們可以在會話對象中存儲任意的 java 對象。存儲的方法大家都已經很熟悉,就是使用 setAttribute()方法。代表數據庫連接的Connection也不例外。

這就為我們讓不同的servlet在一個session內共享鏈接帶來的希望。

==== 安全問題 ====

那么,僅僅像下面這樣做就可以了么?

1、在Servlet1中,向session中設置一個屬性:

session.setAttribute("connection", connection);

2、在Servlet2中,取出這個屬性:

Connection connection = (Connection) session.getAttribute ("connection");

理論上,沒有問題。在 Servlet1 中產生的 Connection 對象,到了 Servlet2 中可以繼續使用。

但是如果 Servlet2 不小心改變了 connection 的引用,例如 connection = null; 那么,當它再次把這個connection放入session的屬性當中,其它的 servlet 就會得到一個指向 null 的 connection!

==== 解決之道 ====

把 connection 直接在 session 中傳來傳去,看來不怎么安全。

解決思路是,我們找一個專門的人來保管這個 connection,在得到請求的時候,由這個人把 connection 的引用返回給調用者。這樣,即使調用者不小心把它得到的那份 connection 搞壞了,保管著手里也總還有一個備份。

相應的,在 session 的屬性中,我們不再保存 connection 本身,而是把這個保管者存進去。因為他能隨時給我們一個可用的 connection。

這個類的具體寫法是:

public class ConnectionHolder {
public ConnectionHolder(Connection con) {
// 保存連接
this.con = con;
try {
// 禁用自動提交,以隔離不同session之間的操作。
con.setAutoCommit(false);
}
catch(SQLException e) {
// 錯誤處理代碼
}
}
public Connection getConnection() {
// 通過這個getter方法獲取連接
return con;
}
private Connection con = null; // 設置為私有變量,這很重要,以確保變量安全。
}
==== 使用方法 ====

每個 servlet 在希望取得數據庫連接的時候,先看看 session 中是否有這個“保管者”(即上面的ConnectionHolder)。

如果有的話,直接調用它的get方法,取得數據庫連接。

如果沒有的話,說明這個session還沒有連接過數據庫,那么當前類就立刻創建一個數據庫連接,并把這個連接交給保管者,然后再把保管者放入 session 中,以便后續的 servlet 使用。

下面是一個實例:

1 protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
2
3 // 同步代碼取得數據庫連接
4 synchronized (session) {
5 // 看看這個持有者是否已經在 session 中了
6 ConnectionHolder holder = (ConnectionHolder) session.getAttribute
("servletapp.connection");
7
8 // 如果不在,就創建一個數據庫連接,并把它交給持有者。
9 if (holder == null) {
10 try {
11 holder = new ConnectionHolder(DriverManager.getConnection(
"Connection URL"));
12 session.setAttribute("servletapp.connection", holder);
13 }
14 catch (SQLException sqle) {
15 // 錯誤處理代碼
16 }
17 }
18
19 // 從容器取得實際連接
20 conn = holder.getConnection();
21 }
.... // 別忘了commit
}
這段代碼看起來有那么幾行。但實際上,在每個session中,只有第一次執行的servlet需要進行數據庫連接操作,此后的servlet只會執行第4、6、20這三行。

==== 誰來負責斷開連接? ====

當 servlet 們不必再為創建數據庫連接費心的時候,也就沒有人愿意管關閉連接這檔子事了。事實上,更重要的是,他們沒法管。因為這個連接是放在 session 中的,而沒有誰能準確的預測,一個 session 會何時終止。

好在有一種叫做“監聽器”(Listener)的東西可以專門管這件事。Listener有很多方法,其中的兩個方法是:

public void valueBound(HttpSessionBingEvent event);

public void valueUnbound(HttpSessionBingEvent event);

這兩個方法可以在一個 session 被創建/失效的時候分別自動執行。我們就把關閉連接的代碼放在第二個方法中,這樣,當一個 session 失效的時候,數據庫連接就會自動關閉。

要想讓一個類成為Listener,只需讓它實現 HttpSessionBindingListener 接口。我們的 connection 是由 ConnectionHolder 這個類來保管的,因此最方便的辦法就是把它注冊成一個監聽器。

具體方法是:

public void valueUnbound(HttpSessionBindingEvent event) {
// 當從Session刪除或當Session結束時,關閉數據連接。
try {
if (con != null) {
con.rollback(); // 放棄所有未提交的數據
con.close();
}
}
catch (SQLException e) {
// 錯誤處理代碼
}
}
==== 完整示例 ====

下面是一個完整的 ConnectionHolder:

import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.sql.Connection;
import java.sql.SQLException;
public class ConnectionHolder implements HttpSessionBindingListener {
public ConnectionHolder(Connection con) {
// 保存連接
this.con = con;
try {
con.setAutoCommit(false);
}
catch(SQLException e) {
// 錯誤處理代碼
}
}
public Connection getConnection() {
return con;
}
public void valueBound(HttpSessionBindingEvent event) {
// 當增加Session時,什么也不做
}
public void valueUnbound(HttpSessionBindingEvent event) {
// 當從Session刪除或當Session結束時,關閉數據連接。
try {
if (con != null) {
con.rollback(); // 放棄所有未發送數據
con.close();
}
}
catch (SQLException e) {
// 錯誤處理代碼
}
}
private Connection con = null;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线观| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美性xxxxx极品| 国产成人福利网站| 大胆人体色综合| 国产精品免费一区二区三区都可以| 在线电影中文日韩| 久久精品国产成人精品| 91中文字幕在线观看| 日日狠狠久久偷偷四色综合免费| 国产精品入口福利| 国外成人在线视频| 动漫精品一区二区| 成人精品视频在线| 色综合久久中文字幕综合网小说| 92版电视剧仙鹤神针在线观看| 国产精品久久久久久亚洲影视| 亚洲高清在线观看| 久久香蕉国产线看观看av| 国产999精品视频| 亚洲伊人一本大道中文字幕| 久久久www成人免费精品| 中文综合在线观看| 欧美亚洲在线播放| 国产精品18久久久久久首页狼| 亚洲va久久久噜噜噜久久天堂| 日韩暖暖在线视频| 91综合免费在线| 日韩国产高清视频在线| 国产精品美女久久久久av超清| 日本亚洲欧洲色α| 亚洲一区二区久久久久久久| 91免费欧美精品| 亚洲精品久久7777777| 91九色国产视频| 成人黄色免费看| 国产日韩中文字幕| 亚洲一区中文字幕在线观看| 午夜精品久久久久久久99热浪潮| 国产精品69精品一区二区三区| 日韩理论片久久| 欧美成人免费一级人片100| 国产精品偷伦一区二区| 亚洲欧美一区二区三区情侣bbw| 97在线看福利| 91九色视频在线| 欧美高跟鞋交xxxxxhd| 综合网中文字幕| 欧美丰满少妇xxxxx| 欧美日韩一区二区三区| 亚洲欧美日韩精品| 日韩精品极品视频| 亚洲欧美一区二区三区久久| 国产一区二区三区直播精品电影| 亚洲精品免费在线视频| 国产精品视频公开费视频| 欧美精品免费在线观看| 亚洲人成电影在线播放| 亚洲毛片在线观看.| 日韩成人在线视频网站| 91超碰caoporn97人人| 欧美日韩精品在线| 亚洲成人久久久久| 国产精品一区av| 欧美午夜影院在线视频| 91影院在线免费观看视频| 色哟哟亚洲精品一区二区| 国产精品十八以下禁看| 亚洲最大激情中文字幕| 少妇av一区二区三区| 久久久噜噜噜久久中文字免| 国产精品美女免费看| 久久久这里只有精品视频| 亚洲欧美综合v| 中文字幕欧美日韩在线| 91性高湖久久久久久久久_久久99| 欧美亚洲视频在线观看| 日韩av片电影专区| 日韩极品精品视频免费观看| 国产九九精品视频| 亚洲人成自拍网站| 亚洲电影第1页| 欧美黑人狂野猛交老妇| 成人国产精品免费视频| 精品视频—区二区三区免费| 韩曰欧美视频免费观看| 精品欧美国产一区二区三区| 国产精品免费久久久久久| 深夜福利一区二区| 亚洲精品小视频在线观看| 国产suv精品一区二区| 3344国产精品免费看| 日韩精品福利网站| 2019中文字幕在线观看| 亚洲精品日韩在线| 国产精品日日做人人爱| 亚洲午夜女主播在线直播| 精品丝袜一区二区三区| 日韩欧美国产骚| 日韩精品在线看| 伊人久久久久久久久久久| 亚州精品天堂中文字幕| 国外成人免费在线播放| 国产视频一区在线| 欧美一区二区三区精品电影| 欧美精品电影免费在线观看| 琪琪亚洲精品午夜在线| 91精品国产高清久久久久久| 欧美激情中文字幕乱码免费| 国产做受69高潮| 日本道色综合久久影院| 中文字幕日韩综合av| 亚洲第一网中文字幕| 欧美成人午夜视频| 欧美色另类天堂2015| 国产精品日韩av| 精品久久久久久久久中文字幕| 国产精品视频免费在线观看| 亚洲第一页在线| 欧美激情一区二区三区成人| 亚洲在线观看视频网站| 国产成人一区二区三区小说| 日韩激情av在线免费观看| 免费97视频在线精品国自产拍| 亚洲乱亚洲乱妇无码| 国产免费成人av| 色婷婷av一区二区三区在线观看| 欧美一级大片在线观看| 欧美在线性视频| 亚洲裸体xxxx| 欧美极品少妇xxxxⅹ喷水| 欧美激情综合亚洲一二区| 日韩电影第一页| 中文字幕日韩有码| 国产精品久久久久久久午夜| 成人在线免费观看视视频| 亚洲影院色在线观看免费| 亚洲成人免费网站| 国产精品黄色av| 亚洲欧美综合图区| 性亚洲最疯狂xxxx高清| 海角国产乱辈乱精品视频| 欧美精品激情视频| 日韩成人在线免费观看| 国产成人精品久久二区二区91| 久久精品99久久香蕉国产色戒| 欧美巨猛xxxx猛交黑人97人| 欧美性xxxx极品hd欧美风情| 精品久久中文字幕| 国内精品久久久久久| 91色p视频在线| 久久影视电视剧凤归四时歌| 91精品国产色综合久久不卡98| 日本国产精品视频| 欧美中文在线观看| 久久精品国产69国产精品亚洲| 亚洲成人动漫在线播放| 国产精品高清在线观看| 亚洲天堂男人天堂女人天堂| 欧美视频在线观看免费网址| 亚洲成人精品视频| 欧美激情精品久久久久久免费印度| 国产精品久久久久久久久借妻| 国产精品激情av在线播放|