Java資料庫連接池學習

來源:互聯網
上載者:User

資料庫連接池的原理是:

串連池基本的思想是在系統初始化的時候,將資料庫連接作為Object Storage Service在記憶體中,當使用者需要訪問資料庫時,並非建立一個新的串連,而是從串連池中取出一個已建立的空閑連線物件。使用完畢後,使用者也並非將串連關閉,而是將串連放回串連池中,以供下一個請求訪問使用。而串連的建立、斷開都由串連池自身來管理。同時,還可以通過設定串連池的參數來控制串連池中的初始串連數、串連的上下限數以及每個串連的最大使用次數、最大空閑時間等等。也可以通過其自身的管理機制來監視資料庫連接的數量、使用方式等。

常用的資料庫連接池:

常用的資料庫連接池有JNDI,C3p0,Apache 的Jakarta 和DBCPBoneCP其中,sping架構依賴的第三方使用了c3p0和dbcp兩種方式;而bonecp號稱是速度最快的資料庫連接池。JNDI方式建立實現的datasource是真正實現了javax.sql.datasource(其他的三種方式都不是)

現在我們主要來介紹如何使用JNDI方式, 這種方式,是由web伺服器(例如:tomcat,weblogic,websphere,tomcat),實現了java.sql.datasource。由web伺服器負責初始化資料來源,建立connection,分配,管理connection。由於本身是由web伺服器實現的功能,因此不需要在項目中引入特別的jar包,但是需要在伺服器的某些設定檔中增加相關的配置。下面,以Tomcat伺服器(資料庫為MYSQL)為例,講述這種方式的使用。

資料庫的建立與初始化資料:

create table test(id INT PRIMARY KEY,name VARCHAR(10),price FLOAT)INSERT INTO test VALUES(1,'English',22.2);INSERT INTO test VALUES(2,'Math',78.9);INSERT INTO test VALUES(3,'History',77.9);

 

1.將 資料驅動mysql-connector-java-5.0.3-bin.jar 放入tomcat目錄下的lib中

2.修改tomcat的conf下的context.xml檔案,增加Resource的配置的支援

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/ewsdb" username="root" password="admin" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/test1"/>

<Resource屬性說明>

1)name:指定Resource的JNDI名字。

2)auth:指定管理Resource的Manager,它有兩個可選值:Container和Application。Container表示由容器來建立和管理Resource,Application表示由web應用來建立和管理Resource。

3)type: 指定Resource的Java類名。

4)username:指定串連資料庫的使用者名稱。

5)password:指定串連資料庫的口令。

6)driverClassName:指定串連資料庫的JDBC磁碟機中的Driver實作類別的名字。

7)url:指定串連資料庫的URL,127.0.0.1是要串連的資料庫伺服器的ip,3306是資料庫伺服器連接埠,BookDB是資料庫名稱。

8)maxActive:指定資料庫連接池中處於活動狀態的資料庫連接的最大數目,取值為0,表示不受限制。

9)maxIdle:指定資料庫連接池中處於空閑狀態的資料庫連接的最大數目,取值為0,表示不受限制。

10)maxWait:指定資料庫連接池中的資料庫連接處於空閑狀態的最長時間(以毫秒為單位),超過這一時間,將會拋出異常。取值為-1,表示可以無限期等待。

maxActive="100"

表示並發情況下最大可從串連池中擷取的串連數。如果資料庫不是單獨,供一個應用使用,通過設定maxActive參數可以避免某個應用無限制的擷取串連對其他應用造成影響,如果一個資料庫只是用來支援一個應用那麼maxActive理論上可以設定成該資料庫可以支撐的最大串連數。maxActive只是表示通過串連池可以並發的擷取的最大串連數。串連的擷取與釋放是雙向,當應用程式並發請求串連池時,串連池就需要從資料庫擷取串連,那麼但應用程式使用完串連並將串連歸還給串連池時,串連池是否也同時將串連歸還給資料庫呢?很顯然答案是否定的,如果那樣的話串連池就變得多此一舉,不但不能提高效能,反而會降低效能,那麼但應用成歸還串連後,串連池如何處理呢?

maxIdle="30"

如果在並發時達到了maxActive=100,那麼串連池就必須從資料庫中擷取100個串連來供應用程式使用,當應用程式關閉串連後,由於maxIdle=30,因此並不是所有的串連都會歸還給資料庫,將會有30個串連保持在串連池種中,狀態為空白閑。

minIdle=”2”

最小預設情況下並不生效,它的含義是當串連池中的串連少有minIdle,系統監控線程將啟動補充功能,一般情況下我們並不啟動補充線程。

問題:如何設定maxActive和maxIdle?

理論上講maxActive應該設定成應用的最大並發數,這樣一來即便是在最大並發的情況下,應用依然能夠從串連池中擷取串連,但是困難時的是我們很難準確估計到最大並發數,設定成最大並發數是一種最優的服務品質保證。

maxIdle對應的串連,實際上是串連池保持的長串連,這也是串連池發揮優勢的部分,理論上講保持較多的長串連,在應用請求時可以更快的響應,但是過多的串連保持,反而會消耗資料庫大量的資源,因此maxIdle也並不是越大越好,同上例我們建議將 maxIdle設定成50-100中靠近50的數字,例如55。這樣就能在兼顧最大並發同時,保持較少的資料庫連接,而且在絕大多情況,能夠為應用程式提供最快的相應速度。

3.開啟應用程式的 Web.xml檔案,添加以下配置

<resource-ref><description>DB Connection</description><res-ref-name>jdbc/ewsdb</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>

 

<resource-ref>屬性說明:

1)description:對所引用的資源的說明。

2)res-ref-name:指定所引用資源的JNDI名字,與<Resource>元素中的name屬性對應。

3)res-type:指定所引用資源的類名,與<Resource>元素中的type屬性對應。

4)res-auth:指定管理所引用資源的Manager,與<Resource>元素中的auth屬性對應

4. 編寫使用java代碼,並放在tomcat環境下使用,如下

建立JSP範例:MyJsp.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><%@ page import="java.io.*" %><%@ page import="java.util.*" %><%@ page import="java.sql.*" %><%@ page import="javax.sql.*" %><%@ page import="javax.naming.*" %><html><head><title>Tomcat下JNDI資料庫連接池</title></head><body> <% try{  Connection conn;  Statement stmt;  ResultSet rs;  Context ctx = new InitialContext();  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/ewsdb");  conn = ds.getConnection();  stmt = conn.createStatement();  //查詢記錄  rs = stmt.executeQuery("select ID,NAME,PRICE from test");  //輸出查詢結果  out.println("<table border=1 width=400>");  while (rs.next()){   String col1 = rs.getString(1);   String col2 = rs.getString(2);   float col3 = rs.getFloat(3);   //列印顯示的資料   out.println("<tr><td>"+col1+"</td><td>"+col2+"</td><td>"+col3+"</td></tr>");}   out.println("</table>");  //關閉結果集、SQL聲明和資料庫連接  rs.close();  stmt.close();  conn.close(); }catch(Exception e){  out.println(e.getMessage());  e.printStackTrace(); } %></body></html>

 在瀏覽器中輸入http://localhost:8080/test/MyJsp.jsp,即可查看結果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.