日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

开源数据库连接池之Tomcat内置连接池

發(fā)布時(shí)間:2025/7/14 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源数据库连接池之Tomcat内置连接池 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  本篇介紹幾種開源數(shù)據(jù)庫(kù)連接池,同時(shí)重點(diǎn)講述如何使用Tomcat服務(wù)器內(nèi)置的數(shù)據(jù)庫(kù)連接池。

  之前的博客已經(jīng)重點(diǎn)講述了使用數(shù)據(jù)庫(kù)連接池的好處,即是將多次創(chuàng)建連接轉(zhuǎn)變?yōu)橐淮蝿?chuàng)建而使用長(zhǎng)連接模式。這樣能減少數(shù)據(jù)庫(kù)創(chuàng)建連接的消耗。正是由于數(shù)據(jù)庫(kù)連接池的思想非常重要,所以市面上也有很多開源的數(shù)據(jù)庫(kù)連接池供我們使用。主要有以下三個(gè):

  DBCP數(shù)據(jù)庫(kù)連接池

  C3P0 數(shù)據(jù)庫(kù)連接池

  Tomcat內(nèi)置的數(shù)據(jù)庫(kù)連接池(DBCP)

  本篇主要講述C3P0數(shù)據(jù)庫(kù)連接池的使用,關(guān)于另外兩個(gè)數(shù)據(jù)庫(kù)連接池的用法請(qǐng)看《開源數(shù)據(jù)庫(kù)連接池之DBCP》 、《開源數(shù)據(jù)庫(kù)連接池之C3P0》 。如果我們使用這些開源的數(shù)據(jù)庫(kù)連接池,我們就可以省略像前一篇博客中自己創(chuàng)建數(shù)據(jù)庫(kù)連接池的步驟,這樣會(huì)省略我們很多事。

  Tomcat服務(wù)器也內(nèi)置了一個(gè)數(shù)據(jù)庫(kù)連接池,當(dāng)然這個(gè)數(shù)據(jù)庫(kù)連接池其實(shí)也是一個(gè)DBCP數(shù)據(jù)庫(kù)連接池。為什么?因?yàn)門omcat和DBCP都是Apache公司的產(chǎn)品。

JNDI技術(shù)簡(jiǎn)單介紹

  在學(xué)習(xí)Tomcat內(nèi)置的連接池之前,我們先來認(rèn)識(shí)下JNDI技術(shù)。

  JNDI(Java Naming and Directory Interface),Java命名和目錄接口,其對(duì)應(yīng)于J2SE中的javax.naming包。

  這個(gè)JNDI的作用在于,可以將一個(gè)Java對(duì)象放在容器(JNDI容器)中,并為存儲(chǔ)的這個(gè)對(duì)象取一個(gè)名稱,如果某個(gè)程序的方法要想獲得這個(gè)對(duì)象,則使用JNDI并通過存儲(chǔ)的名稱檢索即可獲得。例如這個(gè)JNDI接口定義了Context接口,這是命名服務(wù)執(zhí)行查詢的入口,其lookup方法則為檢索JNDI容器中的對(duì)象。對(duì)于Context來說,又代表了一個(gè)web應(yīng)用,后面我們就會(huì)知道這兩者的羈絆了。

