Java 數(shù)據(jù)庫連接池詳解及簡單實例
Java 數(shù)據(jù)庫連接池詳解
數(shù)據(jù)庫連接池的原理是:
連接池基本的思想是在系統(tǒng)初始化的時候,將數(shù)據(jù)庫連接作為對象存儲在內(nèi)存中,當用戶需要訪問數(shù)據(jù)庫時,并非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接對象。使用完畢后,用戶也并非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使用。而連接的建立、斷開都由連接池自身來管理。同時,還可以通過設置連接池的參數(shù)來控制連接池中的初始連接數(shù)、連接的上下限數(shù)以及每個連接的最大使用次數(shù)、最大空閑時間等等。也可以通過其自身的管理機制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。
常用的數(shù)據(jù)庫連接池:
常用的數(shù)據(jù)庫連接池有JNDI,C3p0,Apache 的Jakarta 和DBCPBoneCP其中,sping框架依賴的第三方使用了c3p0和dbcp兩種方式;而bonecp號稱是速度最快的數(shù)據(jù)庫連接池。JNDI方式創(chuàng)建實現(xiàn)的datasource是真正實現(xiàn)了javax.sql.datasource(其他的三種方式都不是)
現(xiàn)在我們主要來介紹如何使用JNDI方式, 這種方式,是由web服務器(例如:tomcat,weblogic,websphere,tomcat),實現(xiàn)了java.sql.datasource。由web服務器負責初始化數(shù)據(jù)源,創(chuàng)建connection,分配,管理connection。由于本身是由web服務器實現(xiàn)的功能,因此不需要在項目中引入特別的jar包,但是需要在服務器的某些配置文件中增加相關的配置。下面,以Tomcat服務器(數(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ù)驅動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表示由容器來創(chuàng)建和管理Resource,Application表示由web應用來創(chuàng)建和管理Resource。
3)type: 指定Resource的Java類名。
4)username:指定連接數(shù)據(jù)庫的用戶名。
5)password:指定連接數(shù)據(jù)庫的口令。
6)driverClassName:指定連接數(shù)據(jù)庫的JDBC驅動器中的Driver實現(xiàn)類的名字。
7)url:指定連接數(shù)據(jù)庫的URL,127.0.0.1是要連接的數(shù)據(jù)庫服務器的ip,3306是數(shù)據(jù)庫服務器端口,BookDB是數(shù)據(jù)庫名稱。
8)maxActive:指定數(shù)據(jù)庫連接池中處于活動狀態(tài)的數(shù)據(jù)庫連接的最大數(shù)目,取值為0,表示不受限制。
9)maxIdle:指定數(shù)據(jù)庫連接池中處于空閑狀態(tài)的數(shù)據(jù)庫連接的最大數(shù)目,取值為0,表示不受限制。
10)maxWait:指定數(shù)據(jù)庫連接池中的數(shù)據(jù)庫連接處于空閑狀態(tài)的最長時間(以毫秒為單位),超過這一時間,將會拋出異常。取值為-1,表示可以無限期等待。
maxActive="100"
表示并發(fā)情況下最大可從連接池中獲取的連接數(shù)。如果數(shù)據(jù)庫不是單獨,供一個應用使用,通過設置maxActive參數(shù)可以避免某個應用無限制的獲取連接對其他應用造成影響,如果一個數(shù)據(jù)庫只是用來支持一個應用那么maxActive理論上可以設置成該數(shù)據(jù)庫可以支撐的最大連接數(shù)。maxActive只是表示通過連接池可以并發(fā)的獲取的最大連接數(shù)。連接的獲取與釋放是雙向,當應用程序并發(fā)請求連接池時,連接池就需要從數(shù)據(jù)庫獲取連接,那么但應用程序使用完連接并將連接歸還給連接池時,連接池是否也同時將連接歸還給數(shù)據(jù)庫呢?很顯然答案是否定的,如果那樣的話連接池就變得多此一舉,不但不能提高性能,反而會降低性能,那么但應用成歸還連接后,連接池如何處理呢?
maxIdle="30"
如果在并發(fā)時達到了maxActive=100,那么連接池就必須從數(shù)據(jù)庫中獲取100個連接來供應用程序使用,當應用程序關閉連接后,由于maxIdle=30,因此并不是所有的連接都會歸還給數(shù)據(jù)庫,將會有30個連接保持在連接池種中,狀態(tài)為空閑。
minIdle=”2”
最小默認情況下并不生效,它的含義是當連接池中的連接少有minIdle,系統(tǒng)監(jiān)控線程將啟動補充功能,一般情況下我們并不啟動補充線程。
問題:如何設置maxActive和maxIdle?
理論上講maxActive應該設置成應用的最大并發(fā)數(shù),這樣一來即便是在最大并發(fā)的情況下,應用依然能夠從連接池中獲取連接,但是困難時的是我們很難準確估計到最大并發(fā)數(shù),設置成最大并發(fā)數(shù)是一種最優(yōu)的服務質量保證。
maxIdle對應的連接,實際上是連接池保持的長連接,這也是連接池發(fā)揮優(yōu)勢的部分,理論上講保持較多的長連接,在應用請求時可以更快的響應,但是過多的連接保持,反而會消耗數(shù)據(jù)庫大量的資源,因此maxIdle也并不是越大越好,同上例我們建議將 maxIdle設置成50-100中靠近50的數(shù)字,例如55。這樣就能在兼顧最大并發(fā)同時,保持較少的數(shù)據(jù)庫連接,而且在絕大多情況,能夠為應用程序提供最快的相應速度。
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環(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"); //輸出查詢結果 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>"); //關閉結果集、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,即可查看結果
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- java配置dbcp連接池(數(shù)據(jù)庫連接池)示例分享
- java配置數(shù)據(jù)庫連接池的方法步驟
- Java數(shù)據(jù)庫連接池的幾種配置方法(以MySQL數(shù)據(jù)庫為例)
- java實現(xiàn)mongodb的數(shù)據(jù)庫連接池
- Java實現(xiàn)數(shù)據(jù)庫連接池簡易教程
- java使用dbcp2數(shù)據(jù)庫連接池
- Java實現(xiàn)數(shù)據(jù)庫連接池的方法
- java數(shù)據(jù)庫連接池和數(shù)據(jù)庫連接示例
- 淺談常用Java數(shù)據(jù)庫連接池(小結)
- Java數(shù)據(jù)庫連接池技術的入門教程
相關文章
javabean servlet jsp實現(xiàn)分頁功能代碼解析
這篇文章主要為大家詳細解析了javabean servlet jsp實現(xiàn)分頁功能代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09Java數(shù)據(jù)結構之簡單鏈表的定義與實現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結構之簡單鏈表的定義與實現(xiàn)方法,簡單描述了鏈接的概念、原理,并結合實例形式分析了java定義與使用鏈表的相關步驟與操作技巧,需要的朋友可以參考下2017-10-10Kafka常用命令之kafka-console-consumer.sh解讀
這篇文章主要介紹了Kafka常用命令之kafka-console-consumer.sh解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03SpringBoot+kaptcha實現(xiàn)驗證碼花式玩法詳解
這篇文章主要想和大家聊聊kaptcha的用法,畢竟這個已經(jīng)有16年歷史的玩意還在有人用,說明它的功能還是相當強大的,感興趣的小伙伴可以了解一下2022-05-05詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息
這篇文章主要為大家介紹了SpringBoot-Start組件開發(fā)之記錄接口日志信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04mybatis-plus saveOrUpdateBatch踩坑記錄
這篇文章主要介紹了mybatis-plus saveOrUpdateBatch踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12教你從頭開始用JAVA創(chuàng)建一個自己的簡單API并實現(xiàn)第三方調(diào)用
在日常開發(fā)的時候,經(jīng)常會遇到需要調(diào)用別人的接口的場景,下面這篇文章主要給大家介紹了關于如何從頭開始用JAVA創(chuàng)建一個自己的簡單API并實現(xiàn)第三方調(diào)用的相關資料,需要的朋友可以參考下2023-12-12