Sung in Blog

                     一些技術(shù)文章 & 一些生活雜碎
          tomcat的數(shù)據(jù)庫連接池的配置
          環(huán)境:
          1. 數(shù)據(jù)庫:mysql
          2. 數(shù)據(jù)庫驅(qū)動(dòng)程序:org.gjt.mm.mysql.Driver
          JNDI(Java Naming and Directory Interface)概述:
          Tomcat4(5)提供了一個(gè)與Java Enterprise Edition應(yīng)用服務(wù)相兼容的JNDI--InitialContext實(shí)現(xiàn)實(shí)例。它的初始數(shù)據(jù)設(shè)置在$CATALINA_HOME/conf/server.xml文件里,并可能在網(wǎng)頁應(yīng)用環(huán)境描述(/WEB-INF/web.xml)里被下列元素引用:
          1) --環(huán)境入口,設(shè)置應(yīng)用程序如何操作。
          2) --資源參數(shù),一般是數(shù)據(jù)庫驅(qū)動(dòng)程序、JavaMail Session、自定義類工廠等。
          3) --在Servlet 2.4里用來簡(jiǎn)化設(shè)置不需認(rèn)證信息的資源資源如環(huán)境參數(shù)、resource-ref變量。
          InitialContext在網(wǎng)頁應(yīng)用程序初始化時(shí)被設(shè)置,用來支持網(wǎng)頁應(yīng)用程序組件。所有的入口和資源都放在JNDI命名空間里的java:comp/env段里。點(diǎn)擊下列網(wǎng)址以獲取更多信息:
          1) Java命名和目錄接口(Java Naming and Directory Interface)
          2) J2EE平臺(tái)說明(J2EE Platform Specification)
          設(shè)置JNDI資源
          設(shè)置JNDI資源要在$CATALINA_HOME/conf/server.xml文件里使用下列標(biāo)志符:
          1) --設(shè)置域個(gè)可變的JNDI InitialContext入口的名字和值(同上面說的等價(jià))。
          2) --設(shè)置應(yīng)用程序可用的資源的名字和類型(同上面說的等價(jià))。
          3) --設(shè)置Java資源類工廠的名稱或?qū)⒂玫腏avaBean屬性。
          4) --給全局JNDI環(huán)境(JNDI Context)添加一個(gè)鏈接。
          上述這些標(biāo)志符必須放在之間(針對(duì)專門的網(wǎng)頁應(yīng)用程序)或之間。
          此外,設(shè)在網(wǎng)頁應(yīng)用環(huán)境描述(Web Application Descriptor)(/WEB-INF/web.xml)里的名字和值也在初始環(huán)境(Initial Context)里被設(shè)置,當(dāng)被元素值允許時(shí)將被重設(shè)初始值。
          全局變量能在子元素的里設(shè)置。
          數(shù)據(jù)庫連接池概述:
          數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點(diǎn)在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)得尤為突出。對(duì)數(shù)據(jù)庫連接的管理能顯著影響到整個(gè)應(yīng)用程序的伸縮性和健壯性,影響到程序的性能指標(biāo)。數(shù)據(jù)庫連接池正是針對(duì)這個(gè)問題提出來的。
          數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而再不是重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項(xiàng)技術(shù)能明顯提高對(duì)數(shù)據(jù)庫操作的性能。
          數(shù)據(jù)庫連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請(qǐng)求的連接數(shù)超過最大連接數(shù)量時(shí),這些請(qǐng)求將被加入到等待隊(duì)列中。數(shù)據(jù)庫連接池的最小連接數(shù)和最大連接數(shù)的設(shè)置要考慮到下列幾個(gè)因素:
          1) 最小連接數(shù)是連接池一直保持的數(shù)據(jù)庫連接,所以如果應(yīng)用程序?qū)?shù)據(jù)庫連接的使用量不大,將會(huì)有大量的數(shù)據(jù)庫連接資源被浪費(fèi);
          2) 最大連接數(shù)是連接池能申請(qǐng)的最大連接數(shù),如果數(shù)據(jù)庫連接請(qǐng)求超過此數(shù),后面的數(shù)據(jù)庫連接請(qǐng)求將被加入到等待隊(duì)列中,這會(huì)影響之后的數(shù)據(jù)庫操作。
          3) 如果最小連接數(shù)與最大連接數(shù)相差太大,那么最先的連接請(qǐng)求將會(huì)獲利,之后超過最小連接數(shù)量的連接請(qǐng)求等價(jià)于建立一個(gè)新的數(shù)據(jù)庫連接。不過,這些大于最小連接數(shù)的數(shù)據(jù)庫連接在使用完不會(huì)馬上被釋放,它將被放到連接池中等待重復(fù)使用或是空閑超時(shí)后被釋放。
          配置Tomcat數(shù)據(jù)庫連接池的前提:
          1. 必須裝有Java運(yùn)行環(huán)境;
          2. mysql;
          在$CATALINA_HOME/conf/server.xml里設(shè)置數(shù)據(jù)庫連接池:
          下面是配置的代碼,必須放在之間。



          ?
          ? maxActive
          ?
          ? 100
          ?

          ?
          ? maxIdle
          ?
          ? 30
          ?

          ?
          ? maxWait
          ?
          ? 10000
          ?

          ?
          ? removeAbandoned
          ?
          ? true
          ?

          ?
          ? removeAbandonedTimeout
          ?
          ? 60
          ?

          ?
          ? logAbandoned
          ?
          ? false
          ?

          ?
          ? factory
          ?
          ? org.apache.commons.dbcp.BasicDataSourceFactory
          ?

          ?
          ? username
          ?
          ? root
          ?

          ?
          ? password
          ?
          ?
          ?

          ?
          ? driverClassName
          ?
          ? org.gjt.mm.mysql.Driver
          ?

          ?
          ? url
          ?
          ? jdbc:mysql://localhost/test
          ?



          下面是一些參數(shù)的說明:

          其中:
          1) path? 指定路徑,這里設(shè)定的是$CATALINA_HOME/webapps下的test目錄;
          2) docBase 文件根目錄。
          3) reloader? 當(dāng)網(wǎng)頁被更新時(shí)是否重新編譯。
          4) maxActive 連接池的最大數(shù)據(jù)庫連接數(shù)。設(shè)為0表示無限制。
          5) maxIdle? 數(shù)據(jù)庫連接的最大空閑時(shí)間。超過此空閑時(shí)間,數(shù)據(jù)庫連接將被標(biāo)記為不可用,然后被釋放。設(shè)為0表示無限制。
          6) maxWait 最大建立連接等待時(shí)間。如果超過此時(shí)間將接到異常。設(shè)為-1表示無限制。
          7) removeAbandoned 回收被遺棄的(一般是忘了釋放的)數(shù)據(jù)庫連接到連接池中。
          8) removeAbandonedTimeout 數(shù)據(jù)庫連接過多長時(shí)間不用將被視為被遺棄而收回連接池中。
          9) logAbandoned 將被遺棄的數(shù)據(jù)庫連接的回收記入日志。
          10) driverClassName JDBC驅(qū)動(dòng)程序。
          11) url?? 數(shù)據(jù)庫連接字符串
          在$CATALINA_HOME/webapps/test/WEB-INF/web.xml里設(shè)置被引用的資源:
          下面是配置代碼,必須放在里。


          connectDB test
          jdbc/connectDB
          javax.sql.DataSource
          Container


          下面是一下參數(shù)的必要說明:
          1) description? 對(duì)被引用的資源的描述。
          2) res-ref-name? 資源名稱。見上面的
          3) res-type? 資源類型。見上面的
          為了方便做解釋直接在JSP中使用資源:
          這是在$CATALINA_HOME/webapps/test下的某級(jí)子目錄里的jsp網(wǎng)頁文件部分代碼:
          <%@ page contentType="text/html;charset=GBK"%>
          <%@ page errorPage="error.jsp"%>
          <%@ page import="javax.naming.*"%>
          <%@ page import="javax.sql.*"%>
          <%@ page import="java.sql.*"%>

          ?
          ?
          ?
          ? <%

          ?? ………………
          ?? ………………

          ?? // 數(shù)據(jù)庫操作
          ?? Context ctx=null;
          ?? Connection cnn=null;
          ?? Statement stmt=null;
          ?? ResultSet rs=null;
          ?? try
          ?? {
          ??? ctx=new InitialContext();
          ??? if(ctx==null)
          ???? throw new Exception("沒有匹配的環(huán)境");
          ??? DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");
          ??? if(ds==null)
          ???? throw new Exception("沒有匹配數(shù)據(jù)庫");
          ???
          ??? cnn=ds.getConnection();
          ??? stmt=cnn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
          ??? rs=stmt.executeQuery("select * from table1");

          ??? ………………
          ??? ………………

          ?? }
          ?? finally
          ?? {
          ??? if(rs!=null)
          ???? rs.close();
          ??? if(stmt!=null)
          ???? stmt.close();
          ??? if(cnn!=null)
          ???? cnn.close();
          ??? if(ctx!=null)
          ???? ctx.close();
          ?? }
          ??? %>
          ?

          代碼說明:
          DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");
          上面這句應(yīng)用了剛才設(shè)的資源。
          資源使用完要釋放,尤其是Context資源,見try-catch-finally部分的finally代碼段,這是一種好的習(xí)慣。資源釋放時(shí)如果釋放了上級(jí)資源,下級(jí)資源將先被釋放。如:釋放了ctx,那么資源釋放順序?qū)⑹莚s,stmt,cnn,ctx。換句話說,如果釋放了ctx,那么rs,stmt和cnn都將不可用了。
          這里的釋放資源只是將數(shù)據(jù)庫連接返回連接池中,并不是把資源真正釋放掉,見數(shù)據(jù)庫連接池概述。

          Datasource對(duì)象是由Tomcat提供的,因而需要使用JNDI來獲得Datasouce

          在Javax.naming 中提供了Context接口,

          數(shù)據(jù)源的配置涉及到Server.xml和web.xml,需要在server.xml中加入如下內(nèi)容:說明一下:我的數(shù)據(jù)庫是MYsql


          ???? ??????????????????? type="javax.sql.DataSource"/>
          ????????? \\數(shù)據(jù)源的名稱
          ??????????? usernameroot數(shù)據(jù)庫的名稱
          ??????????? passwordpassword數(shù)據(jù)庫密碼
          ??????????? driverClassName
          ????????????? org.gjt.mm.mysql.Driver
          \\要加載的驅(qū)動(dòng)
          ??????????? url
          ????????????? jdbc:mysql://172.20.0.73/rk?
          \\要連接的URL
          ?????????

          ?????????
          ??

          具體還有一些詳細(xì)的選項(xiàng)例如:MaxActive等,參加Server.xml中說明

          另外在Web.xml中加入如下內(nèi)容:
          test connection\\描述
          ??? jdbc/testDB\\名稱與上對(duì)應(yīng)
          ??? javax.sql.DataSource\\與上對(duì)應(yīng)
          ??? Container\\與上一置
          ???

          配置以上內(nèi)容后,只要在你的Jsp或Javabean 中按以下方式創(chuàng)建連接,就可以

          Context ctx=new InitialContext();
          ??DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/testDB");
          ??conn = ds.getConnection();

          以上代碼均測(cè)試成功,但是在Server.xml中配置數(shù)據(jù)庫的URL中我不能加入useUnicode=true&characterEncoding=GBK,所以從數(shù)據(jù)庫中取出來的漢字都是????

          我用如下代碼來解決這個(gè)問題:

          public static String toChinese(String strvalue) {
          ??try{
          ???if(strvalue==null)
          ??{
          ??return null;
          ??}
          ??else {
          ???strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
          ???return strvalue;
          ??}
          ??}catch(Exception e){
          ???return null;
          ??}
          ?}

          Step by Step:
          1。將數(shù)據(jù)庫驅(qū)動(dòng)程序拷貝到tomcat\common\lib目錄下面。
          2。修改server.xml文件,在Context配置節(jié)點(diǎn)下面加上資源節(jié)點(diǎn),如下:
          ???????????????? maxActive="100" maxIdle="30" maxWait="10000"
          ???????????????? username="root" password="" driverClassName="org.gjt.mm.mysql.Driver"
          ???????????????? url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK&useUnicode=TRUE"/>
          ??????? 注意的是:如果有&字符,需要轉(zhuǎn)移成&(XML文件規(guī)范)
          3。修改Web應(yīng)用WEB-INF\web.xml文件,加上Resource-Def,如下:
          ?
          ????? DB Connection
          ????? jdbc/TestDB
          ????? javax.sql.DataSource
          ????? Container
          ?

          4。重新啟動(dòng)Web應(yīng)用,在Web應(yīng)用中可以通過下面的代碼來獲取數(shù)據(jù)源和數(shù)據(jù)庫連接:
          javax.naming.InitialContext context = new javax.naming.InitialContext();
          DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/TestDB" );
          connection = (Connection)ds.getConnection();

          Problem And Answer:
          1。Question:如果出現(xiàn)下列提示:
          ????? javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:? java.naming.factory.initial
          ??????? at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640),怎么辦?
          ????? Answer:檢查在Tomcat中conf/server.xml文件,檢查是否設(shè)置useNaming="false",如果是,去掉。
          2。Question:如果無法找到數(shù)據(jù)庫驅(qū)動(dòng)程序怎么辦?
          ????? Answer:檢查數(shù)據(jù)庫驅(qū)動(dòng)JDBC程序是否放在了Tomcat\common\lib目錄下面

          tomcat的數(shù)據(jù)庫連接池的配置
          環(huán)境:
          1. 數(shù)據(jù)庫:mysql
          2. 數(shù)據(jù)庫驅(qū)動(dòng)程序:org.gjt.mm.mysql.Driver
          JNDI(Java Naming and Directory Interface)概述:
          Tomcat4(5)提供了一個(gè)與Java Enterprise Edition應(yīng)用服務(wù)相兼容的JNDI--InitialContext實(shí)現(xiàn)實(shí)例。它的初始數(shù)據(jù)設(shè)置在$CATALINA_HOME/conf/server.xml文件里,并可能在網(wǎng)頁應(yīng)用環(huán)境描述(/WEB-INF/web.xml)里被下列元素引用:
          1) --環(huán)境入口,設(shè)置應(yīng)用程序如何操作。
          2) --資源參數(shù),一般是數(shù)據(jù)庫驅(qū)動(dòng)程序、JavaMail Session、自定義類工廠等。
          3) --在Servlet 2.4里用來簡(jiǎn)化設(shè)置不需認(rèn)證信息的資源資源如環(huán)境參數(shù)、resource-ref變量。
          InitialContext在網(wǎng)頁應(yīng)用程序初始化時(shí)被設(shè)置,用來支持網(wǎng)頁應(yīng)用程序組件。所有的入口和資源都放在JNDI命名空間里的java:comp/env段里。點(diǎn)擊下列網(wǎng)址以獲取更多信息:
          1) Java命名和目錄接口(Java Naming and Directory Interface)
          2) J2EE平臺(tái)說明(J2EE Platform Specification)
          設(shè)置JNDI資源
          設(shè)置JNDI資源要在$CATALINA_HOME/conf/server.xml文件里使用下列標(biāo)志符:
          1) --設(shè)置域個(gè)可變的JNDI InitialContext入口的名字和值(同上面說的等價(jià))。
          2) --設(shè)置應(yīng)用程序可用的資源的名字和類型(同上面說的等價(jià))。
          3) --設(shè)置Java資源類工廠的名稱或?qū)⒂玫腏avaBean屬性。
          4) --給全局JNDI環(huán)境(JNDI Context)添加一個(gè)鏈接。
          上述這些標(biāo)志符必須放在之間(針對(duì)專門的網(wǎng)頁應(yīng)用程序)或之間。
          此外,設(shè)在網(wǎng)頁應(yīng)用環(huán)境描述(Web Application Descriptor)(/WEB-INF/web.xml)里的名字和值也在初始環(huán)境(Initial Context)里被設(shè)置,當(dāng)被元素值允許時(shí)將被重設(shè)初始值。
          全局變量能在子元素的里設(shè)置。
          數(shù)據(jù)庫連接池概述:
          數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點(diǎn)在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)得尤為突出。對(duì)數(shù)據(jù)庫連接的管理能顯著影響到整個(gè)應(yīng)用程序的伸縮性和健壯性,影響到程序的性能指標(biāo)。數(shù)據(jù)庫連接池正是針對(duì)這個(gè)問題提出來的。
          數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而再不是重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項(xiàng)技術(shù)能明顯提高對(duì)數(shù)據(jù)庫操作的性能。
          數(shù)據(jù)庫連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請(qǐng)求的連接數(shù)超過最大連接數(shù)量時(shí),這些請(qǐng)求將被加入到等待隊(duì)列中。數(shù)據(jù)庫連接池的最小連接數(shù)和最大連接數(shù)的設(shè)置要考慮到下列幾個(gè)因素:
          1) 最小連接數(shù)是連接池一直保持的數(shù)據(jù)庫連接,所以如果應(yīng)用程序?qū)?shù)據(jù)庫連接的使用量不大,將會(huì)有大量的數(shù)據(jù)庫連接資源被浪費(fèi);
          2) 最大連接數(shù)是連接池能申請(qǐng)的最大連接數(shù),如果數(shù)據(jù)庫連接請(qǐng)求超過此數(shù),后面的數(shù)據(jù)庫連接請(qǐng)求將被加入到等待隊(duì)列中,這會(huì)影響之后的數(shù)據(jù)庫操作。
          3) 如果最小連接數(shù)與最大連接數(shù)相差太大,那么最先的連接請(qǐng)求將會(huì)獲利,之后超過最小連接數(shù)量的連接請(qǐng)求等價(jià)于建立一個(gè)新的數(shù)據(jù)庫連接。不過,這些大于最小連接數(shù)的數(shù)據(jù)庫連接在使用完不會(huì)馬上被釋放,它將被放到連接池中等待重復(fù)使用或是空閑超時(shí)后被釋放。
          配置Tomcat數(shù)據(jù)庫連接池的前提:
          1. 必須裝有Java運(yùn)行環(huán)境;
          2. mysql;
          在$CATALINA_HOME/conf/server.xml里設(shè)置數(shù)據(jù)庫連接池:
          下面是配置的代碼,必須放在之間。



          ?
          ? maxActive
          ?
          ? 100
          ?

          ?
          ? maxIdle
          ?
          ? 30
          ?

          ?
          ? maxWait
          ?
          ? 10000
          ?

          ?
          ? removeAbandoned
          ?
          ? true
          ?

          ?
          ? removeAbandonedTimeout
          ?
          ? 60
          ?

          ?
          ? logAbandoned
          ?
          ? false
          ?

          ?
          ? factory
          ?
          ? org.apache.commons.dbcp.BasicDataSourceFactory
          ?

          ?
          ? username
          ?
          ? root
          ?

          ?
          ? password
          ?
          ?
          ?

          ?
          ? driverClassName
          ?
          ? org.gjt.mm.mysql.Driver
          ?

          ?
          ? url
          ?
          ? jdbc:mysql://localhost/test
          ?



          下面是一些參數(shù)的說明:

          其中:
          1) path? 指定路徑,這里設(shè)定的是$CATALINA_HOME/webapps下的test目錄;
          2) docBase 文件根目錄。
          3) reloader? 當(dāng)網(wǎng)頁被更新時(shí)是否重新編譯。
          4) maxActive 連接池的最大數(shù)據(jù)庫連接數(shù)。設(shè)為0表示無限制。
          5) maxIdle? 數(shù)據(jù)庫連接的最大空閑時(shí)間。超過此空閑時(shí)間,數(shù)據(jù)庫連接將被標(biāo)記為不可用,然后被釋放。設(shè)為0表示無限制。
          6) maxWait 最大建立連接等待時(shí)間。如果超過此時(shí)間將接到異常。設(shè)為-1表示無限制。
          7) removeAbandoned 回收被遺棄的(一般是忘了釋放的)數(shù)據(jù)庫連接到連接池中。
          8) removeAbandonedTimeout 數(shù)據(jù)庫連接過多長時(shí)間不用將被視為被遺棄而收回連接池中。
          9) logAbandoned 將被遺棄的數(shù)據(jù)庫連接的回收記入日志。
          10) driverClassName JDBC驅(qū)動(dòng)程序。
          11) url?? 數(shù)據(jù)庫連接字符串
          在$CATALINA_HOME/webapps/test/WEB-INF/web.xml里設(shè)置被引用的資源:
          下面是配置代碼,必須放在里。


          connectDB test
          jdbc/connectDB
          javax.sql.DataSource
          Container


          下面是一下參數(shù)的必要說明:
          1) description? 對(duì)被引用的資源的描述。
          2) res-ref-name? 資源名稱。見上面的
          3) res-type? 資源類型。見上面的
          為了方便做解釋直接在JSP中使用資源:
          這是在$CATALINA_HOME/webapps/test下的某級(jí)子目錄里的jsp網(wǎng)頁文件部分代碼:
          <%@ page contentType="text/html;charset=GBK"%>
          <%@ page errorPage="error.jsp"%>
          <%@ page import="javax.naming.*"%>
          <%@ page import="javax.sql.*"%>
          <%@ page import="java.sql.*"%>

          ?
          ?
          ?
          ? <%

          ?? ………………
          ?? ………………

          ?? // 數(shù)據(jù)庫操作
          ?? Context ctx=null;
          ?? Connection cnn=null;
          ?? Statement stmt=null;
          ?? ResultSet rs=null;
          ?? try
          ?? {
          ??? ctx=new InitialContext();
          ??? if(ctx==null)
          ???? throw new Exception("沒有匹配的環(huán)境");
          ??? DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");
          ??? if(ds==null)
          ???? throw new Exception("沒有匹配數(shù)據(jù)庫");
          ???
          ??? cnn=ds.getConnection();
          ??? stmt=cnn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
          ??? rs=stmt.executeQuery("select * from table1");

          ??? ………………
          ??? ………………

          ?? }
          ?? finally
          ?? {
          ??? if(rs!=null)
          ???? rs.close();
          ??? if(stmt!=null)
          ???? stmt.close();
          ??? if(cnn!=null)
          ???? cnn.close();
          ??? if(ctx!=null)
          ???? ctx.close();
          ?? }
          ??? %>
          ?

          代碼說明:
          DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");
          上面這句應(yīng)用了剛才設(shè)的資源。
          資源使用完要釋放,尤其是Context資源,見try-catch-finally部分的finally代碼段,這是一種好的習(xí)慣。資源釋放時(shí)如果釋放了上級(jí)資源,下級(jí)資源將先被釋放。如:釋放了ctx,那么資源釋放順序?qū)⑹莚s,stmt,cnn,ctx。換句話說,如果釋放了ctx,那么rs,stmt和cnn都將不可用了。
          這里的釋放資源只是將數(shù)據(jù)庫連接返回連接池中,并不是把資源真正釋放掉,見數(shù)據(jù)庫連接池概述。

          Datasource對(duì)象是由Tomcat提供的,因而需要使用JNDI來獲得Datasouce

          在Javax.naming 中提供了Context接口,

          數(shù)據(jù)源的配置涉及到Server.xml和web.xml,需要在server.xml中加入如下內(nèi)容:說明一下:我的數(shù)據(jù)庫是MYsql


          ???? ??????????????????? type="javax.sql.DataSource"/>
          ????????? \\數(shù)據(jù)源的名稱
          ??????????? usernameroot數(shù)據(jù)庫的名稱
          ??????????? passwordpassword數(shù)據(jù)庫密碼
          ??????????? driverClassName
          ????????????? org.gjt.mm.mysql.Driver
          \\要加載的驅(qū)動(dòng)
          ??????????? url
          ????????????? jdbc:mysql://172.20.0.73/rk?
          \\要連接的URL
          ?????????

          ?????????
          ??

          具體還有一些詳細(xì)的選項(xiàng)例如:MaxActive等,參加Server.xml中說明

          另外在Web.xml中加入如下內(nèi)容:
          test connection\\描述
          ??? jdbc/testDB\\名稱與上對(duì)應(yīng)
          ??? javax.sql.DataSource\\與上對(duì)應(yīng)
          ??? Container\\與上一置
          ???

          配置以上內(nèi)容后,只要在你的Jsp或Javabean 中按以下方式創(chuàng)建連接,就可以

          Context ctx=new InitialContext();
          ??DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/testDB");
          ??conn = ds.getConnection();

          以上代碼均測(cè)試成功,但是在Server.xml中配置數(shù)據(jù)庫的URL中我不能加入useUnicode=true&characterEncoding=GBK,所以從數(shù)據(jù)庫中取出來的漢字都是????

          我用如下代碼來解決這個(gè)問題:

          public static String toChinese(String strvalue) {
          ??try{
          ???if(strvalue==null)
          ??{
          ??return null;
          ??}
          ??else {
          ???strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
          ???return strvalue;
          ??}
          ??}catch(Exception e){
          ???return null;
          ??}
          ?}

          Step by Step:
          1。將數(shù)據(jù)庫驅(qū)動(dòng)程序拷貝到tomcat\common\lib目錄下面。
          2。修改server.xml文件,在Context配置節(jié)點(diǎn)下面加上資源節(jié)點(diǎn),如下:
          ???????????????? maxActive="100" maxIdle="30" maxWait="10000"
          ???????????????? username="root" password="" driverClassName="org.gjt.mm.mysql.Driver"
          ???????????????? url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK&useUnicode=TRUE"/>
          ??????? 注意的是:如果有&字符,需要轉(zhuǎn)移成&(XML文件規(guī)范)
          3。修改Web應(yīng)用WEB-INF\web.xml文件,加上Resource-Def,如下:
          ?
          ????? DB Connection
          ????? jdbc/TestDB
          ????? javax.sql.DataSource
          ????? Container
          ?

          4。重新啟動(dòng)Web應(yīng)用,在Web應(yīng)用中可以通過下面的代碼來獲取數(shù)據(jù)源和數(shù)據(jù)庫連接:
          javax.naming.InitialContext context = new javax.naming.InitialContext();
          DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/TestDB" );
          connection = (Connection)ds.getConnection();

          Problem And Answer:
          1。Question:如果出現(xiàn)下列提示:
          ????? javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:? java.naming.factory.initial
          ??????? at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640),怎么辦?
          ????? Answer:檢查在Tomcat中conf/server.xml文件,檢查是否設(shè)置useNaming="false",如果是,去掉。
          2。Question:如果無法找到數(shù)據(jù)庫驅(qū)動(dòng)程序怎么辦?
          ????? Answer:檢查數(shù)據(jù)庫驅(qū)動(dòng)JDBC程序是否放在了Tomcat\common\lib目錄下面

          ]]>
          posted on 2005-09-19 16:48 Sung 閱讀(1624) 評(píng)論(0)  編輯  收藏 所屬分類: Tomcat
          主站蜘蛛池模板: 屯门区| 梅河口市| 肥城市| 桂林市| 静宁县| 通辽市| 开平市| 德江县| 龙山县| 正阳县| 运城市| 尉犁县| 营山县| 丹东市| 华蓥市| 杭锦旗| 乐山市| 永和县| 若尔盖县| 确山县| 宜丰县| 宜君县| 射阳县| 监利县| 麻江县| 宽城| 临泉县| 平阴县| 罗平县| 石阡县| 会宁县| 苏尼特左旗| 志丹县| 林芝县| 两当县| 台北市| 定日县| 深水埗区| 甘德县| 师宗县| 兴国县|