




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
連接池和數(shù)據(jù)源知識(shí)點(diǎn)連接池和數(shù)據(jù)源的基本概念配置Tomcat數(shù)據(jù)源配置struts數(shù)據(jù)源一.概述:在實(shí)際項(xiàng)目的開(kāi)發(fā)中,特別是web應(yīng)用程序中,如Jsp,Servlet或EJB使用JDBC直接訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),每一次數(shù)據(jù)方請(qǐng)求必須建立連接,存取數(shù)據(jù),關(guān)閉連接等步驟,而數(shù)據(jù)庫(kù)連接是一種非常昂貴的資源,頻繁的建立連接,關(guān)閉連接必定是數(shù)據(jù)庫(kù)性能降低,再者,JDBC直接連接數(shù)據(jù)庫(kù)的方式還存在數(shù)據(jù)庫(kù)連接泄漏問(wèn)題。使用數(shù)據(jù)庫(kù)連接池技術(shù)是解決上述問(wèn)題的最常用的方法,在許多應(yīng)用服務(wù)器(如websphere,weblogic,jBoss)中都提供了這種技術(shù).二.連接池實(shí)現(xiàn)的原理:就是在應(yīng)用啟動(dòng)時(shí)建立一定數(shù)量的數(shù)據(jù)庫(kù)連接,并將這些數(shù)據(jù)庫(kù)連接作為對(duì)象存儲(chǔ)在一個(gè)容器對(duì)象中。而程序中所有的數(shù)據(jù)庫(kù)請(qǐng)求訪問(wèn)都可以共享這些連接,這樣,通過(guò)復(fù)用這些已經(jīng)建立的數(shù)據(jù)庫(kù)連接,不必在每次訪問(wèn)數(shù)據(jù)庫(kù)時(shí)都重新建立連接,極大的節(jié)省了系統(tǒng)資源和時(shí)間。另外,為了回收并重新使用那些沒(méi)有及時(shí)關(guān)閉的數(shù)據(jù)庫(kù)連接,連接池都提供了一種超時(shí)回收機(jī)制。也就是當(dāng)數(shù)據(jù)庫(kù)的連接在指定的時(shí)間內(nèi)沒(méi)有活動(dòng),連接池就把這些連接重新放到可以使用的隊(duì)列。新的連接請(qǐng)求到來(lái)時(shí)便可以再次使用這些連接。這種超時(shí)回收連接的機(jī)制可以克服數(shù)據(jù)庫(kù)鏈接泄漏的問(wèn)題。三.幾個(gè)常見(jiàn)的開(kāi)源的數(shù)據(jù)庫(kù)連接池DBCP連接池它是一個(gè)依賴于Jakatacommons-pool對(duì)象池機(jī)制的數(shù)據(jù)庫(kù)連接池,DBCP可以直接在應(yīng)用程序中使用。1.1.官方下載網(wǎng)址:/commons/dbcp/1.2.將下載後的文件解壓獲得三個(gè)jar文件commons-dbcp-1.2.1.jar,commons-pool-1.3.jar,commons-collections-3.2.jar1.3.將上述三個(gè).jar文件保存到項(xiàng)目的WEB-INF\lib下,即加入到CLASSPATH中。1.4.使用方法1.4.1.直接在程序中使用首先要?jiǎng)?chuàng)建BasicDataSource,然后通過(guò)它來(lái)獲得數(shù)據(jù)庫(kù)連接對(duì)象ConnectionPropertiesp=newProperties();1.4.2.通過(guò)tomcat使用DBCP數(shù)據(jù)源需要修改tomcat的server.xml文件或者配置位于tomcat文件夾下conf\Catelina\local文件夾下的“項(xiàng)目名稱.xml”文件Class.forName(“”);//加載驅(qū)動(dòng)程序Connectionconn=DriverManager.getConnection(proxool.)三.在 Tomcat上配置連接池與配置數(shù)據(jù)源基本相同。唯一需要的就是在
server.xml文件中的
<ResourceParams>標(biāo)簽之間添加幾個(gè)與連接池相關(guān)的參數(shù)設(shè)置。配置連接池時(shí)需要添加的配置代碼段:<!—回收被遺棄的(一般是忘了釋放的 )數(shù)據(jù)庫(kù)鏈接到連接池中<parameter><name>removeAbandoned</name><value>true</value></parameter><!—數(shù)據(jù)庫(kù)鏈接超過(guò) 60秒不用將視為被遺棄而回收到連接池中<parameter><name>removeAbandonedTimeout</name><value>60</value></parameter><!—將被遺棄的數(shù)據(jù)庫(kù)鏈接的回收記入日至<parameter><name>logAbandoned</name><value>true</value></parameter>Tomcat中的數(shù)據(jù)源數(shù)據(jù)源是JDBC2.0種引入的一個(gè)概念。并且在 javax.sql包中定義了接口描述這個(gè)概念。在數(shù)據(jù)庫(kù)的 JDBC驅(qū)動(dòng)程序中有該接口的實(shí)現(xiàn)類。例如 :
DataSource來(lái)
中的
類就實(shí)現(xiàn)了
DataSource接口。在程序中使用數(shù)據(jù)源有兩種方式:一種是在程序中直接創(chuàng)建類的對(duì)象,該對(duì)象實(shí)現(xiàn)了JDBC驅(qū)動(dòng)程序中的DataSource接口.并使用該對(duì)象獲得數(shù)據(jù)庫(kù)連接;另一種方法是使用JNDI注冊(cè)數(shù)據(jù)源,然后在程序中查詢JNDI服務(wù)中的數(shù)據(jù)源,這樣用戶就只需要提供一個(gè)邏輯名稱,而不是數(shù)據(jù)庫(kù)登錄的具體細(xì)節(jié)。一.
配置數(shù)據(jù)源要使用第二種形式的 JNDI數(shù)據(jù)源,必須首先進(jìn)行配置數(shù)據(jù)源的 JNDI命名服務(wù)。由于Tomcat提供了一個(gè)稱為 DBCP(DatabaseConnectionPool)的數(shù)據(jù)源實(shí)現(xiàn),所以可以在server.xml文件中進(jìn)行數(shù)據(jù)源的配置即可。1.安裝
DBCPDBCP
依賴于以下幾個(gè)
apachejakarta項(xiàng)目的幾個(gè)公用包
:Commons-collections.jar首先查看這三個(gè)文件是否存在于 TOMCA common\lib 位置.如果不存在,則可以到下載.當(dāng)前的最新版本為 將其解壓縮,并將其中的.jar文件復(fù)制到TOMCAT_HOME\common\lib下.2.安裝相應(yīng)的后臺(tái)數(shù)據(jù)庫(kù)的 JDBC驅(qū)動(dòng)器到 common\lib 下.如OracleJDBC驅(qū)動(dòng)class12.jar,Sqlserver2000JDBC驅(qū)動(dòng) msbase.jar,mssqlserver.jar,msutil.jar3.配置
TOMCAT_HOME\conf\.server.xml
文件.配置JNDI數(shù)據(jù)源需要在 TOMCAT_HOME\conf\server.xml<Context>和</Context></host>標(biāo)簽之間添加資源聲明 :
文件的3.1.Tomcat5.5.
的配置在server.xml文件的最后部分的</Host>標(biāo)簽之前加入標(biāo)記<Context>??. </Context>即可連接池 -->以下配置連接 oracle數(shù)據(jù)庫(kù)<Contextpath="/ch14"docBase="d:\ch14" crossContext="true"debug="0"reloadable="true"><Resourcename="jdbc/oracle/ora9"auth="Container"url="jdbc:oracle:thin:@localhost:1521:ora9"username="system"password="lcm7373"maxActive="20"maxIdle="10"maxWait="-1"/></Context>連接池 -->以下配置連接 Sqlserver數(shù)據(jù)庫(kù)<Contextpath="/sqlserverds"reloadable="true"docBase="D:\eclipseApp\webapps1\sqlserverds"workDir="D:\eclipseApp\webapps1\sqlserverds\work"><Resourcename="jdbc/sqlserver/sqlserverDS"auth="Container"url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Sql2000DB"username="sa"password="sa"maxActive="20"maxIdle="10"maxWait="-1"/></Context>連接池 -->以下配置連接 mysql數(shù)據(jù)庫(kù)<Contextpath="/ch14"docBase="ch14"debug="0"reloadable="true"crossContext="true"><Resourcename="jdbc/mysql/sql_test"auth="Container"url="jdbc:mysql://localhost/sql_test?userUnicode=true&characterEncoding=gb2312"username="root"password="lcm3377"maxActive="20"maxIdle="10"maxWait="-1"/></Context>說(shuō)明:對(duì)于大型應(yīng)用,如果需要跨數(shù)據(jù)庫(kù)操作,則可以在一個(gè)
<Context>標(biāo)記中配置多個(gè)<Resource>子標(biāo)記.web應(yīng)用程序中數(shù)據(jù)源的使用方法:設(shè)計(jì)提供連接對(duì)象 Connection
的類packageimportimportimportimport
db;// 注意:獲得的 Connection 對(duì)象不能在普通的 java 類中(如在main函數(shù)中)直接調(diào)用因?yàn)?,?shù)據(jù)源由web服務(wù)器管理??!final
publicprivatestatic {//
class Database{static DataSource初始化靜態(tài)成員
ds=null
;//
靜態(tài)成員/*try{ContextinitCtx=newInitialContext();ContextenvCtx=(Context)initCtx.lookup("java:comp/env");ds=(DataSource)envCtx.lookup("jdbc/oracle/ora9");}catch(Exceptione2){e2.printStackTrace();}*/initialize ();}public Database(){}初始化數(shù)據(jù)源public static void initialize(){try {ContextinitCtx= newInitialContext();ContextenvCtx=(Context)initCtx.lookup(
"java:comp/env"
);//jdbc/oracle/ora9 數(shù)據(jù)源名ds=(DataSource)envCtx.lookup( "jdbc/oracle/ora9"}catch (Exceptione){e.printStackTrace();
);}}從連接池中獲得一個(gè)連接public static ConnectiongetConnection(){Connectionconn= null ;try {conn=ds.getConnection();}catch (Exceptione1){e1.printStackTrace();}return conn;}}.在業(yè)務(wù)邏輯方法處理類中使用池中的連接package db;import import // 業(yè)務(wù)邏輯層public class// 這個(gè)方法是在
BusinessLayer{jsp 頁(yè)面或servlet
中調(diào)用的業(yè)務(wù)邏輯方法
(專業(yè)用法
)
。public
CollectiongetNewPost(Stringsql){Collection<PostBean>postList=//Databasedb= newDatabase();Connectionconn= null ;Statementst= null ;ResultSetrs= null ;
newArrayList<PostBean>();try {conn=db. getConnection ();st=conn.createStatement();rs=st.executeQuery(sql);Stringprovince,city,tele,post;while (rs.next()){province=rs.getString( "province" );city=rs.getString( "city" );tele=rs.getString( "tele" );post=rs.getString( "post" );Stringt=province+ "\t" +city+ "\t" +tele+PostBeanpb= newPostBean(province,city,tele,post);postList.add(pb);System. out.println(t);
"\t"
+post;}}catch (Exceptione1){e1.printStackTrace();}finallytry {
{if (st!= nullst.close();
){}if (rs!= null ){rs.close();}if (conn!= null ){conn.close();}}catch (Exceptione2){e2.printStackTrace();}}return postList;}}在web頁(yè)面中調(diào)用業(yè)務(wù)邏輯方法核心代碼:<%要執(zhí)行的語(yǔ)句Stringsql="select*frompostwhereprovince='db.BusinessLayerbl=newdb.BusinessLayer();
四川'" ;CollectionpostList=bl.getNewPost(sql);//
獲得集合對(duì)象%>遍歷集合
postList
,顯示數(shù)據(jù)。3.2.Tomcat5.5以下版本配置以下配置連接 oracle數(shù)據(jù)庫(kù)<!--TomcatRootContext--><!--<Contextpath=""docBase="ROOT"debug="0">--><Contextpath="/ch14"docBase="ch14" crossContext="true"debug="0"reloadable="true"><Resourcename="jdbc/oracle/ora9" //JNDI名字auth="Container"<ResourceParamsname="jdbc/oracle/ora9"><parameter><name>factory</name></parameter><parameter><name>driverClassName</name></parameter><parameter><name>url</name><value>jdbc:oracle:thin:@localhost:1521:ora9</value></parameter><parameter><name>username</name><value>system</value></parameter><parameter><name>password</name><value>lcm7373</value></parameter><parameter><name>maxActive</name><value>20</value></parameter><parameter><name>maxIdle</name><value>10</value></parameter><parameter><name>maxWait</name><value>10000</value></parameter></ResourceParams></Context>以下配置連接 sqlserver數(shù)據(jù)庫(kù)<Contextpath="/jspdev"docBase="jspdev"debug="0"reloadable="true"crossContext="true"><parameter><name>factory</name></parameter><parameter><name>driverClassName</name></parameter><parameter><name>url</name></parameter><parameter><name>username</name><value>bn</value></parameter><parameter><name>password</name><value>bn</value></parameter><parameter><name>maxActive</name><value>20</value></parameter><parameter><name>maxIdle</name><value>10</value></parameter><parameter><name>maxWait</name><value>-1</value></parameter></ResourceParams></Context>4.配置web.xml文件(數(shù)據(jù)源在web.xml中的配置,對(duì)于 Tomcat高版本不是必需的要在web應(yīng)用中使用上面配置的 JNDI數(shù)據(jù)源,還需要在相應(yīng)的
)
web應(yīng)用配置文件web.xml中添加資源引用的配置 .例如:<web-app><description>JSP中的高級(jí)數(shù)據(jù)庫(kù)應(yīng)用實(shí)例 </description><resource-ref><description>DataSource</description><res-ref-name>jdbc/oracle/ora9</res-ref-name>//與server.xml中名稱一致</resource-ref></web-app>.使用配置的數(shù)據(jù)源獲得數(shù)據(jù)源核心代碼如下:方法一:Contextctx=newInitialContext();DataSourceds=(DataSource)ctx.lookup( “java:comp/env/jdbc/oracle/ora9方法二://1、創(chuàng)建命名服務(wù)環(huán)境Contextctx=newInitialContext();if(ctx==null)thrownewException("NoContext");//2、從JNDI中查詢數(shù)據(jù)源對(duì)象ContextenvCtx=(Context)ctx.lookup(" java:comp/env");ds=(DataSource)envCtx.lookup(" jdbc/oracle/ora9 ");
”)2.獲得數(shù)據(jù)庫(kù)連接對(duì)象Connectionconn=ds.getConnection();3.說(shuō)明:為了在應(yīng)用程序中更好的使用連接池技術(shù)獲得數(shù)據(jù)源
,進(jìn)而獲得一個(gè)連接對(duì)象
.通常采用如下的代碼來(lái)獲得連接對(duì)象
.3.1.方法一:publicclassSqlTestDS{privatestaticDataSourceds=null;static{init();}privatestaticvoidinit(){try{1、創(chuàng)建命名服務(wù)環(huán)境Contextctx=newInitialContext();if(ctx==null)thrownewException("NoContext");2、從JNDI中查詢數(shù)據(jù)源對(duì)象ContextenvCtx=(Context)ctx.lookup("java:comp/env");ds=(DataSource)envCtx.lookup("jdbcc/oracle/ora9");}catch(Exceptione){e.printStackTrace();}}//將構(gòu)造函數(shù)定義為 private權(quán)限是為了保證全局只有一個(gè) SqlTestDS實(shí)例也就是實(shí)現(xiàn)了單例模式privateSqlTestDS(){}publicstaticConnectiongetConnection()throwsSQLException{if(ds==null){thrownewSQLException("數(shù)據(jù)源對(duì)象為空! ");}else{3、從數(shù)據(jù)源中獲取數(shù)據(jù)庫(kù)連接returnds.getConnection();}}}3.2.方法二:publicclassDatabaseConn{//獲得連接對(duì)象publicstaticsynchronizedConnectiongetConnection()throwsException{try{1、創(chuàng)建命名服務(wù)環(huán)境ContextenvCtx=(Context)ctx.lookup("java:comp/env");ds=(DataSource)envCtx.lookup("jdbc/oracle/ora9");returnds.getConnection();}catch(SQLExceptione){throwe;}}catch(NamingExceptione){throwe;}}}有了這個(gè)類,便可以在需要的地方(java代碼或Jsp中)調(diào)用這個(gè)靜態(tài)方法獲得一個(gè)連接對(duì)象了.當(dāng)執(zhí)行完數(shù)據(jù)庫(kù)操作之后,可以執(zhí)行conn.close()方法,以便讓連接池管理器回收這個(gè)連接(但不關(guān)閉到數(shù)據(jù)庫(kù)的物理連接)Struts的JDBC數(shù)據(jù)源配置在struts中,一般是通過(guò) JDBC數(shù)據(jù)源來(lái)連接數(shù)據(jù)庫(kù)。JDBC數(shù)據(jù)源的配置通常放在 struts的配置文件中,這樣方便配置的修改。JDBC數(shù)據(jù)源可以在struts配置文件的<data-source>元素中定義。用<data-source>元素可以在數(shù)據(jù)源元素中定義多個(gè)數(shù)據(jù)源。一.<data-source>元素及其屬性的作用:元素屬性描述type實(shí)現(xiàn)JDBC擴(kuò)展API接口的類的名字autoCommit用這個(gè)數(shù)據(jù)源創(chuàng)建的連接,默認(rèn)的自動(dòng)提交模式。driverClassName用于實(shí)現(xiàn)JDBC驅(qū)動(dòng)程序接口的類urlJDBCUrl的值。username訪問(wèn)數(shù)據(jù)庫(kù)的用戶名。password訪問(wèn)數(shù)據(jù)庫(kù)的口令。autoCommit是否自動(dòng)提交true自動(dòng)提交false手動(dòng)提交key被action類用來(lái)查找這個(gè)數(shù)據(jù)源的(標(biāo)識(shí))名字description對(duì)這個(gè)數(shù)據(jù)源的描述loginTimeoutmaxCountminCountreadOnly
超時(shí)值。連接到這個(gè)數(shù)據(jù)源的最大連接數(shù)。需要?jiǎng)?chuàng)建的最少連接數(shù)。創(chuàng)建的連接的只讀狀態(tài)。說(shuō)明:當(dāng)配置了多個(gè)數(shù)據(jù)源時(shí)<data-source>的屬性key才是必需的。例1:下面是struts配置文件中定義的一個(gè)Sqlserver2000數(shù)據(jù)源的例子。<data-sources><data-sourcetype="mons.dbcp.BasicDataSource"><set-propertyproperty="autoCommit"value="true"/><set-propertyproperty="driverClassName"value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/><set-propertyproperty="url"value="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Sql2000DB"/><set-propertyproperty="username"value="sa"/><set-propertyproperty="password"value="sa"/><set-propertyproperty="maxCount"value="10"/><set-propertyproperty="minCount"value="2"/><!—以下為可選配置<set-propertyproperty=”description”value=”Sqlserver2000DataSource”/><set-propertyproperty=”maxActive”value=”10”/><set-propertyproperty=”maxWait”value=”5000”/><set-propertyproperty=”defaultAutoCommit”value=”false”/></data-source></data-sources>例2:下面是struts配置文件中定義的一個(gè)oracle92數(shù)據(jù)源的例子。<data-sourcetype="mons.dbcp.BasicDataSource"key="ora9"><set-propertyproperty="autoCommit"value="true"/><set-propertyproperty="description"value="Oracle92DataSource"/><set-propertyproperty="driverClassName"value="oracle.jdbc.driver.OracleDriver"/><set-propertyproperty="url"value="jdbc:oracle:thin:@localhost:1521:ora9"/><set-propertyproperty="username"val
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商鋪服務(wù)合同協(xié)議模板
- 種植葡萄入股合同協(xié)議
- 離婚父母贍養(yǎng)協(xié)議書(shū)模板
- 開(kāi)分店入股協(xié)議個(gè)人合同
- 大股東股權(quán)轉(zhuǎn)讓合同協(xié)議
- 租房合同協(xié)議住宅用房版
- 空間少兒美術(shù)課件
- 沙牌碾壓混凝土拱壩設(shè)計(jì)與關(guān)鍵技術(shù)研究
- 冬季預(yù)防煤氣中毒安全教育
- 零食行業(yè)店長(zhǎng)年終工作總結(jié)
- GA/T 992-2012停車庫(kù)(場(chǎng))出入口控制設(shè)備技術(shù)要求
- 河流專題復(fù)習(xí)-重點(diǎn)課件
- 企業(yè)風(fēng)險(xiǎn)管理-戰(zhàn)略與績(jī)效整合(中文版)
- 2022年全國(guó)職工書(shū)屋推薦書(shū)目
- 哈薩克斯坦鐵路車站代碼
- 裝配式建筑設(shè)計(jì)設(shè)計(jì)專篇
- 《教育心理學(xué)》教材
- 綏滿公路大慶黃牛場(chǎng)至齊齊哈爾宛屯段擴(kuò)建項(xiàng)目B4合同段施工組織設(shè)計(jì)
- 身體紅綠燈課件
- Pentacam白內(nèi)障應(yīng)用(第二版)
- 抗精神病藥物的選擇與聯(lián)合應(yīng)用
評(píng)論
0/150
提交評(píng)論