首頁  >  文章  >  Java  >  Java 資料庫連線池詳解及簡單實例

Java 資料庫連線池詳解及簡單實例

高洛峰
高洛峰原創
2017-01-11 14:27:101683瀏覽

Java 資料庫連線池詳解

資料庫連線池的原理是:

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

常用的數據庫連接池:

常用的數據庫連接池有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"
/>

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>

 8f448df49ccb78a46df6973096920559属性说明:

1)description:对所引用的资源的说明。

2)res-ref-name:指定所引用资源的JNDI名字,与41a992d172d4058fa1f494159e00332c元素中的name属性对应。

3)res-type:指定所引用资源的类名,与41a992d172d4058fa1f494159e00332c元素中的type属性对应。

4)res-auth:指定管理所引用资源的Manager,与41a992d172d4058fa1f494159e00332c元素中的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,即可查看结果

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多Java 数据库连接池详解及简单实例相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn