ResultSet线程安全?

时间:2015-04-21 00:04:32

标签: java jdbc thread-safety

我对特定的测试用例感到好奇,想知道它是否是一个现实的场景。

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)会是threadSafe吗?我有一个Connection对象。这种情况对我来说似乎不太可能,但我仍然希望你的意见。

由于

1 个答案:

答案 0 :(得分:0)

单独获取各列的值可能是线程安全的,因为它是只读的。但是,行到行导航绝不是线程安全的,我相信这与构建JDBC的基本ODBC规范有很大关系。

风险在于一个线程可能从一行获取值,并且行已更改,并且您具有来自2行或更多行的值。无法跟踪此情况,当另一个线程移动时,无法为一个线程提供行处理。

另外,建议你使用try-with-resources,PreparedStatement和ResultSet可以在关闭时抛出异常,尝试使用资源让你避免它。