将allowMultiQueries=true
添加到JDBC字符串使MySQL接受具有多个查询的语句。
但这到底是做什么的?这有什么好处吗?
也许它减少了往返的延误?像
这样的东西LOCK
UPDATE ...
UNLOCK
如果在一个语句中完成,则锁定的时间更短。
如果有的话,我想在单个Statement中组合查询,而不是在单独的语句中组合?
答案 0 :(得分:1)
用于运行您自己创建的安全脚本,否则需要逐行运行。例如,一个来自mysqldump的脚本,或者你原本应该运行的脚本,安全且可信。当我问及你为什么要这样做时,有人曾向我指出这一点?"他回答说,他自己的脚本库存,每个脚本都没有用户输入tomfoolery和sql注入的潜力。这些例程的大小受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 ,这是更准确的分页例程的更明智的途径。这假设单独调用count(*)
而另一个调用数据可能会在多用户并发系统中产生差异,就像我们所有人一样。因此,刚刚提到的措辞解决了Percona文章所涉及的准确性,而不是性能。另一个用例是启动并在查询中使用User-Defined Variables。其中许多内容可以折叠到查询中,然后使用cross join
进行初始化。
答案 1 :(得分:0)
如果有的话,我想在单个Statement中组合查询,而不是在单独的语句中组合?
此功能有两个很好的用例:
如果你很懒,喜欢盲目地运行查询而不检查成功或行数或auto_increment值赋值,或者
如果您喜欢在此处增加SQL注入漏洞username ='' AND 0 = 1;
←的可能性。在此模式处于非活动状态时,注入分号后的任何内容都应该是错误。在这种模式激活的情况下,整个世界都会出现#o;"可以打开。
我所说的是......你是对的。不要使用它。
是的,它减少了往返时间对数据库的影响,管道查询......这对于远程数据库来说可能很重要......但代价是风险增加并不值得。