部署至 GlassFish 的 Java Web 專案使用 JavaDB (Derby),每次啟動伺服器與資料庫後,首次連線必須在管理主控台手動 Ping 連線池並重啟 JavaDB 程序才能成功,極度影響自動化部署。
validation-classname 或 validation-table 可能不匹配,導致首次驗證失敗。在 GlassFish 管理主控台 → Resources → JDBC → Connection Pools → [YourPool] 設定:
1(啟動時預建連線)。2。300 秒。table 或 auto-commit。SYS.SYSTABLES(Derby 系統表,必定存在)。# 啟動腳本範例 (Linux/Unix)
# 1. 先啟動 JavaDB (Network Server 模式)
nohup java -jar $DERBY_HOME/lib/derbyrun.jar server start -p 1527 > derby.log 2>&1 &
# 2. 等待端口就緒 (可加入健康檢查迴圈)
while ! nc -z localhost 1527; do sleep 1; done
# 3. 再啟動 GlassFish
asadmin start-domain domain1
@Resource(name = "jdbc/MyDataSource")
DataSource ds;
public Connection getConnectionWithRetry(int maxRetry = 5, long intervalMs = 2000) {
for (int i = 0; i < maxRetry; i++) {
try {
Connection conn = ds.getConnection();
if (conn.isValid(2)) return conn;
} catch (SQLException e) {
log.warn("連線失敗,{}ms 後重試 ({}/{})", intervalMs, i+1, maxRetry);
Thread.sleep(intervalMs);
}
}
throw new RuntimeException("資料庫連線重試耗盡");
}
「首次 Ping 失敗」本質是服務就緒順序與連線池驗證策略不匹配。透過調大 Steady Pool Size、設定正確 Validation Table、確保 JavaDB 先於 GlassFish 就緒,即可實現「一次啟動、自動連線、零人工干預」。