Java中的多个SQL语句(带有?allowMultiQueries=true)

Java中的多个SQL语句(带有?allowMultiQueries=true),java,mysql,sql,Java,Mysql,Sql,我有个问题。我处理大量SQL查询,并尝试找出处理大量查询(大约10000个SQL查询)的最佳和最快的解决方案。我已经想出了两种方法,想听听你的意见VERSION1:循环准备好的语句,VERSION2:允许多个查询被分号分隔(在连接到数据库时添加“?allowMultiQueries=true”)。 版本2运行得更快(3秒),而版本1运行得非常慢(超过1分钟)。所以我的问题是,允许多个预先准备好的语句是否有任何缺点(或者可能是安全问题)? 下面是一个简短的代码示例。谢谢大家的帮助 // i w

我有个问题。我处理大量SQL查询,并尝试找出处理大量查询(大约10000个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());  
//我想执行以下3个SQL查询:
字符串[]SQL=新字符串[3];
SQL[0]=“更新tbl1集合年龄=22,其中id=1;”;
SQL[1]=“更新tbl1集合年龄=80,其中id=2;”;
SQL[2]=“更新tbl1集合年龄=31,其中id=3;”;
//版本1:在准备好的语句上循环
int[]年龄={22,80,31};
int[]id={1,2,3};
Connection conn1=DriverManager.getConnection(“jdbc:mysql://EXAMPLE“、”用户“、”pw”);
PreparedStatement stmt1_P=conn1.prepareStatement(“更新tbl1集合年龄=?其中id=?;”;

对于(int i=0;i而言,连接语句通常是一个好主意。正如您所发现的,它们生成的网络流量更少,速度更快

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


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

是否在准备的写入之间提交事务?每个数据库imp操作系统通常会限制sql查询或语句的长度。这意味着如果查询太长,将出现sql异常。此外,即使查询不太长,也可能会面临一些性能问题。对于更新,尤其是当更新的形式相同时,建议使用批处理updates@dsp_user谢谢你的信息确认!但是当查询太长时,所有语句都无法工作,我会收到一条错误消息,对吗?或者是否可能只执行以分号分隔的少数命令(比如前5000个命令),而执行其余命令(其他5000个命令)非常感谢您的帮助!如果您将所有语句作为事务的一部分执行,那么要么全部成功,要么全部失败(因为事务就是这样工作的)。如果您的语句不是事务的一部分,则这取决于您如何对其进行编码。如果您的语句位于try块内,而catch块不会引发异常(而是“处理”异常),则所有未引发异常的语句都将成功。如果它们不在try块内,则只有引发异常的第一条语句之前的语句才会成功(其他语句甚至不会执行)。对于更新,建议使用批更新(这样就可以查看哪些更新失败)