在學習 J2EE 與 EJB 的過程中,資料庫的選擇直接影響開發體驗。商業資料庫(Oracle、DB2)安裝龐大、資源佔用高,對開發機器構成沉重負擔。MySQL 憑藉輕量級、開源免費、跨平台等優勢,成為 J2EE 開發與測試環境的首選。本文記錄 J2EE 1.2.1 整合 MySQL 3.23 的完整配置流程,助您避開版本陷阱與配置坑點。
| 軟體 | 版本 | 備註 |
|---|---|---|
| 作業系統 | Windows NT 4.0 | 測試環境 |
| J2EE SDK | 1.2.1 | Sun 參考實作 |
| JDK | 1.3.0 | |
| MySQL | 3.23.23-beta-win | 必須 ≥ 3.23.15 |
| JDBC 驅動 | mm.mysql-2.0.2 | org.gjt.mm.mysql.Driver |
血淚教訓:早期常用 MySQL 3.22.x 版本,但 J2EE 要求 3.23.15 以上(支援更完整的 JDBC 2.0 API)。版本不符會導致啟動時出現難以理解的 ClassNotFoundException 或 SQLException,浪費數小時排查。
編輯 $J2EE_HOME/config/default.properties,新增/修改以下兩行:
jdbc.drivers=org.gjt.mm.mysql.Driver
jdbc.datasources=jdbc/TestDb|jdbc:mysql://localhost:3306/test?user=jian&password=jian
jdbc.drivers:指定 JDBC 驅動完整類名,確保驅動 JAR(mm.mysql-2.0.2-bin.jar)已放入 $J2EE_HOME/lib 目錄。jdbc.datasources:格式為 JNDI名稱|JDBC URL。jdbc/TestDb 為 JNDI 查詢名稱,EJB 透過此名稱查找 DataSource。import javax.naming.*;
import javax.sql.DataSource;
import java.sql.Connection;
public class MyBean implements SessionBean {
private DataSource ds;
public void setSessionContext(SessionContext ctx) {
try {
Context ic = new InitialContext();
ds = (DataSource) ic.lookup("java:comp/env/jdbc/TestDb"); // 標準 JNDI 路徑
} catch (NamingException e) {
throw new EJBException(e);
}
}
public void someBusinessMethod() {
Connection conn = null;
try {
conn = ds.getConnection(); // 從連線池取得連線
// 執行 SQL...
} catch (SQLException e) {
throw new EJBException(e);
} finally {
if (conn != null) try { conn.close(); } catch (SQLException ignored) {}
}
}
}
注意:J2EE 參考實作會自動將 default.properties 中定義的資料源綁定至 java:comp/env/jdbc/... 命名空間,EJB 應使用完整 JNDI 路徑查找。
| 現象 | 可能原因 | 處理建議 |
|---|---|---|
啟動時 error.log 出現 Cannot find principal mapping information for data source with JNDI name jdbc/TestDb |
J2EE 1.2.1 的安全機制預期有 principal mapping,但未配置 | 可忽略。若 EJB 能正常取得連線並執行 SQL,此警告不影響功能。屬於參考實作的已知瑕疵。 |
組裝工具產生的 JAR 執行時彈出 無效的 Windows NT 映像 |
J2EE 參考實作的部署工具與特定 JDK 版本相容性問題 | 改用命令列 deploytool 或 Ant 腳本打包,避開 GUI 工具 Bug。 |
ClassNotFoundException: org.gjt.mm.mysql.Driver |
驅動 JAR 未置於正確目錄 | 確認 mm.mysql-2.0.2-bin.jar 在 $J2EE_HOME/lib 或啟動類路徑中。 |
連線被拒絕 Connection refused |
MySQL 服務未啟動或埠號錯誤 | 檢查 MySQL 是否運行於 3306 埠,防火牆是否放行。 |
default.properties、ejb-jar.xml、程式碼查找三處名稱必須一致。J2EE 整合 MySQL 看似簡單,實則暗藏版本相容、JNDI 命名、驅動部署等細節陷阱。掌握上述配置要點與常見錯誤應對,即可輕鬆建立輕量級 J2EE 開發環境,專注於 EJB 業務邏輯開發,而非與基礎設施糾纏。