在 Java Web 專案中,透過 Tomcat 內建的 JNDI 資料源 (javax.sql.DataSource) 管理連線池,是標準且高效的做法。本文涵蓋 context.xml 設定、驅動程式部署、JNDI 查找與程式碼使用全流程。
編輯 $CATALINA_BASE/conf/context.xml (或專案 META-INF/context.xml):
<Context reloadable="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/Oracle"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="scott"
password="tiger"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@192.168.1.3:1521:ora92"
/>
</Context>
關鍵屬性:maxActive 最大連線數、maxIdle 最大閒置、maxWait 取得連線最長等待毫秒數。
將 ojdbc8.jar (或舊版 ojdbc6.jar) 放入 $CATALINA_HOME/lib/ 目錄,**不可** 放在專案 WEB-INF/lib,否則會發生類別載入衝突導致 Cannot create JDBC driver 錯誤。
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
public void insertUser(String username, String password) {
String sql = "INSERT INTO users(username, password) VALUES (?, ?)";
try {
Context initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:/comp/env/jdbc/Oracle");
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, username);
ps.setString(2, password);
ps.executeUpdate();
} // try-with-resources 自動關閉
} catch (Exception e) {
e.printStackTrace();
}
}
java:/comp/env/ 開頭對應 context.xml 的 name 屬性。oracle.jdbc.OracleDriver (舊版 oracle.jdbc.driver.OracleDriver 已棄用)。Initializing data source 'jdbc/Oracle' 表示成功。context.xml 加入 validationQuery="SELECT 1 FROM DUAL" 與 testOnBorrow="true" 保證連線有效。