EJB數(shù)據(jù)源和連接池_第1頁
EJB數(shù)據(jù)源和連接池_第2頁
EJB數(shù)據(jù)源和連接池_第3頁
EJB數(shù)據(jù)源和連接池_第4頁
EJB數(shù)據(jù)源和連接池_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

連接池和數(shù)據(jù)源知識點連接池和數(shù)據(jù)源的基本概念配置Tomcat數(shù)據(jù)源配置struts數(shù)據(jù)源一.概述:在實際項目的開發(fā)中,特別是web應(yīng)用程序中,如Jsp,Servlet或EJB使用JDBC直接訪問數(shù)據(jù)庫中的數(shù)據(jù),每一次數(shù)據(jù)方請求必須建立連接,存取數(shù)據(jù),關(guān)閉連接等步驟,而數(shù)據(jù)庫連接是一種非常昂貴的資源,頻繁的建立連接,關(guān)閉連接必定是數(shù)據(jù)庫性能降低,再者,JDBC直接連接數(shù)據(jù)庫的方式還存在數(shù)據(jù)庫連接泄漏問題。使用數(shù)據(jù)庫連接池技術(shù)是解決上述問題的最常用的方法,在許多應(yīng)用服務(wù)器(如websphere,weblogic,jBoss)中都提供了這種技術(shù).二.連接池實現(xiàn)的原理:就是在應(yīng)用啟動時建立一定數(shù)量的數(shù)據(jù)庫連接,并將這些數(shù)據(jù)庫連接作為對象存儲在一個容器對象中。而程序中所有的數(shù)據(jù)庫請求訪問都可以共享這些連接,這樣,通過復(fù)用這些已經(jīng)建立的數(shù)據(jù)庫連接,不必在每次訪問數(shù)據(jù)庫時都重新建立連接,極大的節(jié)省了系統(tǒng)資源和時間。另外,為了回收并重新使用那些沒有及時關(guān)閉的數(shù)據(jù)庫連接,連接池都提供了一種超時回收機制。也就是當(dāng)數(shù)據(jù)庫的連接在指定的時間內(nèi)沒有活動,連接池就把這些連接重新放到可以使用的隊列。新的連接請求到來時便可以再次使用這些連接。這種超時回收連接的機制可以克服數(shù)據(jù)庫鏈接泄漏的問題。三.幾個常見的開源的數(shù)據(jù)庫連接池DBCP連接池它是一個依賴于Jakatacommons-pool對象池機制的數(shù)據(jù)庫連接池,DBCP可以直接在應(yīng)用程序中使用。1.1.官方下載網(wǎng)址:/commons/dbcp/1.2.將下載後的文件解壓獲得三個jar文件commons-dbcp-1.2.1.jar,commons-pool-1.3.jar,commons-collections-3.2.jar1.3.將上述三個.jar文件保存到項目的WEB-INF\lib下,即加入到CLASSPATH中。1.4.使用方法1.4.1.直接在程序中使用首先要創(chuàng)建BasicDataSource,然后通過它來獲得數(shù)據(jù)庫連接對象ConnectionPropertiesp=newProperties();1.4.2.通過tomcat使用DBCP數(shù)據(jù)源需要修改tomcat的server.xml文件或者配置位于tomcat文件夾下conf\Catelina\local文件夾下的“項目名稱.xml”文件Class.forName(“”);//加載驅(qū)動程序Connectionconn=DriverManager.getConnection(proxool.)三.在 Tomcat上配置連接池與配置數(shù)據(jù)源基本相同。唯一需要的就是在

server.xml文件中的

<ResourceParams>標(biāo)簽之間添加幾個與連接池相關(guān)的參數(shù)設(shè)置。配置連接池時需要添加的配置代碼段:<!—回收被遺棄的(一般是忘了釋放的 )數(shù)據(jù)庫鏈接到連接池中<parameter><name>removeAbandoned</name><value>true</value></parameter><!—數(shù)據(jù)庫鏈接超過 60秒不用將視為被遺棄而回收到連接池中<parameter><name>removeAbandonedTimeout</name><value>60</value></parameter><!—將被遺棄的數(shù)據(jù)庫鏈接的回收記入日至<parameter><name>logAbandoned</name><value>true</value></parameter>Tomcat中的數(shù)據(jù)源數(shù)據(jù)源是JDBC2.0種引入的一個概念。并且在 javax.sql包中定義了接口描述這個概念。在數(shù)據(jù)庫的 JDBC驅(qū)動程序中有該接口的實現(xiàn)類。例如 :

DataSource來

中的

類就實現(xiàn)了

DataSource接口。在程序中使用數(shù)據(jù)源有兩種方式:一種是在程序中直接創(chuàng)建類的對象,該對象實現(xiàn)了JDBC驅(qū)動程序中的DataSource接口.并使用該對象獲得數(shù)據(jù)庫連接;另一種方法是使用JNDI注冊數(shù)據(jù)源,然后在程序中查詢JNDI服務(wù)中的數(shù)據(jù)源,這樣用戶就只需要提供一個邏輯名稱,而不是數(shù)據(jù)庫登錄的具體細(xì)節(jié)。一.

配置數(shù)據(jù)源要使用第二種形式的 JNDI數(shù)據(jù)源,必須首先進行配置數(shù)據(jù)源的 JNDI命名服務(wù)。由于Tomcat提供了一個稱為 DBCP(DatabaseConnectionPool)的數(shù)據(jù)源實現(xiàn),所以可以在server.xml文件中進行數(shù)據(jù)源的配置即可。1.安裝

