有關(guān)tomcat配置jndi的一些簡單介紹:
先說流程:(根據(jù)tomcat有關(guān)jndi的文檔,這個文檔應(yīng)該是針對單個項目配置,下面有比較好的可以配置全局使用的例子)
1.先安裝jdbc驅(qū)動,這一步很簡單,只需將對應(yīng)數(shù)據(jù)庫驅(qū)動放到tomcat對應(yīng)common/lib目錄下就行了;
2.修改對應(yīng)項目的WEB-INF/web.xml文件,用來聲明你的jndi名字以供你的項目使用:
在你的web.xml文件中加入如下代碼:
<resource-ref></resource-ref><description></description><resource-ref><description>Resource reference to a factory for java.sql.Connectioninstances that may be used for talking to a particulardatabase that is configured in the server.xml file.</description><res-ref-name>jdbc/EmployeeDB</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>
3.對應(yīng)java代碼中獲得連接方法:(代碼摘要)
Context initCtx = new InitialContext();Context envCtx = (Context) initCtx.lookup("java:comp/env");DataSource ds = (DataSource)envCtx.lookup("jdbc/EmployeeDB");Connection conn = ds.getConnection();... use this connection to access the database ...conn.close();
4.配置你的tomcat資源工廠:
在WEB-INF目錄下新建文件context.xml,內(nèi)容如下:
<context></context><Context ...>...<Resource name="jdbc/EmployeeDB" auth="Container"type="javax.sql.DataSource" username="dbusername" password="dbpassword"driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database"maxActive="8" maxIdle="4"/>...</Context>
這里使用HypersonicSQL database JDBC driver作為例子,不同數(shù)據(jù)庫大家可以找對應(yīng)的字段改一下就行,關(guān)于具體字段含義
后面有說明。
大概步驟已經(jīng)完了,后面大家應(yīng)該明白怎么做了,關(guān)于建立通用的連接池的方法這里不寫了,我在后面貼出來英文的,大家慢慢看
以下摘自tomcat關(guān)于jndi的官方文檔:
所有安裝tomcat的可以在tomcat目錄下找到對應(yīng)文章,路徑如下:
D:/apache-tomcat-5.5.25/webapps/tomcat-docs/jndi-resources-howto.html
紅字標(biāo)出的是tomcat解壓目錄,大家改成自己對應(yīng)目錄就可以了
關(guān)于context.xml中對應(yīng)字段解釋地址如下:
http://commons.apache.org/dbcp/configuration.html
或者大家看后面我引用別人的例子也行,里面有詳細(xì)的中文介紹
------------------------------------------------------------------------------------------------
以下是網(wǎng)上找的一篇文章,感覺寫的也很好,抄過來供大家看看:
數(shù)據(jù)源:
JDBC2.0提供了javax.sql.DataSource的接口,負(fù)責(zé)與數(shù)據(jù)庫建立連接,實際應(yīng)用時不需要編寫連接數(shù)據(jù)庫代碼,直接從數(shù)據(jù)源獲得數(shù)據(jù)庫的連接。Dataource中事先建立了多個數(shù)據(jù)庫連接,這些數(shù)據(jù)庫連接保持在數(shù)據(jù)庫連接池中,當(dāng)程序訪問數(shù)據(jù)庫時,只需要從連接池從取出空閑的連接,訪問數(shù)據(jù)庫結(jié)束,在將這些連接歸還給連接池。DataSource對象由容器(Tomcat)提供,不能使用創(chuàng)建實例的方法來生成 DataSource對象,要采用JAVA的JNDI(Java Nameing and Directory Interface,java命名和目錄接口)來獲得DataSource對象的引用。(另有一種說法:“其實從技術(shù)上來說,數(shù)據(jù)源連接方式是不需要目錄服務(wù)的,我們同樣可以通過序列化數(shù)據(jù)源對象直接訪問文件系統(tǒng)。這點(diǎn)是需要明確的。”感興趣的朋友可以試試。)JNDI是一種將對象和名字綁定的技術(shù),對象工廠負(fù)責(zé)生產(chǎn)出對象,這些對象都和唯一的名字相綁定。程序中可以通過這個名字來獲得對象的引用。Tomcat把DataSource作為一種可配置的 JNDI資源來處理,生成DataSource對象的工廠為 org.apache.comm.ons.dbcp.BasicDataSourceFactory。
配置數(shù)據(jù)源:
配置數(shù)據(jù)源其實相當(dāng)簡單:
首先在server.xml中加入<resource></resource>元素,打開server.xml,在<context></context>中加入以下代碼(以oracle為例):
<resource type="javax.sql.DataSource" auth="Container" name="jdbc/ JNDI名字"></resource> <resourceparams name="jdbc/JNDI名字"></resourceparams> <parameter></parameter> <name></name>factory <value></value>org.apache.commons.dbcp.BasicDataSourceFactory <parameter></parameter> <name></name>maxActive <value></value>100 <parameter></parameter> <name></name>maxIdle <value></value>30 <parameter></parameter> <name></name>maxWait <value></value>10000 <parameter></parameter> <name></name>username <value></value>用戶名 <parameter></parameter> <name></name>password <value></value>密碼 <parameter></parameter> <name></name>driverClassName <value></value>oracle.jdbc.driver.OracleDriver <parameter></parameter> <name></name>url <value></value>jdbc:oracle:thin:@ip:端口:sid |
<resource></resource>元素的屬性如下:
屬性 | 描述 |
name | 指定Resource的JNDI的名字 |
auth | 指定管理Resource的Manager,由兩個可選值:Container和Application。Container表示由容器來創(chuàng)建和管理 Resource,Application表示由WEB應(yīng)用來創(chuàng)建和管理Resource。如果在web application deployment descriptor中使用<resource-ref></resource-ref>,這個屬性是必需的,如果使用<resource-env-ref></resource-env-ref>,這個屬性是可選的。 |
type | 指定Resource所屬的java類名 |
<resourceparams></resourceparams>元素的屬性如下:
屬性 | 描述 |
name | 指定ResourceParams的JNDI的名字,必須和Resource的name保持一致 |
factory | 指定生成DataSource對象的factory的類名 |
maxActive | 指定數(shù)據(jù)庫連接池中處于活動狀態(tài)的數(shù)據(jù)庫連接最大數(shù)目,0表示不受限制 |
maxIdle | 指定數(shù)據(jù)庫連接池中處于空閑狀態(tài)的數(shù)據(jù)庫連接的最大數(shù)目,0表示不受限制 |
maxWait | 指定數(shù)據(jù)庫連接池中的數(shù)據(jù)庫連接處于空閑狀態(tài)的最長時間(單位為毫秒),超過這一事件,將會拋出異常。-1表示可以無限期等待。 |
username | 指定連接數(shù)據(jù)庫的用戶名 |
password | 指定連接數(shù)據(jù)庫的密碼 |
driverClassName | 指定連接數(shù)據(jù)庫的JDBC驅(qū)動程序 |
url | 指定連接數(shù)據(jù)庫的URL |
其他文章說以上配置就OK了,對于web.xml的配置可有可無,其實不是這樣子的。如果在web應(yīng)用中訪問了由Servlet容器管理的某個 JNDI Resource,則必須在web.xml中聲明對這個JNDI Resource的引用。表示資源引用的元素為<resource-ref></resource-ref>,該元素加在<wepapp></wepapp>中。
<resource-ref></resource-ref> <descryiption></descryiption>DB Connection <res-ref-name></res-ref-name>jdbc/JNDI名字 <res-type></res-type>javax.sql.DataSource <res-auth></res-auth>Container |
<resource-ref></resource-ref>元素的屬性如下:
屬性 | 描述 |
description | 對所引用的資源的說明 |
res-ref-name | 指定所引用資源的JNDI名字,與<resource></resource>元素中的name屬性保持一致 |
res-type | 指定所引用資源的類名字,與<resource></resource>元素中的type屬性保持一致 |
res-auth | 指定所引用資源的Manager,與<resource></resource>元素中的auth屬性保持一致 |
到這里,數(shù)據(jù)源就已經(jīng)配置成功了。但是我在測試的時候除了一點(diǎn)小麻煩,主要原因是對DataSource的概念沒搞清楚。我是這么測試的,寫一個測試類,然后在eclipse中進(jìn)行junit測試,捕獲的異常為:
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。
同樣的代碼在JSP文件中正常運(yùn)行,后來翻了一些資料,終于找到了問題的所在了。原來DataSource是由容器(TOMCAT)提供的,所以我的測試會拋出異常。為了再次驗證想法是否正確,在jsp文件中import剛才拋出異常的類,在進(jìn)行連接數(shù)據(jù)庫,結(jié)果一切正常。
下面的例子是實際應(yīng)用中使用DataSource,在jsp文件中連接oracle。
另:tomcat5.5的配制方法為:
maxActive="100" maxIdle="30" maxWait="10000"
username="用戶名" password="密碼" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@ip:端口:sid"/>
聯(lián)系客服