在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);
}
是,您可以重新使用Statement
(特别是PreparedStatement
),并且通常应在JDBC中使用。如果您不重新使用您的语句并立即创建另一个相同的Statement
对象,那将是效率低下和糟糕的样式。至于关闭它,就像在此代码段中一样,将其最终关闭是合适的。
有关您要询问的内容的示例,请查看此链接:jOOq Docs
我不确定你为什么要问。 API设计和文档显示,将Statement
对象重用于多个execute
,executeUpdate
和executeQuery
调用是完美的(甚至是预期的)。如果不允许,则将在Java文档中明确记录(并且API可能会有所不同)。
此外Statement
的apidoc说:
Statement
界面中的所有执行方法都将隐式关闭一个语句的[sic]当前Statement
对象,如果存在一个已打开的对象。
这表明您可以多次使用它。
TL; DR:是的,您可以多次在单个ResultSet
对象上调用execute
,只要您意识到以前打开的任何Statement
将被关闭。
您的示例错误地使用了ResultSet
,并且您不能(或:不应)调用PreparedStatement
上的任何execute...
methods accepting a String
:
execute...
-如果在String
或PreparedStatement
上调用该方法,则>但也要回答
SQLException
:PreparedStatement
的全部目的是使用参数占位符预编译一条语句,并将其重用于具有不同参数值的多次执行。
我在CallableStatement
中找不到任何可以说明的事情,即您不应在给定的PreparedStatement
实例上多次调用PreparedStatement
。
A executeQuery()
告诉数据库记住您的查询,并准备接受要在该查询中执行的参数化变量。这很像一个存储过程。
首先,我对您的代码感到困惑