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

标签 java mysql sql

我有一个问题。我处理很多 SQL 查询,并尝试找出最好和最快的解决方案来处理很多查询(大约 10'000 个 SQL 查询)。我已经想出两种方法来做到这一点,并想听听您对此的看法。 VERSION1:循环准备好的语句,VERSION2:允许多个查询以分号分隔(通过在连接到数据库时添加“?allowMultiQueries=true”)。

版本 2 的运行速度更快(3 秒),而版本 1 的运行速度非常慢(超过 1 分钟)。所以我的问题是,允许多个准备好的语句是否有任何缺点(或者可能是安全问题)?

这是一个简短的代码示例。感谢所有帮助!

// 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());  

最佳答案

连接语句通常是个好主意。正如您所发现的,它们产生的网络流量更少并且速度更快。

我没有看到任何需要担心的安全问题。

要考虑的一个建议:完整性。如果您的许多串联语句中的一个失败(无论出于何种原因),您可能很难确定哪些语句失败了哪些语句成功了。如果将每串串联的语句包装在一个事务中,则可以在语句串中的任何语句失败时使用 ROLLBACK 恢复数据库的状态。

关于java - Java 中的多个 SQL 语句(使用 ?allowMultiQueries=true),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42832652/

相关文章:

java - 寻找基于 no-cron 的 Java 调度程序

java - 从浏览器下载文件的 Tomcat 8 问题

java - 构建和部署成功,但没有 Web 进程在 Spark 上的 Heroku 上运行(Java 框架)

c# - 使用数据表中的文本填充文本框 - 组合框

sql - 如何让MySQL记录所有不使用索引的查询?

sql - 用于在表1,分组依据,总和中选择值的存储过程,然后将这些值插入表2

java - 将类对象列表映射到另一个列表

javascript - 使用 javascript 使用 php 变量的幻灯片放映

php - 使用路由时找不到基表或 View

mysql - 非常高级的 sql 查询的问题