国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java 數(shù)據(jù)庫連接池詳解及簡單實(shí)例

2019-11-26 13:23:31
字體:
供稿:網(wǎng)友

Java 數(shù)據(jù)庫連接池詳解

數(shù)據(jù)庫連接池的原理是:

連接池基本的思想是在系統(tǒng)初始化的時(shí)候,將數(shù)據(jù)庫連接作為對(duì)象存儲(chǔ)在內(nèi)存中,當(dāng)用戶需要訪問數(shù)據(jù)庫時(shí),并非建立一個(gè)新的連接,而是從連接池中取出一個(gè)已建立的空閑連接對(duì)象。使用完畢后,用戶也并非將連接關(guān)閉,而是將連接放回連接池中,以供下一個(gè)請(qǐng)求訪問使用。而連接的建立、斷開都由連接池自身來管理。同時(shí),還可以通過設(shè)置連接池的參數(shù)來控制連接池中的初始連接數(shù)、連接的上下限數(shù)以及每個(gè)連接的最大使用次數(shù)、最大空閑時(shí)間等等。也可以通過其自身的管理機(jī)制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。

常用的數(shù)據(jù)庫連接池:

常用的數(shù)據(jù)庫連接池有JNDI,C3p0,Apache 的Jakarta 和DBCPBoneCP其中,sping框架依賴的第三方使用了c3p0和dbcp兩種方式;而bonecp號(hào)稱是速度最快的數(shù)據(jù)庫連接池。JNDI方式創(chuàng)建實(shí)現(xiàn)的datasource是真正實(shí)現(xiàn)了javax.sql.datasource(其他的三種方式都不是)

現(xiàn)在我們主要來介紹如何使用JNDI方式, 這種方式,是由web服務(wù)器(例如:tomcat,weblogic,websphere,tomcat),實(shí)現(xiàn)了java.sql.datasource。由web服務(wù)器負(fù)責(zé)初始化數(shù)據(jù)源,創(chuàng)建connection,分配,管理connection。由于本身是由web服務(wù)器實(shí)現(xiàn)的功能,因此不需要在項(xiàng)目中引入特別的jar包,但是需要在服務(wù)器的某些配置文件中增加相關(guān)的配置。下面,以Tomcat服務(wù)器(數(shù)據(jù)庫為MySQL)為例,講述這種方式的使用。

數(shù)據(jù)庫的創(chuàng)建與初始化數(shù)據(jù):

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.將 數(shù)據(jù)驅(qū)動(dòng)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,它有兩個(gè)可選值:Container和Application。Container表示由容器來創(chuàng)建和管理Resource,Application表示由web應(yīng)用來創(chuàng)建和管理Resource。

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

4)username:指定連接數(shù)據(jù)庫的用戶名。

5)password:指定連接數(shù)據(jù)庫的口令。

6)driverClassName:指定連接數(shù)據(jù)庫的JDBC驅(qū)動(dòng)器中的Driver實(shí)現(xiàn)類的名字。

7)url:指定連接數(shù)據(jù)庫的URL,127.0.0.1是要連接的數(shù)據(jù)庫服務(wù)器的ip,3306是數(shù)據(jù)庫服務(wù)器端口,BookDB是數(shù)據(jù)庫名稱。

8)maxActive:指定數(shù)據(jù)庫連接池中處于活動(dòng)狀態(tài)的數(shù)據(jù)庫連接的最大數(shù)目,取值為0,表示不受限制。

9)maxIdle:指定數(shù)據(jù)庫連接池中處于空閑狀態(tài)的數(shù)據(jù)庫連接的最大數(shù)目,取值為0,表示不受限制。

10)maxWait:指定數(shù)據(jù)庫連接池中的數(shù)據(jù)庫連接處于空閑狀態(tài)的最長時(shí)間(以毫秒為單位),超過這一時(shí)間,將會(huì)拋出異常。取值為-1,表示可以無限期等待。

maxActive="100"