DBCPDBCP

依賴于以下幾個

apachejakarta項目的幾個公用包

:Commons-collections.jar首先查看這三個文件是否存在于 TOMCA common\lib 位置.如果不存在,則可以到下載.當(dāng)前的最新版本為 將其解壓縮,并將其中的.jar文件復(fù)制到TOMCAT_HOME\common\lib下.2.安裝相應(yīng)的后臺數(shù)據(jù)庫的 JDBC驅(qū)動器到 common\lib 下.如OracleJDBC驅(qū)動class12.jar,Sqlserver2000JDBC驅(qū)動 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ù)庫<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ù)庫<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ù)庫<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>說明:對于大型應(yīng)用,如果需要跨數(shù)據(jù)庫操作,則可以在一個

<Context>標(biāo)記中配置多個<Resource>子標(biāo)記.web應(yīng)用程序中數(shù)據(jù)源的使用方法:設(shè)計提供連接對象 Connection

的類packageimportimportimportimport

db;// 注意:獲得的 Connection 對象不能在普通的 java 類中(如在main函數(shù)中)直接調(diào)用因為,數(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();

);}}從連接池中獲得一個連接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// 這個方法是在

BusinessLayer{jsp 頁面或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頁面中調(diào)用業(yè)務(wù)邏輯方法核心代碼:<%要執(zhí)行的語句Stringsql="select*frompostwhereprovince='db.BusinessLayerbl=newdb.BusinessLayer();

四川'" ;CollectionpostList=bl.getNewPost(sql);//

獲得集合對象%>遍歷集合

postList

,顯示數(shù)據(jù)。3.2.Tomcat5.5以下版本配置以下配置連接 oracle數(shù)據(jù)庫<!--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ù)庫<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中的配置,對于 Tomcat高版本不是必需的要在web應(yīng)用中使用上面配置的 JNDI數(shù)據(jù)源,還需要在相應(yīng)的

)

web應(yīng)用配置文件web.xml中添加資源引用的配置 .例如:<web-app><description>JSP中的高級數(shù)據(jù)庫應(yīng)用實例 </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ù)源對象ContextenvCtx=(Context)ctx.lookup(" java:comp/env");ds=(DataSource)envCtx.lookup(" jdbc/oracle/ora9 ");

”)2.獲得數(shù)據(jù)庫連接對象Connectionconn=ds.getConnection();3.說明:為了在應(yīng)用程序中更好的使用連接池技術(shù)獲得數(shù)據(jù)源

,進而獲得一個連接對象

.通常采用如下的代碼來獲得連接對象

.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ù)源對象ContextenvCtx=(Context)ctx.lookup("java:comp/env");ds=(DataSource)envCtx.lookup("jdbcc/oracle/ora9");}catch(Exceptione){e.printStackTrace();}}//將構(gòu)造函數(shù)定義為 private權(quán)限是為了保證全局只有一個 SqlTestDS實例也就是實現(xiàn)了單例模式privateSqlTestDS(){}publicstaticConnectiongetConnection()throwsSQLException{if(ds==null){thrownewSQLException("數(shù)據(jù)源對象為空! ");}else{3、從數(shù)據(jù)源中獲取數(shù)據(jù)庫連接returnds.getConnection();}}}3.2.方法二:publicclassDatabaseConn{//獲得連接對象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;}}}有了這個類,便可以在需要的地方(java代碼或Jsp中)調(diào)用這個靜態(tài)方法獲得一個連接對象了.當(dāng)執(zhí)行完數(shù)據(jù)庫操作之后,可以執(zhí)行conn.close()方法,以便讓連接池管理器回收這個連接(但不關(guān)閉到數(shù)據(jù)庫的物理連接)Struts的JDBC數(shù)據(jù)源配置在struts中,一般是通過 JDBC數(shù)據(jù)源來連接數(shù)據(jù)庫。JDBC數(shù)據(jù)源的配置通常放在 struts的配置文件中,這樣方便配置的修改。JDBC數(shù)據(jù)源可以在struts配置文件的<data-source>元素中定義。用<data-source>元素可以在數(shù)據(jù)源元素中定義多個數(shù)據(jù)源。一.<data-source>元素及其屬性的作用:元素屬性描述type實現(xiàn)JDBC擴展API接口的類的名字autoCommit用這個數(shù)據(jù)源創(chuàng)建的連接,默認(rèn)的自動提交模式。driverClassName用于實現(xiàn)JDBC驅(qū)動程序接口的類urlJDBCUrl的值。username訪問數(shù)據(jù)庫的用戶名。password訪問數(shù)據(jù)庫的口令。autoCommit是否自動提交true自動提交false手動提交key被action類用來查找這個數(shù)據(jù)源的(標(biāo)識)名字description對這個數(shù)據(jù)源的描述loginTimeoutmaxCountminCountreadOnly

超時值。連接到這個數(shù)據(jù)源的最大連接數(shù)。需要創(chuàng)建的最少連接數(shù)。創(chuàng)建的連接的只讀狀態(tài)。說明:當(dāng)配置了多個數(shù)據(jù)源時<data-source>的屬性key才是必需的。例1:下面是struts配置文件中定義的一個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配置文件中定義的一個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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論