我有个问题.我使用了很多SQL查询,并尝试找出最好和最快的解决方案来处理大量查询(大约10’000个SQL查询).我已经想出了两种方法,并希望听到你对此的看法. VERSION1:循环准备语句,VERSION2:允许多个查询除以分号(通过...
我有个问题.我使用了很多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中的多个SQL语句(带?allowMultiQueries = true)
基础教程推荐
- Java获取环境变量(System.getenv)的方法 2022-11-07
- springboot整合JSR303参数校验与全局异常处理的方法 2023-05-25
- jsp输出金字塔的简单实例 2023-08-03
- Java实现树形List与扁平List互转的示例代码 2023-07-15
- SpringBoot整合atomikos实现跨库事务的详细方案 2022-11-29
- java – MySQL:用户拒绝访问…使用密码:YES 2023-11-05
- mybatis@insert 注解如何判断insert或是update 2023-02-27
- JavaWeb实现简单文件上传功能 2023-01-29
- Java实现在线聊天室(层层递进) 2023-05-19
- SpringBoot整合Freemarker实现页面静态化的详细步骤 2023-06-23