Java语句对象重用?

时间:2008-12-23 19:30:31

标签: java jdbc

我想知道我们是否可以重复使用相同的Statement对象来执行多个查询。或者,我们应该为不同的查询创建一个新的语句。

例如,

Connection con = getDBConnection();
Statement st1 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
int i = st1.executeUpdate("update tbl_domu set domU_status=1 where domU_id=" + dom_U_id);
Statement st2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
int j = st2.executeUpdate("insert into tbl_domU_action_history values('" + dom_U_name + "', 1, '" + date + "')");  

在上面的例子中,对于executeUpdate()查询使用相同的语句st1是否有任何损害?我可以将同一个Statement对象st1用于另一个executeQuery()吗?

5 个答案:

答案 0 :(得分:20)

我遇到了我在Javadocs中寻找的回应

  

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成。

答案 1 :(得分:16)

是的,你可以。但是,使用PreparedStatement来避免SQL注入漏洞要好得多。

答案 2 :(得分:2)

使用预准备语句的最初要点是避免让数据库解析并重新编译语句,因此它应该更快。

我没有考虑过SQL注入漏洞的使用,但我不确定是什么,如果有任何数据检查。我怀疑它依赖于驱动程序,因为驱动程序实现可以自由地将语句粘合在一起。如果有人有更多详细信息,请发布。

答案 3 :(得分:1)

我不确定结果集是否仅在关闭时才会收集垃圾。当我编写连接池时,我认为我有一个很酷的内存泄漏,因此相同的语句/连接被重复使用了一百万次。保持打倒我的JVM。我想这也可能是特定于实现的,因为封闭结果集的garabage集合可能无法测试。

答案 4 :(得分:0)

每当您为引用类型指定某些内容时,您将使用新引用替换旧引用。

例如......

MyObject obj = new MyObject("foo");
obj = new MyObject("bar");

将有一个现在未引用的MyObject实例,其中一些属性设置为“foo”,最终将被垃圾回收。

obj存储对MyObject的引用,其中一些属性设置为“bar”。