我想知道我们是否可以重复使用相同的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()吗?
答案 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”。