结果集线程安全?

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 让您避免它。