Jdbc Url 设置allowMultiQueries为true和false时底层处理机制研究

一个mysql jdbc待解之谜 关于jdbc  url参数 allowMultiQueries

如下的一个普通JDBC示例:

String user ="root";
String password = "root";
String url = "jdbc:mysql://localhost:3306";

Connection conn = java.sql.DriverManager.getConnection(url , user, password);
Statement stmt = conn.createStatement();
String sql = "select ‘hello‘;select ‘world‘";
stmt.execute(sql);

执行时会报错:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘select ‘world‘‘ at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

若一个sql中通过分号分割(或包含)了多个独立sql的话,如:

select ‘hello‘;select ‘world‘

默认就会报上述错误,当若显式设置allowMultiQueries为true的话,就可以正常执行不会报错.如下所示:

String url = "jdbc:mysql://localhost:3306?allowMultiQueries=true";

官方文档解释:

allowMultiQueries
Allow the use of ‘;‘ to delimit multiple queries during one statement (true/false), defaults to ‘false‘, and does not affect the addBatch() and executeBatch() methods, which instead rely on rewriteBatchStatements.
Default: false
Since version: 3.1.1

想要看看当该参数设置为true和false时,源码中到底哪里有不同.经过断点调试发现了在下面代码处会有不同的结果:

   //所属类和方法:void java.net.SocketOutputStream.socketWrite(byte[] b, int off, int len) throws IOException
   socketWrite0(fd, b, off, len);
   bytesWritten = len;

当设置为true时,执行完socketWrite0方法后查询query log,会看到这样的输出:

   23 Query	select ‘hello‘;
   23 Query	select ‘world‘

当设置为false时,执行完socketWrite0后.查询query log没有任何输出.

但奇怪的是它们的参数都一样,为什么一个有输出一个就没有呢?如下所示:

设置为true参数信息

设置为false时的参数信息:

补充如何查看query log:

mysql> show variables like ‘general_log%‘;
+------------------+--------------------------------------------------------------------+
| Variable_name    | Value                                                              |
+------------------+--------------------------------------------------------------------+
| general_log      | OFF                                                                 |
| general_log_file | /opt/mysql/server-5.6/data/zhuguowei-Presario-CQ43-Notebook-PC.log |
+------------------+--------------------------------------------------------------------+
mysql> set global general_log = ‘on‘ ;
#开启另一终端
tail -f /opt/mysql/server-5.6/data/zhuguowei-Presario-CQ43-Notebook-PC.log
时间: 2024-10-23 20:04:42

Jdbc Url 设置allowMultiQueries为true和false时底层处理机制研究的相关文章

mysql的jdbc.url携带allowMultiQueries=true参数的作用及其原理

如下配置 jdbc.url=jdbc:mysql://127.0.0.1:3306/chubb_2?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true allowMultiQueries=true参数的作用: ①可以在sql语句后携带分号,实现多语句执行. 如:mybatis的mapper.xml文件 <select id="getAll" re

标签属性值为true、false时的IE hack。

问题由起: 某个页面元素上设置了一个属性_tag="false"; js中获取该属性,并做了个这样的判断:$('.XX').attr('_tag') == 'false': 然后问题出现了: IE7.IE8下获取的该属性类型为 boolean:而IE9下是string. 所以该判断报错. 建议,1. 类似属性值的判定规避掉boolean型即 false.true的设置: 2. 如有该设置,则.toString()进行判断. 好的水手,善于规避风险,所以,尽量不要给自己刨坑.

motto - question - bodyParser.urlencoded 中设置 extended 为 true 和 false 有什么区别吗?

本文搜索关键字:motto node nodejs js javascript body-parser bodyparser urlencoded x-www-form-urlencoded extended Answer: 如果设置为false,那么对URL-encoded的数据的解析采用querystring库,如果设置为true那么采用qs库. 原文地址:https://www.cnblogs.com/jzsz/p/9227109.html

C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思?

原文:C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思? 在 .NET 中创建进程时,可以传入 ProcessStartInfo 类的一个新实例.在此类型中,有一个 UseShellExecute 属性. 本文介绍 UseShellExecute 属性的作用,设为 true 和 false 时,分别有哪些进程启动行为上的差异. 本文内容 本质差异 效果差异 如何选择 本质差异 Process.Start 本质上是启动一个新的

Mysql JDBC Url参数说明useUnicode=true&amp;characterEncoding=UTF-8

MySQL的 JDBC URL 格式 for  Connector/J 如下例: jdbc:mysql://[host][,failoverhost...][:port]/[database] » [?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]... jdbc:mysql://[host:port],[host:port].../[database] » [?propertyName1][=propertyVa

django2.2 DEBUG=True/False时如何设置静态文件(image js css等)

目录结构: project ----templates ----app ----manage.py 添加静态资源,目录结构更新为: project ----templates ----app ----static # 静态资源 --------img --------js --------css ----manage.py 以img举例,引用资源的代码为: {% load static %} <img src='{% static "img/favicon.png" %}'/&g

Spring+SpringMVC+MyBatis+easyUI整合基础篇(七)JDBC url的连接参数

在java程序与数据库连接的编程中,mysql jdbc url格式如下: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]... 如 jdbc:mysql://localhost:3306/test?user=test&password=123456 刚好最近遇到一个数据库连接参数带来的问题,所以罗列一下几个较为重要的参数: user 数据库用户名(用于连接数据库) 必要参数. p

mysql JDBC URL格式

mysql JDBC URL格式如下: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]... 现只列举几个重要的参数,如下表所示: 参数名称 参数说明 缺省值 最低版本要求 user 数据库用户名(用于连接数据库)   所有版本 password 用户密码(用于连接数据库)   所有版本 useUnicode 是否使用Unicode字符集,如果参数characterEncoding设置为

jdbc URL中的各个参数详解

常用的有两个,一个是gjt(Giant JavaTree)组织提供的mysql驱动,其JDBC Driver名称(Java类名)为:org.gjt.mm.mysql.Driver 详情请参见网站:http://www.gjt.org/ 或在本网站下载mysql JDBC Driver(mm.jar) 另一个是mysql官方提供的JDBC Driver,其JAVA类名为:com.mysql.jdbc.Driver 驱动下载网址:http://dev.mysql.com/downloads/,进入其