我有一个DAO类,它有下面的方法。我称之为交易管理器内部的这个。当我在没有"conn.commit()"行的情况下运行它时,它会抛出超时异常,但当我用这个行运行它时——它没问题。问题出在哪里?正如我所知,如果你不修改数据库,就没有必要提交?
@Override
public List<String> getLinks(int id) throws SQLException {
List<String> list = new ArrayList<>();
Connection conn = factory.newConnection();
Statement statement = null;
ResultSet rs = null;
try {
String expression = "select link from users.links where id=" + id + " order by id_link desc";
statement = conn.createStatement();
rs = statement.executeQuery(expression);
while (rs.next()) {
list.add(rs.getString("link"));
}
// !!!!!!!!!!!!! without next line method throw TimeoutException
conn.commit(); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return list;
} catch (SQLException e) {
rollBackQuietly(conn);
e.printStackTrace();
} finally {
closeQuaitly(rs);
closeQuaitly(statement);
closeQuaitly(conn);
}
return null;
}
由于commit()
调用在抛出异常的行之后,因此此问题必须在重复调用此方法之后出现(问题中包含有用信息)。这让我相信你的连接工厂正在重新使用连接,并且它正在分发"过时"的连接(已经存在太久且不再可用的连接)。如果这一切都是真的,那么你需要让你的工厂更好地管理连接。如果它是一个合理构建的连接池,那么它可能有一些功能,比如"空闲时测试"或"获取时测试",您需要启用这些功能。