1. 程式人生 > >Hibernate使用資料庫連線池

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" />//標註編碼不能用&,要用&amp;如:url="jdbc:mysql://localhost:3306/bookshop?useUnicode=true&amp;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。