Tomcat內(nèi)置的數(shù)據(jù)庫(kù)連接池

  使用Tomcat服務(wù)器內(nèi)置的數(shù)據(jù)庫(kù)連接池的局限在于,一是這個(gè)工程必須是web工程,而不能是一般的Java工程;二是我們必須在服務(wù)器啟用之前就要將數(shù)據(jù)庫(kù)連接池配置好,這就要看情況了,如果我們?cè)趩⒂肨omcat之前沒配置數(shù)據(jù)庫(kù)連接池的話,那么后面的web應(yīng)用一般也就不會(huì)使用內(nèi)置的數(shù)據(jù)庫(kù)連接池了,畢竟一般服務(wù)器不會(huì)隨便停用。其實(shí)要想使用Tomcat內(nèi)置的數(shù)據(jù)庫(kù)連接池,也很簡(jiǎn)單,就將數(shù)據(jù)庫(kù)的驅(qū)動(dòng)jar包(例如mysql-connector-java-5.1.37.jar)放置在Tomcat的【lib】目錄下

  有了數(shù)據(jù)庫(kù)驅(qū)動(dòng)后,接下來就是如何配置連接池的參數(shù)了,因?yàn)槭且褂肨omcat服務(wù)器,因此這個(gè)配置也會(huì)和服務(wù)器相關(guān)。我們先來看看一段簡(jiǎn)單地配置參數(shù)代碼:

  

  這是一段相當(dāng)于是設(shè)置Tomcat內(nèi)置連接池的配置文件內(nèi)容(當(dāng)然作為示例參數(shù)沒有設(shè)置太多),其中開頭以<context>標(biāo)簽以及name和docBase屬性是否十分熟悉?是的,我們?cè)凇禩omcat詳細(xì)用法學(xué)習(xí)(二)》?和 《Tomcat詳細(xì)用法學(xué)習(xí)(四)》?中都已經(jīng)介紹過了,這個(gè)<context>標(biāo)簽在<Host>標(biāo)簽下,<Host>標(biāo)簽代表在服務(wù)器中設(shè)置的哪個(gè)虛擬主機(jī),而<context>標(biāo)簽代表在某個(gè)虛擬主機(jī)下的某個(gè)具體的web應(yīng)用,name屬性指定這個(gè)web應(yīng)用的名稱,docBase屬性指定該web應(yīng)用的所在具體路徑。也就是說如果我們要配置Tomcat連接池可以在server.xml文件中配置相應(yīng)的連接池參數(shù)。

  當(dāng)然我們們?cè)凇禩omcat詳細(xì)用法學(xué)習(xí)(二)》說過,盡量不要在Tomcat的【conf】目錄中的server.xml文件中配置上面的<context>標(biāo)簽,因?yàn)槊看闻渲枚家貑⒎?wù)器。當(dāng)然也可以在Tomcat目錄下【conf】-->【Catalina】-->【localhost】目錄中,自建一個(gè)xml文件,再在里面寫<context>標(biāo)簽內(nèi)容,將上面圖中的內(nèi)容寫進(jìn)去,這也是《Tomcat詳細(xì)用法學(xué)習(xí)(二)》提到過的。但這里我們?nèi)稳徊挥眠@種要去服務(wù)器目錄下設(shè)置的方法,我們最好的選擇是在web應(yīng)用中就能配置好自己的連接池參數(shù)。

  那么最終我們使用在MyEclipse中創(chuàng)建web工程中的【W(wǎng)ebRoot】下的【META-INF】目錄里創(chuàng)建各自web的Tomcat內(nèi)置連接池配置文件,并且這個(gè)文件必須命名為“context.xml”。

  其實(shí)在Tomcat服務(wù)器的文檔中就介紹了對(duì)于context的幾種配置方式,這點(diǎn)在《Tomcat詳細(xì)用法學(xué)習(xí)(二)》中介紹了,對(duì)于這次我們采用的方式Tomcat文檔是這么介紹的:

  

  也就是說我們?cè)谧约旱膚eb工程下的【META-INF】目錄中創(chuàng)建一個(gè)“context.xml”文件,當(dāng)web工程部署到Tomcat服務(wù)器時(shí),服務(wù)器就會(huì)自動(dòng)將這個(gè)“context.xml”配置文件復(fù)制到Tomcat目錄下【conf】-->【Catalina】-->【localhost】目錄下,同時(shí)將該文件重命名為以web工程名.xml的方式,就跟我們上面說的第二種方式一樣。但這次我們無需再到Tomcat服務(wù)器下去創(chuàng)建xml文件,而是通過在自己應(yīng)用下創(chuàng)建服務(wù)器會(huì)自動(dòng)將我們的xml文件復(fù)制過去。

?

  好了,我們已經(jīng)說完了使用Tomcat內(nèi)置連接池應(yīng)該如何創(chuàng)建配置文件,配置文件的內(nèi)容和配置文件應(yīng)該放置的位置,現(xiàn)在就是如何使用的問題,我們之前說過JNDI定義了Context接口,是命名服務(wù)執(zhí)行查詢的入口,而這個(gè)接口的名字正好不就是我們要配置連接池參數(shù)的<context>元素嗎,所以這里就說明了Tomcat內(nèi)置連接池是要通過JNDI容器來檢索的,而通過<Resource>元素的“name”屬性作為在JNDI容器里檢索的關(guān)鍵字。

  Tomcat文檔中也詳細(xì)說明了如何使用內(nèi)置的連接池:

  

  注意是點(diǎn)擊User Guide的第8點(diǎn)“JNDI Resources”而不是第9點(diǎn)。在“JNDI Resources”中詳細(xì)介紹了JDBC Data sources:

  

?

例:根據(jù)上面的知識(shí)來簡(jiǎn)單地創(chuàng)建和使用Tomcat內(nèi)置數(shù)據(jù)庫(kù)連接池

  首先在Tomcat目錄中的【lib】目錄下放入我們的數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包,這里我們使用的是MySQL數(shù)據(jù)庫(kù):

  

