今天鬱悶了一下午,Tomcat6配置Oracle資料庫的JNDI就是不好用,後來請教了我師父,終於弄好了,弄好了以後回過頭來再一想,偶實在是太粗心了,本來doc上寫的很清楚的東西我居然沒看到,唉……趕快寫出來,以免其他人遇到這個問題時也像我一樣鬱悶。
1. 配置Oracle JDBC Driver。將classes111.jar(Oracle8i)或classes12.jar(Oracle9i)或ojdbc14.jar(Oracle10g)拷貝到$CATALINA_HOME/lib(或Windows系統中%CATALINA_HOME%/lib)目錄下。
注意:老版本的Drivers可能是*.zip或者是*.jar的檔案,Tomcat只會使用$CATALINA_HOME/lib目錄下的*.jar檔案,因此需要把classes111.zip或classes12.zip檔案rename為classes111.jar以及classes12.jar檔案,因為jar檔案就是zip檔案,所以沒有必要去unzip這些zip檔案再打成jar檔案。
另外:Oracle9i及以後的版本應該使用oracle.jdbc.OracleDriver而不建議使用oracle.jdbc.driver.OracleDriver,因為Oracle已經聲明oracle.jdbc.driver.OracleDriver已經不再建議使用,並且Oracle也將不會提供後續主要版本對於oracle.jdbc.driver.OracleDriver的服務。
2. 修改Tomcat的server.xml檔案,主要內容如下
<Context docBase="niniapp" path="/niniapp" reloadable="true" source="org.eclipse.jst.jee.server:qprlzy">
<Resource name="JNDI_NINIAPP" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="nini" password="nini" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.2.9:1521:orcl"/>
</Context>
在這裡添加的資料來源的名字為JNDI_NINIAPP,username是資料庫使用者名稱;password是資料庫中該使用者名稱對應的密碼;driverClassName是資料庫驅動;maxIdle是最大空閑數,即資料庫連接的最大空閑時間,超過空閑時間,資料庫連接將被標記為不可用,然後被釋放掉,如果設為0,則表示無限制;maxActive是串連池中最大資料庫連接數,如果設為0,則表示無限制;maxWait是最大建立串連等待時間,如果超過次時間就會報異常,如果設為-1,則表示無限制。
我師父給我推薦的blog上也提到在可以這樣寫:
<Context docBase="niniapp" path="/qprlzy" reloadable="true" source="org.eclipse.jst.jee.server:qprlzy">
<Resource name="JNDI_NINIAPP" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="JNDI_NINIAPP">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@192.168.2.9:1521:orcl</value>
</parameter>
<parameter>
<name>username</name>
<value>nini</value>
</parameter>
<parameter>
<name>password</name>
<value>nini</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>
<ResourceLink global="JNDI_NINIAPP" name="JNDI_NINIAPP" type="javax.sql.DataSource"/>
</Context>
我試過了,兩種寫法都可以成功。當然,我看還有通過Tomcat的web應用管理介面(Tomcat Web Server Administration
Tool)來配置JNDI的方法,不過我沒有實驗過哈。
3. 有人說還要配web.xml,我不用配就OK,有哥們說如果不進行一下配置的話,Tomcat4配置串連池就會失敗,這是Tomcat4的bug嗎?偶不關心啦!不過如果要配置的話,則需要在E;/niniapp/WEB/WEB-INF/web.xml中加入如下內容:
<web-app>
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
其中,res-ref-name是資料來源名字,與上面server.xml中所配置的屬性name的值。
4. 代碼範例:
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
按照上面步驟,我測試終於通過了!