以下說明基於 Tomcat-5.x 的說明,可在 https://tomcat.dev.org.tw/tomcat-5.5-doc/jndi-datasource-examples-howto.html 找到,這是撰寫本文時的最新版本。
首先,將 Connector/J 隨附的 .jar
檔案安裝在 $CATALINA_HOME/common/lib
中,以便容器中安裝的所有應用程式都可以使用它。
接下來,在定義 Web 應用程式的內容中,將宣告資源新增至 $CATALINA_HOME/conf/server.xml
來設定 JNDI 資料來源
<Context ....>
...
<Resource name="jdbc/MySQLDB"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/MySQLDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>5</value>
</parameter>
<parameter>
<name>validationQuery</name>
<value>SELECT 1</value>
</parameter>
<parameter>
<name>testOnBorrow</name>
<value>true</value>
</parameter>
<parameter>
<name>testWhileIdle</name>
<value>true</value>
</parameter>
<parameter>
<name>timeBetweenEvictionRunsMillis</name>
<value>10000</value>
</parameter>
<parameter>
<name>minEvictableIdleTimeMillis</name>
<value>60000</value>
</parameter>
<parameter>
<name>username</name>
<value>someuser</value>
</parameter>
<parameter>
<name>password</name>
<value>somepass</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://127.0.0.1:3306/test</value>
</parameter>
</ResourceParams>
</Context>
Connector/J 引入了一項功能,即可以使用值設定為 /* ping */
的 validationQuery
,而不是使用 SELECT 1
的 validationQuery
值。這會向伺服器發送 ping,然後傳回假的結果集。這是一種較輕量的解決方案。它還有一個優點,如果使用 ReplicationConnection
或 LoadBalancedConnection
類型的連線,則 ping 將透過所有作用中的連線發送。以下 XML 片段說明如何選擇此選項
<parameter>
<name>validationQuery</name>
<value>/* ping */</value>
</parameter>
請注意,/* ping */
必須完全按照指定方式指定。
一般來說,請遵循您的 Tomcat 版本隨附的安裝說明,因為在 Tomcat 中設定資料來源的方式會不時變更,如果您在 XML 檔案中使用錯誤的語法,則很可能會以類似以下的例外狀況結束
Error: java.sql.SQLException: Cannot load JDBC driver class 'null ' SQL
state: null
請注意,在 JDBC 4.0 和更新版本中,具有 META-INF/service/java.sql.Driver
類別的驅動程式自動載入,會在 Windows 上造成 Tomcat 中 Connector/J 驅動程式的未正確解除部署。也就是說,Connector/J jar 仍然處於鎖定狀態。這是一個與驅動程式無關的初始化問題。如果可行,可能的解決方法如下:使用 "antiResourceLocking=true
" 作為 Tomcat Context 屬性,或移除 META-INF/
目錄。