首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的多个SQL语句(使用?allowMultiQueries=true)

Java中的多个SQL语句(使用?allowMultiQueries=true)
EN

Stack Overflow用户
提问于 2017-03-16 11:20:46
回答 1查看 5K关注 0票数 5

我有个问题。我使用了大量的SQL查询,并试图找到处理大量查询(大约10,000个SQL-查询)的最佳和最快的解决方案。我想出了两种方法来做这件事,并想听听你对此的看法。VERSION1:循环准备好的语句,VERSION2:允许按分号划分的多个查询(在连接到数据库时添加"?allowMultiQueries=true“)。

Version2计算出的速度要快得多(3秒),而Version1的速度相当慢(超过1分钟)。所以我的问题是,允许多个准备好的陈述有什么坏处(或者可能是安全问题)?

下面是一个简短的代码示例。谢谢大家的帮助!

代码语言:javascript
复制
// i want to execute the following 3 SQL queries:
String[] SQL = new String[3];
SQL[0] = "UPDATE tbl1 SET age=22 WHERE id=1;";
SQL[1] = "UPDATE tbl1 SET age=80 WHERE id=2;";
SQL[2] = "UPDATE tbl1 SET age=31 WHERE id=3;";

// VERSION1: loop over prepared statements
int[] age = {22,80,31};
int[] id  = { 1, 2, 3};
Connection conn1 = DriverManager.getConnection("jdbc:mysql://EXAMPLE", "user", "pw");
PreparedStatement stmt1_P = conn1.prepareStatement("UPDATE tbl1 SET age=? WHERE id=?;");
for (int i=0; i<SQL.length; i++) {
    stmt1_P.setInt(1, age[i]);
    stmt1_P.setInt(2, id[i]);
    stmt1_P.executeUpdate();
}               

// VERSION2: multiple queries divided by semicolon
Connection conn2 = DriverManager.getConnection("jdbc:mysql://EXAMPLE?allowMultiQueries=true", "user", "pw");
Statement stmt2 = conn2.createStatement();
StringBuilder s = new StringBuilder();
for (int i=0; i<SQL.length; i++) {
    s.append(SQL[i]);
}
stmt2.executeUpdate(s.toString());  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-16 11:34:14

Concatenating语句通常是个好主意。正如您已经发现的,它们产生的网络流量更少,速度更快。

我看不出有什么安全问题需要担心。

一个值得考虑的建议:正直。如果您的许多连接语句中的一条失败(无论出于什么原因),您可能很难确定哪一条失败了,哪些成功了。如果您在事务中包装了每一串连接语句,如果您的串中的任何语句失败,则可以使用ROLLBACK恢复数据库的状态。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42832652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档