表示并發(fā)情況下最大可從連接池中獲取的連接數(shù)。如果數(shù)據(jù)庫不是單獨(dú),供一個(gè)應(yīng)用使用,通過設(shè)置maxActive參數(shù)可以避免某個(gè)應(yīng)用無限制的獲取連接對(duì)其他應(yīng)用造成影響,如果一個(gè)數(shù)據(jù)庫只是用來支持一個(gè)應(yīng)用那么maxActive理論上可以設(shè)置成該數(shù)據(jù)庫可以支撐的最大連接數(shù)。maxActive只是表示通過連接池可以并發(fā)的獲取的最大連接數(shù)。連接的獲取與釋放是雙向,當(dāng)應(yīng)用程序并發(fā)請(qǐng)求連接池時(shí),連接池就需要從數(shù)據(jù)庫獲取連接,那么但應(yīng)用程序使用完連接并將連接歸還給連接池時(shí),連接池是否也同時(shí)將連接歸還給數(shù)據(jù)庫呢?很顯然答案是否定的,如果那樣的話連接池就變得多此一舉,不但不能提高性能,反而會(huì)降低性能,那么但應(yīng)用成歸還連接后,連接池如何處理呢?

maxIdle="30"

如果在并發(fā)時(shí)達(dá)到了maxActive=100,那么連接池就必須從數(shù)據(jù)庫中獲取100個(gè)連接來供應(yīng)用程序使用,當(dāng)應(yīng)用程序關(guān)閉連接后,由于maxIdle=30,因此并不是所有的連接都會(huì)歸還給數(shù)據(jù)庫,將會(huì)有30個(gè)連接保持在連接池種中,狀態(tài)為空閑。

minIdle=”2”

最小默認(rèn)情況下并不生效,它的含義是當(dāng)連接池中的連接少有minIdle,系統(tǒng)監(jiān)控線程將啟動(dòng)補(bǔ)充功能,一般情況下我們并不啟動(dòng)補(bǔ)充線程。

問題:如何設(shè)置maxActive和maxIdle?

理論上講maxActive應(yīng)該設(shè)置成應(yīng)用的最大并發(fā)數(shù),這樣一來即便是在最大并發(fā)的情況下,應(yīng)用依然能夠從連接池中獲取連接,但是困難時(shí)的是我們很難準(zhǔn)確估計(jì)到最大并發(fā)數(shù),設(shè)置成最大并發(fā)數(shù)是一種最優(yōu)的服務(wù)質(zhì)量保證。

maxIdle對(duì)應(yīng)的連接,實(shí)際上是連接池保持的長連接,這也是連接池發(fā)揮優(yōu)勢的部分,理論上講保持較多的長連接,在應(yīng)用請(qǐng)求時(shí)可以更快的響應(yīng),但是過多的連接保持,反而會(huì)消耗數(shù)據(jù)庫大量的資源,因此maxIdle也并不是越大越好,同上例我們建議將 maxIdle設(shè)置成50-100中靠近50的數(shù)字,例如55。這樣就能在兼顧最大并發(fā)同時(shí),保持較少的數(shù)據(jù)庫連接,而且在絕大多情況,能夠?yàn)閼?yīng)用程序提供最快的相應(yīng)速度。

3.打開應(yīng)用程序的 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:對(duì)所引用的資源的說明。

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

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

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

4. 編寫使用java代碼,并放在tomcat環(huán)境下使用,如下

創(chuàng)建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數(shù)據(jù)庫連接池</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"); //輸出查詢結(jié)果 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);  //打印顯示的數(shù)據(jù)  out.println("<tr><td>"+col1+"</td><td>"+col2+"</td><td>"+col3+"</td></tr>");}  out.println("</table>"); //關(guān)閉結(jié)果集、SQL聲明和數(shù)據(jù)庫連接 rs.close(); stmt.close(); conn.close(); }catch(Exception e){ out.println(e.getMessage()); e.printStackTrace(); } %></body></html>

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

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蓬溪县| 申扎县| 婺源县| 漾濞| 城口县| 咸阳市| 贵港市| 正镶白旗| 吴堡县| 确山县| 吴忠市| 大庆市| 富顺县| 龙胜| 根河市| 泰兴市| 新兴县| 邹城市| 昭通市| 台山市| 惠水县| 汨罗市| 新田县| 海林市| 崇左市| 安平县| 理塘县| 龙门县| 阿克| 通山县| 肃宁县| 南乐县| 葵青区| 德惠市| 禹州市| 中阳县| 台中县| 会东县| 土默特右旗| 临武县| 海兴县|