在JDBC字符串中添加allowMultiQueries=true
可使MySQL接受带有多个查询的语句。
但是,这到底是做什么的呢?有什么好处吗?
也许它减少了往返行程的延误?就像是
LOCK
UPDATE ...
UNLOCK
如果在一条语句中完成,则该锁将保留较少的时间。
什么时候(如果有的话),我想将查询合并在单个语句中,而不是在单独的语句中?
最佳答案
为了运行自己创建的安全脚本,否则需要逐行运行。例如,来自mysqldump的脚本,或者无论如何都可以安全可靠地运行的脚本。有人问我“为什么要这么做?”时,有人曾向我指出过这一点。他以自己的脚本存储库进行了响应,每个脚本库都没有用户输入有关假冒行为和sql注入(inject)的潜力。这些例程的大小受max_allowed_packet限制,策略当然是将文件读入缓冲区,然后将其用于Multi中的查询。
用于一致地运行一些语句,其中一个语句在调用的瞬时性质中依赖于另一个语句。 transient 的意思是您不是通过Multi发出后续调用的,因此不再有必要的信息。一个经常给出的明智的或不明智的例子是SQL_CALC_FOUND_ROWS
和FOUND_ROWS()
的二重奏,通常在Percona文章To SQL_CALC_FOUND_ROWS or not to SQL_CALC_FOUND_ROWS?中揭穿。在这种情况下,有一个论点是,不仅可以返回结果集,而且可以在其后不久获取计数的单个调用对于更精确的分页例程来说是一条更明智的途径。假设对count(*)
的单独调用和对数据的另一个调用可能会在多用户并发系统(如我们所有最有可能的系统)中产生差异。因此,刚才提到的术语只涉及准确性,而不是性能,这是Percona文章所关注的。另一个用例是启动并在查询中使用User-Defined Variables。但是,可以将其中许多折叠到查询中并使用cross join
进行初始化。