我寫了一支java程式,遇到一個神奇的狀況會把系統打趴,以為是系統環境的設定問題,最後找到是我對 try 的了解不夠造成。
有問題的 code:
if (conn != null) {
try {
CachedRowSet crs = null;
crs = new CachedRowSetImpl();
statement = conn.createStatement();
statement.executeUpdate(expression, Statement.RETURN_GENERATED_KEYS);
crs.populate(statement.getGeneratedKeys());
if (crs != null) {
if (crs.next()) {
ret = crs.getLong(1);
}
crs.close();
}
conn.close();
} catch (SQLException e) {
if (printSqlExcpetion) {
Log.d(expression);
Log.d("SQLException:" + e.toString());
}
}
}
正確的 code:
if (conn != null) {
try {
CachedRowSet crs = null;
crs = new CachedRowSetImpl();
statement = conn.createStatement();
statement.executeUpdate(expression, Statement.RETURN_GENERATED_KEYS);
crs.populate(statement.getGeneratedKeys());
if (crs != null) {
if (crs.next()) {
ret = crs.getLong(1);
}
crs.close();
}
} catch (SQLException e) {
if (printSqlExcpetion) {
TKLog.d(expression);
TKLog.d("SQLException:" + e.toString());
}
}
try {
conn.close();
} catch (SQLException e) {
TKLog.d("Force close connection:" + e.toString());
}
}
如果是使用單純的 connection 不會有這個問題,遇到共用 connection 時,有程式沒有正確地關閉 connection 會造成其他人無法正確使用 connection pool 裡的 connection.