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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

關(guān)于Tomcat與MySQL連接池問題的詳解

2019-11-18 16:38:45
字體:
供稿:網(wǎng)友

關(guān)于Tomcat與MySQL連接池問題的詳解(原創(chuàng))

  研究了一天,終于有所收獲,希望對大家有所幫助。首先請大家注意:這里尤其討論Tomcat5.5版本中遇到的問題,為什么尤其單對這個版本,我一會兒便加以說明。

  問題一:Cannot create JDBC driver of class '' for connect URL 'null'
  答:
  [原因分析]
  很多朋友在配置好$Tomcat/conf/server.xml、$Tomcat/conf/context.xml、甚至WEB-INF/web.xml后發(fā)現(xiàn)調(diào)用連接池便會出現(xiàn)以上錯誤。分析錯誤原因,一般是因為大家沒有邦定數(shù)據(jù)源(實際錯誤原因是因為driverClassName、url的設(shè)置為空,但大家肯定不會忘記設(shè)置這個地方,所以肯定是大家設(shè)置完了沒有進(jìn)行連接!)。通常大家配置數(shù)據(jù)源有兩種方式(在$Tomcat/conf/context.xml的設(shè)置方法就不單算了),一種是在$Tomcat/conf/server.xml的</GlobalNamingResources>前添加如下代碼:
  設(shè)置方法一:
   <Resource
      name="jdbc/test"   //數(shù)據(jù)源名稱
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver" //這就是我剛才提到的driverClassName的設(shè)置
      passWord="admin"   //數(shù)據(jù)庫密碼
      maxIdle="2"
      maxWait="5000"
      username="root"   //數(shù)據(jù)庫用戶名
      url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //數(shù)據(jù)庫URL,就是剛才提到的url
      maxActive="4"/>

  除了有注釋的地方外,都是設(shè)置連接數(shù)目、閑置狀況和活動狀況的參數(shù),如果你僅是做學(xué)習(xí)試驗,可以不必更改。這種方法配制后的效果等同于在Tomcat圖形界面中配置操作。
  另一種發(fā)法是在$Tomcat/conf/server.xml的<Context ...></Context>中加入如下代碼:
  設(shè)置方法二:
    <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/>
       <ResourceParams name="jdbc/test">
       <parameter>
         <name>factory</name>
         <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
       </parameter>
       <parameter>
         <name>username</name>
         <value>root</value>
       </parameter>
       <parameter>
         <name>password</name>
         <value>admin</value>
       </parameter>
       <parameter>
         <name>driverClassName</name>
         <value>com.mysql.jdbc.Driver</value>
       </parameter>
       <parameter>
         <name>url</name>
         <value>jdbc:mysql://localhost:3306/test?autoReconnect=true</value>
       </parameter>
       <parameter>
         <name>initialSize</name>
         <value>20</value>
       </parameter>
       <parameter>
         <name>maxActive</name>
         <value>30</value>
       </parameter>
       <parameter>
         <name>maxWait</name>
         <value>10000</value>
       </parameter>
    </ResourceParams>

  這樣設(shè)置的通常目的是想讓數(shù)據(jù)源在一個單獨(dú)的映射目錄中實現(xiàn),也就是通常這段代碼出現(xiàn)在<Context docBase="具體目錄(如D:/webapps/myjsp)" path="訪問名稱(如/myjsp)" reloadable="true"></Context>,這樣就可以通過訪問http://localhost:8080/myjsp/XXX.jsp來訪問D:/webapps/myjsp中的某個jsp頁面進(jìn)而調(diào)取數(shù)據(jù)源或進(jìn)行其它操作調(diào)取數(shù)據(jù)源。

  問題是,無論哪種方法,大家都沒有進(jìn)行連接!如果不進(jìn)行ResourceLink,也免或者bean等無法找到你設(shè)置的代碼,又怎么找到driverClassName和url呢?實際上任何一個參數(shù)設(shè)置都不會被找到的!

  [解決方法]
  知道了原因,解決也就方便了。無論你是使用哪種方法。
  解決方法一:
  如果想在某個映射目錄內(nèi)實現(xiàn)ResourceLink,就在<Context ...></Context>中間添加<ResourceLink global="數(shù)據(jù)源名稱" name="映射后的名稱" type="javax.sql.DataSource"/>,注意如果你不了解代碼關(guān)聯(lián)關(guān)系,一定緊緊貼在<Context ...>后寫就好。
  解決方法二:
  如果想變成全局性的,在所有映射目錄中均可以使用,就干脆寫在$Tomcat/conf/context.xml中,萬事OK了。
  一般大家把“數(shù)據(jù)源名稱”和“映射后的名稱”設(shè)置成同一個,例如我是這樣設(shè)置的<ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/>。

  另外必須說明,在Tomcat5.5中,如果你像上面第二種設(shè)置方法,即使加上ResourceLink,也會遇到不能正常運(yùn)行的問題。

  問題二:javax.naming.NameNotFoundException: Name XXX is not bound in this Context
  答:
  [原因分析]
  Tomcat5.5中,在<Context ...><Context>中設(shè)置數(shù)據(jù)源不能正常運(yùn)行,我看過一位外國人寫的帖子,我英語水平不高,不過剛好能看懂。他說這是因為比較高的版本中(應(yīng)該是說Tomcat和dbcp),factory的值由org.apache.commons.dbcp.BasicDataSourceFactory改為了org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory。但是我進(jìn)行過嘗試,并不能解決問題。而且我發(fā)現(xiàn)Tomcat5.5標(biāo)準(zhǔn)版本自帶dbcp,就在$Tomcat/common/lib中。我看過另一個網(wǎng)友的解說,他說用第二種設(shè)置方法是不行的。這說明第二種設(shè)置方法只適用以前版本,現(xiàn)在的版本我不知道要在哪部分做更改,但錯誤原因是想一起那么設(shè)置,服務(wù)器找不到“數(shù)據(jù)源名稱”對應(yīng)的數(shù)據(jù)源。
  [解決方法]
  知道原因就可以解決了,看來只有把數(shù)據(jù)源聲明在<GlobalNamingResources>中才能起作用。所以大家就按照第一種設(shè)置方法設(shè)置Tomcat5.5(這就是我為什么尤其講Tomcat5.5)就可以了。

  問題三:Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
  答:
  [原因分析]
  不光對于mysql,對于別的數(shù)據(jù)庫,只要找不到,就會拋出這個錯誤"Cannot load JDBC driver class",那么為什么會找不到數(shù)據(jù)庫驅(qū)動類呢?如何才能找到呢?其實很簡單。
  [解決方法]
  只要把jdbc拷貝到$Tomcat/common/lib中就可以了。

  問題四:Cannot get a connection, pool exhausted
  [原因分析]
  很簡單,不能建立連接,連接池溢出,這說明你的連接資源都浪費(fèi)了,原因是你沒有及時回收它們。
  [解決方法]
  及時并正確使用close()方法釋放ResultSet、Statement、Connection,具體語句我就不說了,推薦在finally中寫。

  總結(jié):所以,如果你想用Tomcat5.5建立一個數(shù)據(jù)源連接池,只要三步。

  第一:設(shè)置數(shù)據(jù)源,推薦用圖形操作界面,如果手動就在$Tomcat/conf/server.xml中</GlobalNamingResources>前添加如下代碼:

   <Resource
      name="jdbc/test"   //數(shù)據(jù)源名稱
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver" //這就是我剛才提到的driverClassName的設(shè)置
      password="admin"   //數(shù)據(jù)庫密碼
      maxIdle="2"
      maxWait="5000"
      username="root"   //數(shù)據(jù)庫用戶名
      url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //數(shù)據(jù)庫URL,就是剛才提到的url
      maxActive="4"/>

  注釋參數(shù)記得更改成自己的。

  第二:設(shè)置Resource連接。推薦在$Tomcat/conf/context.xml中寫入<ResourceLink global="數(shù)據(jù)源名稱" name="映射后的名稱" type="javax.sql.DataSource"/>,如果想就在某個單獨(dú)映射目錄實現(xiàn),就在$Tomcat/conf/server.xml中需要映射的目錄中的<Context ...>后寫入。

  第三:將JDBC拷貝到$Tomcat/common/lib中

  另外,我在這里不詳細(xì)說明如何調(diào)用數(shù)據(jù)源,這個問題比較簡單,但要注意,DataSource ds=(DataSource)envCtx.lookup("引用數(shù)據(jù)源");語句中"引用數(shù)據(jù)源"只的是"映射后的名稱",不是"數(shù)據(jù)源名稱",所以我建議大家方便起見把兩個名字設(shè)成同一個。而且特別要注意及時釋放閑置資源,不然連接池就會溢出!

  以上是我今天研究的一些成果,我還是個初學(xué)者,希望這篇文章對大家有所幫助。有什么問題可以聯(lián)系我,我的郵箱是:lk_l@sina.com(愛看霓虹燈的人)。本文為neonlight.bokee.com(CSDN_MathMagician)原創(chuàng),不可轉(zhuǎn)載!2006年08月11日

http://blog.csdn.net/mathmagician/archive/2007/03/01/1518689.aspx


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 青铜峡市| 昌江| 扶风县| 潼关县| 太仆寺旗| 洱源县| 桃园市| 锡林郭勒盟| 满洲里市| 习水县| 开原市| 株洲县| 吕梁市| 静乐县| 肃宁县| 合作市| 莱西市| 定结县| 遂川县| 长治市| 崇州市| 遂川县| 安新县| 永善县| 丰原市| 广安市| 邓州市| 墨江| 景东| 布拖县| 黑龙江省| 宜章县| 东兴市| 邵阳县| 西城区| 那曲县| 明星| 武冈市| 崇州市| 蒙山县| 鄯善县|