Java语句对象重用?

我想知道我们是否可以重用相同的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是否有任何损害? 我可以为另一个executeQuery()使用相同的Statement对象st1吗?

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

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

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

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

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

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

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

例如…

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

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

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