Hibernate使用資料庫連線池
java應用程式開發中,訪問和操作資料庫一般通過JDBC等技術實現,在基於資料庫的web系統中,簡歷資料庫連線的操作將是系統中代價最大的操作之一,通常成為制約網站速度的瓶頸。
使用傳統模式時,必須去管理每一個連線,確保它們能被正確關閉,如果出現程式異常而導致某些連線未能關閉,將導致資料庫系統中的記憶體洩漏,最終將不得不重啟資料庫。
連線池技術:初始化時先簡歷一些連線並存放在連線池中備用,當應用程式需要簡歷資料庫連線,只需從連線池中取一個未使用的連線即可,不必新建,用完放回連線池。連線池可以釋放超過最大空閒時間的資料庫連線,以避免沒有釋放而造成的資料庫連線遺漏。
由於資料來源(DataSource)物件是由Web容器(如Tomcat)提供的,因此無法在程式中使用建立例項的方法產生資料來源物件。這時可以使用JNDI技術獲得資料來源物件。可以把它理解為一種將物件和名字捆綁的技術,物件工廠負責生產出物件,這些物件都與唯一的名字綁在一起,外部資源可以通過名字獲得某物件的引用。
javax.naming包提供了Context介面,該介面提供兩種常用方法:
①void bind(String name,Object object):用於將名字繫結到物件,所有中間上下文和目標上下文都必須已經存在。
②Object lookup(String name):用於檢索指定名字繫結的物件。若name為空,則返回此上下文的一個新例項。
例:Context context=new InitialContext():
DataSource dataSource=(Datasource)context.lookup("java:comp/env/jdbc/bookshop");
//獲取資料庫連線物件
Connection conn=dataSource.getConnection();
配置資料來源名稱
①配置context.xml檔案:在Tomcat根目錄/conf/context.xml檔案中的<Context>節點中新增<Resource>節點:
<Resource name="jdbc/bookshop" auth="Contariner" type="javax.sql.DataSource" maxActive="100" maxIdle="30"
maxWait="10000" username="root" password="123456" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/bookshop" />//標註編碼不能用&,要用&如:url="jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=utf-8"
②建立並配置web.xml檔案
<web-app>節點下新增<resource-ref>子節點:
<resource-ref>
<description>Bookshop DataSource</description>
<res-ref-name>jdbc/bookshop</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
③新增資料庫驅動檔案:通過資料來源訪問資料庫,由於資料來源由Tomcat建立並維護,所以需要將MuSQL的驅動程式複製到Tomcat根目錄的lib下。
在HIbernate中使用資料庫連線池:
在hibernate.cfg.xml檔案的Configuration檢視中,選擇Use JNDI DataSource指定JNDI資料來源,DataSource輸入“java:comp/env/jdbc/bookshop”
Dialect選擇MySQL,其他項可以不選擇。完成配置,進行測試:
專案中建立頁面TestConnectionPool.jsp
<%@ page import="com.hibtest2.TestCriteria %">
<% TestCriteria tc=new TestCriteria(); tc.testCriteria_1(); %>頁面呼叫需要連線資料庫的方法,啟動Tomcat,開啟頁面,控制檯輸出連線資料庫查詢到的資訊。
注意:因為是通過資料來源的連線池開啟的資料庫,所以只能通過Tomcat來連線,在專案中單獨執行測試方法無法再獲得資料庫連線,出錯:Error parsing JNDI name。