如果沒有這一步最后程序?qū)?huì)拋出未找到com.mysql.jdbc.Driver的異常。

  接著創(chuàng)建一個(gè)WEB工程,這里我們命名為“JdbcTomcatPool”,我們使用MySQL數(shù)據(jù)庫(kù)中自定義的一個(gè)庫(kù),這個(gè)庫(kù)我們命名為“jdbcdemo”。創(chuàng)建完web工程,那么在該工程的【META-INF】目錄下創(chuàng)建一個(gè)“context.xml”文件:

  

配置文件中的內(nèi)容如下:

<Context><Resource name="tomcatpool"auth="Container"type="javax.sql.DataSource"username="root"password="root"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/jdbcdemo"initialSize="10" maxActive="20"maxIdle="4"/> </Context>

  這里<Resource>元素的name屬性即為我們使用JNDI去檢索的關(guān)鍵字,在本例中為“tomcatpool”。其他的參數(shù)都是配置連接池的設(shè)置,我們可以查看DBCP的參數(shù)(之前說過DBCP和Tomcat都是Apache的),也可以在Tomcat的文檔查看JNDI Resources這個(gè)點(diǎn)里的JDBC Data sources這個(gè)文檔都有詳細(xì)的說明。

  接下來我們跟以前的工程一樣,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)工具類JdbcUtils來簡(jiǎn)化對(duì)數(shù)據(jù)庫(kù)的操作,注意,這里我們使用到了處理JNDI檢索的對(duì)象:

1 public class JdbcUtils { 2 3 private static DataSource ds = null; 4 5 static{ 6 try{ 7 8 Context initCtx = new InitialContext(); 9 Context envCtx = (Context)initCtx.lookup("java:comp/env"); 10 ds = (DataSource) envCtx.lookup("tomcatpool"); 11 //根據(jù)<Resource>元素的name屬性值到JNDI容器中檢索連接池對(duì)象 12 }catch (Exception e) { 13 throw new ExceptionInInitializerError(e); 14 } 15 } 16 17 public static Connection getConnection() throws SQLException { 18 return ds.getConnection(); //利用數(shù)據(jù)源獲取連接 19 } 20 21 public static void release(Connection conn,Statement st,ResultSet rs) { 22 if(rs!=null) { 23 try{ 24 rs.close(); 25 }catch (Exception e) { 26 e.printStackTrace(); 27 } 28 } 29 if(st!=null) { 30 try{ 31 st.close(); 32 }catch (Exception e) { 33 e.printStackTrace(); 34 } 35 } 36 if(conn!=null) { 37 try{ 38 conn.close(); 39 }catch (Exception e) { 40 e.printStackTrace(); 41 } 42 } 43 } 44 } View Code

  這個(gè)工具類和之前的開源連接池差不多一樣,在獲取連接池和連接都是通過不同開源連接池的對(duì)象獲取,而釋放資源的代碼一點(diǎn)都沒有變,因此可以知道在Tomcat內(nèi)置的連接池依然也是對(duì)數(shù)據(jù)庫(kù)直接提供的Connection對(duì)象做了close方法的覆寫,那么我們使用一個(gè)Servlet來看看Tomcat給我們提供的連接池是什么樣子的:

1 public class TestServlet extends HttpServlet { 2 3 public void doGet(HttpServletRequest request, HttpServletResponse response) 4 throws ServletException, IOException { 5 6 Connection conn = null; 7 Statement st = null; 8 ResultSet rs = null; 9 try{ 10 conn = JdbcUtils.getConnection(); 11 response.getWriter().write(conn.toString()); 12 response.getWriter().write("<br>"); 13 response.getWriter().write(conn.getClass().getName()); 14 }catch (Exception e) { 15 throw new RuntimeException(e); 16 } 17 finally{ 18 JdbcUtils.release(conn, st, rs); 19 } 20 } 21 } View Code

在瀏覽器中查看:

  

  從Tomcat內(nèi)置的連接池返回給我們的Connection對(duì)象來看,確實(shí)證實(shí)了Tomcat內(nèi)置的連接池就是DBCP連接池。因此我們是一個(gè)WEB工程同時(shí)不想用其他的開源連接池的話就可以使用Tomcat的內(nèi)置數(shù)據(jù)庫(kù)連接池了。

?

?

? ? ? ? ? ? ?

?

轉(zhuǎn)載于:https://www.cnblogs.com/fjdingsd/p/5273187.html

總結(jié)

以上是生活随笔為你收集整理的开源数据库连接池之Tomcat内置连接池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。