结果集线程安全?
ResultSet threadsafe?
我对特定的测试用例很好奇,想知道它是否是一个真实的场景。
public void doSomething()
{
ResultSet rs = null;
PreparedStatement ps = null;
try
{
ps = conn.createStatement(/* some query */);
ps.executeUpdate();
rs = ps.getGeneratedKeys();
rs.next();
int temp = rs.getInt(1);
} catch(Exception e ) { /* Exception Handlign */}
finally {
ps.close();
rs.close();
}
}
对于上面的代码,rs.getInt(1) 是线程安全的吗?我有一个连接对象。这种情况对我来说似乎不太可能,但我仍然希望得到您的意见。
谢谢
就其本身而言,获取各个列的值可能是线程安全的,因为它是只读的。但是,行到行导航从来都不是线程安全的,(我相信)这更多地与构建 JDBC 的基本 ODBC 规范有关。
风险在于一个线程可能正在从一行中获取值,并且该行已更改,并且您有来自 2 行或更多行的值。无法跟踪这一点,无法让一个线程在另一线程四处移动时获得要处理的行。
此外,建议您使用 try-with-resources,PreparedStatement 和 ResultSet 可以在关闭时抛出异常,try-with-resources 让您避免它。
我对特定的测试用例很好奇,想知道它是否是一个真实的场景。
public void doSomething()
{
ResultSet rs = null;
PreparedStatement ps = null;
try
{
ps = conn.createStatement(/* some query */);
ps.executeUpdate();
rs = ps.getGeneratedKeys();
rs.next();
int temp = rs.getInt(1);
} catch(Exception e ) { /* Exception Handlign */}
finally {
ps.close();
rs.close();
}
}
对于上面的代码,rs.getInt(1) 是线程安全的吗?我有一个连接对象。这种情况对我来说似乎不太可能,但我仍然希望得到您的意见。
谢谢
就其本身而言,获取各个列的值可能是线程安全的,因为它是只读的。但是,行到行导航从来都不是线程安全的,(我相信)这更多地与构建 JDBC 的基本 ODBC 规范有关。
风险在于一个线程可能正在从一行中获取值,并且该行已更改,并且您有来自 2 行或更多行的值。无法跟踪这一点,无法让一个线程在另一线程四处移动时获得要处理的行。
此外,建议您使用 try-with-resources,PreparedStatement 和 ResultSet 可以在关闭时抛出异常,try-with-resources 让您避免它。