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

2022-09-01 14:14:00

在 JDBC 中,是否可以使用单个对象多次调用?它安全吗?或者,我应该在每个查询后关闭语句对象,并创建用于执行另一个查询的新对象。StatementexecuteQuery("")

例如:

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);
}

答案 1

是的,您可以重用 a(特别是 a ),并且通常应该使用 JDBC 执行此操作。如果你不重用你的语句并立即创建另一个相同的对象,这将是低效和糟糕的风格。就关闭它而言,在最终块中关闭它是合适的,就像您在此代码段中一样。StatementPreparedStatementStatement

有关您要询问的示例,请查看此链接:jOOq Docs


答案 2

我不知道你为什么问。API的设计和文档表明,重用一个对象进行多个调用是完全可以的(甚至是有意的)。如果不允许,这将在Java文档中明确记录(并且API可能会有所不同)。StatementexecuteexecuteUpdateexecuteQuery

此外,声明的 apidoc 说:

接口中的所有执行方法都隐式关闭语句的 [原文如此] 当前对象(如果存在打开的对象)。StatementResultSet

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

TL;DR:是的,您可以多次调用单个对象,只要您意识到以前打开的任何对象都将关闭。executeStatementResultSet

您的示例错误地使用了 ,并且您不能(或:不应该)调用任何执行... 方法接受 PreparedStatementPreparedStatement

SQLException- 如果 [...] 在 or 上调用该方法PreparedStatementCallableStatement

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


推荐