使用单个JDBC Statement对象执行多个查询

Sye*_*hiq 27 java mysql sql jdbc

请在将此标记为重复之前阅读.我从谷歌和SO搜索了很多,但我无法找到我想要的确切答案.

我的问题:在JDBC中,我可以使用单个Statement对象executeQuery("")多次调用吗?安全吗?或者我应该在每次查询后关闭语句对象,并创建新对象以执行另一个查询.

例如:

Connection con;
Statement s;
ResultSet rs;
ResultSet rs2;
try
{
    con = getConnection();
    s = con.prepareStatement();

    try
    {
        rs = s.executeQuery(".......................");

        // process the result set rs
    }
    finally
    {
        close(rs);
    }

    // I know what to do to rs here
    // But I am asking, should I close the Statement s here? Or can I use it again for the next query?

    try
    {
        rs2 = s.executeQuery(".......................");

        // process the result set rs2
    }
    finally
    {
        close(rs2);
    }
}
finally
{
    close(s);
    close(con);
}
Run Code Online (Sandbox Code Playgroud)

Dur*_*dal 23

是的,您可以重复使用Statement(特别是a PreparedStatement),并且通常应该使用JDBC.如果你没有重复使用你的语句并立即创建另一个相同的Statement对象,那将是低效和糟糕的风格.关闭它,将它关闭在finally块中是合适的,就像你在这个片段中一样.

有关您要求的示例,请查看此链接:jOOq文档

  • @Erick是的,重复使用`ResultSet`是正常的,只要你在完成它之后正确关闭它.只要操作是以串行方式完成,而不是并行操作,就可以重用单个`ResultSet`和`Statement`.即使用`Statement`实例化运行查询1,从`ResultSet`获取值xyz; 关闭语句,使用值为xyz的`Statement`实例化并运行查询2 (2认同)

Mar*_*eel 9

我不知道你为什么这么问.该API设计和文档显示它是完全正常(甚至预期)重新使用Statement对象多execute,executeUpdateexecuteQuery电话.如果不允许在Java文档中明确记录(并且API可能会有所不同).

此外,apidoc Statement说:

如果存在打开的对象,Statement接口中的所有执行方法都会隐式关闭一个statment的[ sic ]当前ResultSet对象.

这表明您可以多次使用它.

TL; DR:是的,您可以多次调用execute单个Statement对象,只要您意识到以前打开的任何内容ResultSet都将被关闭.

你举的例子错误地使用PreparedStatement,并且你不能(或:不应该)能够调用任何的execute...接受方法StringPreparedStatement:

SQLException- 如果[...]方法被调用PreparedStatementCallableStatement

但也要回答PreparedStatement:a的整个目的PreparedStatement是使用参数占位符预编译一个语句,并将其重用于具有不同参数值的多个执行.