我有以下来源。
在 insertMessage(..) 中,它调用 selectMessage 来检查是否存在重复记录。
但是会出现这个错误。在我的大脑中,它工作得很好,因为数据源给了我新的连接......也许
java.sql.SQLException: ResultSet closed
at org.sqlite.RS.checkOpen(RS.java:63)
at org.sqlite.RS.findColumn(RS.java:108)
at org.sqlite.RS.getString(RS.java:317)
at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)
at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)
at org.springframework.context.support.CachedMessageSourceDao.selectMessage(CachedMessageSourceDao.java:68)
at org.springframework.context.support.CachedMessageSourceDao.insertMessage(CachedMessageSourceDao.java:94)
at MessageSourceDemo.main(MessageSourceDemo.java:11)
public String selectMessage(String code, String language) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String value = null;
String sql = "SELECT code, value, language FROM " + TABLE + " where code=? and language=? and flag = '" + FLAG_OK + "'";
try {
conn = dataSource.getConnection();
conn.setAutoCommit(true);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, code);
pstmt.setString(2, language);
rs = pstmt.executeQuery();
rs.next();
String _code = rs.getString("code");
String _value = rs.getString("value");
String _language = rs.getString("language");
Locale _locale = new Locale(_language);
value = _value;
} catch(SQLException ex) {
ex.printStackTrace();
} finally {
try {
if(rs != null);
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return value;
}
public synchronized void insertMessage(String code, String value, String language) throws SQLException {
//Duplicate Message Check
**if(selectMessage(code, language) != null) throw new SQLException("Duplicate message exists for code: " + code + " and" + "language: " + language);**
String sql = "INSERT INTO " + TABLE + " (code, value, language, flag) values (?, ?, ?, '" + FLAG_OK + "')";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(true);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, code);
pstmt.setString(2, value);
pstmt.setString(3, language);
pstmt.execute();
} catch(SQLException ex) {
ex.printStackTrace();
} finally {
try {
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
notifyMessageChange(); //Realtime apply to MessageSource
}