亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 0050.htm

?? JspServlet教程專欄 對javaservlet講述的非常詳細
?? HTM
字號:
<html>

<head>
<title>新時代軟件教程:操作系統 主頁制作 服務器 設計軟件 網絡技術 編程語言 文字編輯</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋體}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1  {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
    <p align="center"><big><strong>用連接池提高Servlet訪問數據庫的效率(下)</strong></big></p>

<div align="right">(文/好兵)</div>

<br>
三、類DBConnectionPool說明
<br>
<br>
該類在209至345行實現,它表示指向某個數據庫的連接池。數據庫由JDBC URL標識。一個JDBC URL由三部分組成:協議標識(總是jdbc),驅動程序標識(如 odbc、idb、oracle等),數據庫標識(其格式依賴于驅動程序)。例如,jdbc:odbc:demo,即是一個指向demo數據庫的JDBC URL,而且訪問該數據庫要使用JDBC-ODBC驅動程序。每個連接池都有一個供客戶程序使用的名字以及可選的用戶帳號、密碼、最大連接數限制。如果Web應用程序所支持的某些數據庫操作可以被所有用戶執行,而其它一些操作應由特別許可的用戶執行,則可以為兩類操作分別定義連接池,兩個連接池使用相同的JDBC URL,但使用不同的帳號和密碼。
<br>
類DBConnectionPool的建構函數需要上述所有數據作為其參數。如222至238行所示,這些數據被保存為它的實例變量:
<br>
如252至283行、285至305行所示, 客戶程序可以使用DBConnectionPool類提供的兩個方法獲取可用連接。兩者的共同之處在于:如連接池中存在可用連接,則直接返回,否則創建新的連接并返回。如果沒有可用連接且已有連接總數等于最大限制數,第一個方法將直接返回null,而第二個方法將等待直到有可用連接為止。
<br>
所有的可用連接對象均登記在名為freeConnections的向量(Vector)中。如果向量中有多于一個的連接,getConnection()總是選取第一個。同時,由于新的可用連接總是從尾部加入向量,從而使得數據庫連接由于長時間閑置而被關閉的風險減低到最小程度。
<br>
第一個getConnection()在返回可用連接給客戶程序之前,調用了isClosed()方法驗證連接仍舊有效。如果該連接被關閉或觸發異常,getConnection()遞歸地調用自己以嘗試獲取另外的可用連接。如果在向量freeConnections中不存在任何可用連接,getConnection()方法檢查是否已經指定最大連接數限制。如已經指定,則檢查當前連接數是否已經到達極限。此處maxConn為0表示沒有限制。如果沒有指定最大連接數限制或當前連接數小于該值,該方法嘗試創建新的連接。如創建成功,則增加已使用連接的計數并返回,否則返回空值。
<br>
如325至345行所示,創建新連接由newConnection()方法實現。創建過程與是否已經指定數據庫帳號、密碼有關。
<br>
JDBC的DriverManager類提供多個getConnection()方法,這些方法要用到JDBC URL與其它一些參數,如用戶帳號和密碼等。DriverManager將使用指定的JDBC URL確定適合于目標數據庫的驅動程序及建立連接。
<br>
在285至305行實現的第二個getConnection()方法需要一個以毫秒為單位的時間參數,該參數表示客戶程序能夠等待的最長時間。建立連接的具體操作仍舊由第一個getConnection()方法實現。
<br>
該方法執行時先將startTime初始化為當前時間。在while循環中嘗試獲得一個連接。如果失敗,則以給定的時間值為參數調用wait()。wait()的返回可能是由于其它線程調用notify()或notifyAll(),也可能是由于預定時間已到。為找出wait()返回的真正原因,程序用當前時間減開始時間(startTime),如差值大于預定時間則返回空值,否則再次調用getConnection()。
<br>
把空閑的連接登記到連接池由240至250行的freeConnection()方法實現,它的參數為返回給連接池的連接對象。該對象被加入到freeConnections向量的末尾,然后減少已使用連接計數。調用notifyAll()是為了通知其它正在等待可用連接的線程。
<br>
許多Servlet引擎為實現安全關閉提供多種方法。數據庫連接池需要知道該事件以保證所有連接能夠正常關閉。DBConnectionManager類負協調整個關閉過程,但關閉連接池中所有連接的任務則由DBConnectionPool類負責。在307至323行實現的release()方法供DBConnectionManager調用。該方法遍歷freeConnections向量并關閉所有連接,然后從向量中刪除這些連接。
<br>
<br>
<br>
四、類DBConnectionManager 說明
<br>
<br>
該類只能創建一個實例,其它對象能夠調用其靜態方法(也稱為類方法)獲得該唯一實例的引用。如031至036行所示,DBConnectionManager類的建構函數是私有的,這是為了避免其它對象創建該類的實例。
<br>
DBConnectionManager類的客戶程序可以調用getInstance()方法獲得對該類唯一實例的引用。如018至029行所示,類的唯一實例在getInstance()方法第一次被調用期間創建,此后其引用就一直保存在靜態變量instance中。每次調用getInstance()都增加一個DBConnectionManager的客戶程序計數。即,該計數代表引用DBConnectionManager唯一實例的客戶程序總數,它將被用于控制連接池的關閉操作。
<br>
該類實例的初始化工作由146至168行之間的私有方法init()完成。其中 getResourceAsStream()方法用于定位并打開外部文件。外部文件的定位方法依賴于類裝載器的實現。標準的本地類裝載器查找操作總是開始于類文件所在路徑,也能夠搜索CLASSPATH中聲明的路徑。db.properties是一個屬性文件,它包含定義連接池的鍵-值對。可供定義的公用屬性如下:
<br>
<br>
drivers 以空格分隔的JDBC驅動程序類列表
<br>
logfile 日志文件的絕對路徑
<br>
<br>
其它的屬性和特定連接池相關,其屬性名字前應加上連接池名字:
<br>
<br>
&lt;poolname&gt;.url 數據庫的 JDBC URL 
<br>
&lt;poolname&gt;.maxconn 允許建立的最大連接數,0表示沒有限制 
<br>
&lt;poolname&gt;.user 用于該連接池的數據庫帳號
<br>
&lt;poolname&gt;.password 相應的密碼
<br>
<br>
其中url屬性是必需的,而其它屬性則是可選的。數據庫帳號和密碼必須合法。用于Windows平臺的db.properties文件示例如下:
<br>
<br>
drivers=sun.jdbc.odbc.JdbcOdbcDriver jdbc.idbDriver
<br>
logfile=D:\\user\\src\\java\\DBConnectionManager\\log.txt
<br>
<br>
idb.url=jdbc:idb:c:\\local\\javawebserver1.1\\db\\db.prp
<br>
idb.maxconn=2
<br>
<br>
access.url=jdbc:odbc:demo
<br>
access.user=demo
<br>
access.password=demopw
<br>
<br>
注意在Windows路徑中的反斜杠必須輸入2個,這是由于屬性文件中的反斜杠同時也是一個轉義字符。
<br>
init()方法在創建屬性對象并讀取db.properties文件之后,就開始檢查logfile屬性。如果屬性文件中沒有指定日志文件,則默認為當前目錄下的DBConnectionManager.log文件。如日志文件無法使用,則向System.err輸出日志記錄。
<br>
裝載和注冊所有在drivers屬性中指定的JDBC驅動程序由170至192行之間的loadDrivers()方法實現。該方法先用StringTokenizer將drivers屬性值分割為對應于驅動程序名稱的字符串,然后依次裝載這些類并創建其實例,最后在 DriverManager中注冊該實例并把它加入到一個私有的向量drivers。向量drivers將用于關閉服務時從DriverManager取消所有JDBC 驅動程序的注冊。
<br>
init()方法的最后一個任務是調用私有方法createPools()創建連接池對象。如109至142行所示,createPools()方法先創建所有屬性名字的枚舉對象(即Enumeration對象,該對象可以想象為一個元素系列,逐次調用其nextElement()方法將順序返回各元素),然后在其中搜索名字以“.url”結尾的屬性。對于每一個符合條件的屬性,先提取其連接池名字部分,進而讀取所有屬于該連接池的屬性,最后創建連接池對象并把它保存在實例變量pools中。散列表(Hashtable類 )pools實現連接池名字到連接池對象之間的映射,此處以連接池名字為鍵,連接池對象為值。
<br>
為便于客戶程序從指定連接池獲得可用連接或將連接返回給連接池,類DBConnectionManager提供了方法getConnection()和freeConnection()。所有這些方法都要求在參數中指定連接池名字,具體的連接獲取或返回操作則調用對應的連接池對象完成。它們的實現分別在051至064行、066至080行、038至049行。
<br>
如082至107行所示,為實現連接池的安全關閉,DBConnectionManager提供了方法release()。在上面我們已經提到,所有DBConnectionManager的客戶程序都應該調用靜態方法getInstance()以獲得該管理器的引用,此調用將增加客戶程序計數。客戶程序在關閉時調用release()可以遞減該計數。當最后一個客戶程序調用release(),遞減后的引用計數為0,就可以調用各個連接池的release()方法關閉所有連接了。管理類release()方法最后的任務是撤銷所有JDBC驅動程序的注冊。
<br>
<br>
<br>
五、Servlet使用連接池示例
<br>
<br>
Servlet API所定義的Servlet生命周期類如:
<br>
<br>
1) 創建并初始化Servlet(init()方法)。
<br>
2) 響應客戶程序的服務請求(service()方法)。
<br>
3) Servlet終止運行,釋放所有資源(destroy()方法)。
<br>
<br>
本例演示連接池應用,上述關鍵步驟中的相關操作為:
<br>
<br>
1) 在init(),用實例變量connMgr 保存調用DBConnectionManager.getInstance()所返回的引用。
<br>
2) 在service(),調用getConnection(),執行數據庫操作,用freeConnection()將連接返回給連接池。
<br>
3) 在destroy(),調用release()關閉所有連接,釋放所有資源。
<br>
<br>
示例程序清單如下:
<br>
<br>
import java.io.*;
<br>
import java.sql.*;
<br>
import javax.servlet.*;
<br>
import javax.servlet.http.*;
<br>
public class TestServlet extends HttpServlet {
<br>
private DBConnectionManager connMgr;
<br>
<br>
public void init(ServletConfig conf) throws ServletException {
<br>
super.init(conf);
<br>
connMgr = DBConnectionManager.getInstance();
<br>
}
<br>
<br>
public void service(HttpServletRequest req, HttpServletResponse res) 
<br>
throws IOException {
<br>
<br>
res.setContentType(&quot;text/html&quot;);
<br>
PrintWriter out = res.getWriter();
<br>
Connection con = connMgr.getConnection(&quot;idb&quot;);
<br>
if (con == null) {
<br>
out.println(&quot;不能獲取數據庫連接.&quot;);
<br>
return;
<br>
}
<br>
ResultSet rs = null;
<br>
ResultSetMetaData md = null;
<br>
Statement stmt = null;
<br>
try {
<br>
stmt = con.createStatement();
<br>
rs = stmt.executeQuery(&quot;SELECT * FROM EMPLOYEE&quot;);
<br>
md = rs.getMetaData();
<br>
out.println(&quot;&lt;H1&gt;職工數據&lt;/H1&gt;&quot;);
<br>
while (rs.next()) {
<br>
out.println(&quot;&lt;BR&gt;&quot;);
<br>
for (int i = 1; i &lt; md.getColumnCount(); i++) {
<br>
out.print(rs.getString(i) + &quot;, &quot;);
<br>
}
<br>
}
<br>
stmt.close();
<br>
rs.close();
<br>
}
<br>
catch (SQLException e) {
<br>
e.printStackTrace(out);
<br>
}
<br>
connMgr.freeConnection(&quot;idb&quot;, con);
<br>
}
<br>
<br>
public void destroy() {
<br>
connMgr.release();
<br>
super.destroy();
<br>
}
<br>
} 
<br>

  </table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕免费不卡| 欧美a级一区二区| 国产精品久久毛片a| 久久精品无码一区二区三区| 久久夜色精品一区| 久久综合色播五月| 亚洲精品日韩专区silk| 国产精品传媒视频| 亚洲视频1区2区| 一区二区三区四区五区视频在线观看 | 国产蜜臀97一区二区三区| 久久久久久影视| 国产欧美视频一区二区| 国产精品午夜免费| 亚洲区小说区图片区qvod| 一区二区三区精品| 偷窥少妇高潮呻吟av久久免费| 亚洲成av人影院| 麻豆91在线观看| 精品中文字幕一区二区| 国产激情偷乱视频一区二区三区| 成人国产电影网| 91啦中文在线观看| 欧美日韩国产影片| 精品成a人在线观看| 欧美国产精品专区| 一区二区三区丝袜| 日本少妇一区二区| 国产精品一区一区三区| 色综合中文综合网| 日韩av成人高清| 国内精品久久久久影院薰衣草| 成人午夜视频免费看| 在线欧美小视频| 精品国产乱码久久久久久图片| 中文字幕 久热精品 视频在线 | 国产精品18久久久久久久久| a美女胸又www黄视频久久| 欧美综合一区二区| 精品国产区一区| 亚洲欧洲日韩一区二区三区| 午夜激情久久久| 国产毛片精品视频| 欧美亚洲综合在线| 久久色视频免费观看| 亚洲人成影院在线观看| 免费观看在线色综合| 97久久久精品综合88久久| 欧美电影在哪看比较好| 欧美国产一区在线| 五月天亚洲婷婷| 成人免费的视频| 日韩三级.com| 国产精品欧美精品| 免费观看日韩av| 日本韩国精品一区二区在线观看| 欧美一区日本一区韩国一区| 国产精品第四页| 蜜臀av一区二区| 91欧美一区二区| 久久婷婷国产综合精品青草| 亚洲国产cao| 99久久婷婷国产综合精品| 精品久久国产老人久久综合| 亚洲在线免费播放| www.日韩av| 精品国产乱码久久久久久老虎| 一区二区三区中文免费| 国产福利一区二区三区在线视频| 777久久久精品| 亚洲久草在线视频| 成人免费观看视频| 久久久精品国产99久久精品芒果| 视频一区二区三区在线| 99riav久久精品riav| 国产清纯在线一区二区www| 另类小说图片综合网| 欧美午夜精品久久久| 国产精品久久久久久久久久免费看| 久久爱www久久做| 欧美久久久久免费| 亚洲福利视频一区二区| 一本在线高清不卡dvd| 中文字幕av一区二区三区高| 国产精品一区二区你懂的| 日韩欧美国产精品一区| 日韩高清一区在线| 欧美肥胖老妇做爰| 五月天精品一区二区三区| 欧美综合一区二区三区| 亚洲尤物视频在线| 一本久久a久久免费精品不卡| 中文字幕av一区 二区| 国产盗摄一区二区三区| 国产亚洲一区二区三区在线观看 | 丰满岳乱妇一区二区三区| 久久色在线视频| 国产精品99久久久| 久久久综合九色合综国产精品| 麻豆成人在线观看| 日韩欧美中文字幕公布| 人禽交欧美网站| 欧美大胆人体bbbb| 精品亚洲免费视频| 久久久久高清精品| 国产成人午夜精品影院观看视频| 久久先锋影音av| 成人妖精视频yjsp地址| 国产精品高潮久久久久无| 97久久人人超碰| 亚洲综合色丁香婷婷六月图片| 色88888久久久久久影院野外| 亚洲一区二区成人在线观看| 精品视频1区2区3区| 日本欧美一区二区| 精品国产伦一区二区三区免费| 国产一区中文字幕| 国产精品久久久久aaaa| 91麻豆视频网站| 亚洲丰满少妇videoshd| 日韩三级.com| 国产aⅴ综合色| 亚洲精品写真福利| 91精品国产高清一区二区三区| 韩国av一区二区| 国产精品视频一二三| 色琪琪一区二区三区亚洲区| 亚洲综合在线五月| 日韩精品专区在线影院观看| 国产乱码精品一区二区三区忘忧草| 中文幕一区二区三区久久蜜桃| 94色蜜桃网一区二区三区| 无码av免费一区二区三区试看 | 欧美一区二区二区| 国产在线不卡一卡二卡三卡四卡| 欧美国产一区二区| 91国在线观看| 蜜臀av一级做a爰片久久| 日韩免费观看高清完整版| 成人免费av资源| 视频在线在亚洲| 国产欧美日韩三区| 欧美性videosxxxxx| 精品一区二区三区在线视频| 国产精品久久久久永久免费观看| 欧美最新大片在线看| 精品一区二区精品| 亚洲人精品午夜| 欧美xxxxxxxx| 91欧美激情一区二区三区成人| 免费在线观看不卡| 18欧美乱大交hd1984| 日韩一级成人av| 91一区二区在线| 精品一区二区日韩| 一级日本不卡的影视| 久久久www成人免费无遮挡大片| 色偷偷久久人人79超碰人人澡| 韩国av一区二区三区在线观看| 亚洲综合一二区| 国产精品久久久久久久久免费樱桃| 欧美一区二区福利在线| 色综合久久久久综合体桃花网| 国内一区二区视频| 午夜欧美2019年伦理| 国产精品视频一区二区三区不卡| 日韩一级在线观看| 在线观看国产精品网站| 国产成人综合在线观看| 婷婷国产在线综合| 亚洲精品中文在线观看| 久久久国产精华| 欧美一区欧美二区| 欧美三级日韩三级| 97精品电影院| 国产a级毛片一区| 国产综合色精品一区二区三区| 亚洲大片一区二区三区| 最新不卡av在线| 国产亚洲一区二区三区| 日韩欧美国产电影| 欧美日韩国产经典色站一区二区三区| 成人夜色视频网站在线观看| 国产真实乱子伦精品视频| 天天色图综合网| 亚洲一区二区三区四区的| 国产精品久久福利| 久久精品一区二区| 欧美精品一区二区精品网| 欧美群妇大交群的观看方式 | 中文字幕日本不卡| 久久亚洲综合av| 日韩欧美国产午夜精品| 91麻豆精品国产自产在线| 欧美综合欧美视频| 色婷婷av一区二区三区软件| av欧美精品.com| 波多野洁衣一区| 不卡高清视频专区| 成人小视频在线|