一次偶然的机会,show processlist 的时候,发现有个 Client 一直在执行  "mysql-connector-java-5.1.21 ( Revision: ${bzr.revision-id} ) */SHOW VARIABLES WHERE Variable_name"

后面和基友一起讨论,稍微缕了一下。大概思路是这样的的:

1.MySQL JDBC 连接过程大概如下(开启 general log 获得的信息):

5089492 Connect user@ip on db
5089492 Query /* mysql-connector-java-5.1.21 ( Revision: ${bzr.revision-id} ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect'
5089492 Query /* mysql-connector-java-5.1.21 ( Revision: ${bzr.revision-id} ) */SELECT @@session.auto_increment_increment
5089492 Query SHOW COLLATION
5089492 Query SET NAMES utf8mb4
5089492 Query SET character_set_results = NULL
5089492 Query SET autocommit=1
5089492 Query SET sql_mode='STRICT_TRANS_TABLES'

  1)Connect user@ip on db

  2)SHOW VARIABLES WHERE Variable_name ='language'... 获取 Client 关心的 session 级别变量。

  3)获取 @@session.auto_increment_increment . 这个参数的作用请参考 https://dev.mysql.com/doc/refman/5.5/en/replication-options-master.html#sysvar_auto_increment_increment 。主要是控制 auto_increment 属性的列每次自增的值的间隔。比如从1 3 5 7 增长的时候,auto_increment_increment 可以设置为2.

  4)接着就是后面的剩余操作。

从这里可以看出,如果是一个新的JDBC 连接,它就需要这个请求过程,是不可避免的。那么如果尽量减少 Client 的请求呢。现在常用的就是使用 DB 连接池技术。

正巧开发的同时配置的信息如下:

<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<property name="driver" value="${db.driverClass}" />
<property name="url" value="${db.connectUrl}" />
<property name="username" value="${db.user}" />
<property name="password" value="${db.pass}" />
</dataSource>
</environment>
</environments>

最后推断是 <dataSource type="UNPOOLED"> 这个参数的设置问题。其中type 有三个可选值: type="[UNPOOLED|POOLED|JNDI]" 通过 http://www.mybatis.org/mybatis-3/configuration.html  的解释可以看到  UNPOOLED – This implementation of DataSource simply opens and closes a connection each time it is requested.

后面让开发把配置改为  type="POOLED", 测试发现仍然会出现上面的 SQL 请求,频率会小一点。现在理解为:虽然有了连接池,但是第一次JDBC 连接的建立还是需要请求 MySQL variables 值的,只是后面重用连接的时候就没有必要再去获取这些值了。

结论:

1).通过JDBC 连接数据库的时候,尽量配上连接池,不然每次访问都需要额外的获取的变量,也是很消耗资源的。

2).连接池第一次建立连接的过程大体上如下,不同jdbc 版本不同,可能请求会有略微差别。

3).这是一个正常现象。

还有一个疑问:下面的一个命令充斥着 MySQL slow query log。有人说是 client 来测试和数据库的连通性的。可是能不能换个其他方式来测试呢?用这个 SQL 会让我的 slow query log 全部是这个玩意儿,很烦人。

# Time: 161122 11:21:01
# User@Host: db[db] @ [ip]
# Query_time: 0.000018 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 Logical_reads: 0 Physical_reads: 0
SET timestamp=1479784861;
# administrator command: Ping;

  

MySQL JDBC 出现多个 SHOW VARIABLES 语句。的更多相关文章

  1. JDBC进阶之PreparedStatement执行SQL语句(MySQL)

    一.什么是PreparedStatement           参阅Java API文档,我们可以知道,PreparedStatement是Statement的子接口(如图所示),表示预编译的 SQ ...

  2. 异常解决:Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    异常描述 这个异常通常有如下信息: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failu ...

  3. Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    很长的报错,截取   ERROR c.a.d.p.DruidDataSource - discard connection   com.mysql.jdbc.exceptions.jdbc4.Comm ...

  4. mysql,jdbc、连接池

    show processlist; select * from information_schema.processlist; Command: The type of command the thr ...

  5. com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 > 1024)

    ### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 > 1024). You ...

  6. 前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est

    前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: ...

  7. MySQL JDBC URL参数(转)

    MySQL的 JDBC URL格式: jdbc:mysql://[host][,failoverhost...][:port]/[database] » [?propertyName1][=prope ...

  8. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (16944839 > 16777216). You can change this value on the server by setting the max_allowed_packet' variable.

    今天发现task微服务的error日志报如下错误: Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large ...

  9. Jmeter的JDBC请求执行多条SQL语句

    注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1.     下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...

随机推荐

  1. centos查看系统cpu个数、核心书、线程数

    1.查看物理cpu个数 grep 'physical id' /proc/cpuinfo | sort -u | wc -l 2.查看核心数量 grep 'core id' /proc/cpuinfo ...

  2. vim段替换

    文件中有很多字段: dd ssdf df aaa="100" dd ssdf df aaa="200" asdf sdf sdf aaa="700&q ...

  3. MVC 之 Code First

    在我们的工作和学习当中,经常会遇到中小型项目,这些项目除了业务上的区别较大 外,对于底层和数据访问,其实都差不多.记得以前做项目时,每次都要重复的写底层操作数据库的代码,不仅浪费时间,也无太大意思,后 ...

  4. Freemarket学习整理。

    导入freemarker.jar包 把word文档另存为xml格式,2007以上版本支持. 编写代码,把路径更改为xml所在路径. 把需要更改的地方写成${}形式. package Document. ...

  5. Ubuntu 14.04 更新源

    deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiversedeb http://mirrors.163. ...

  6. C# 动态加载程序集dll (实现接口)

    一.程序集(接口程序集):LyhInterface.Dll namespace LyhInterface { public interface ILyhInterface { void Run(); ...

  7. ServiceStack.OrmLite中的一些"陷阱"(2)

    注:此系列不是说ServiceStack.OrmLite的多个陷阱,这仅仅个人认为是某一个陷阱(毕竟我踩坑了)而引发的思考. 前文说到了项目需要使用两种不同的数据库语言,虽说前文问题已基本解决了,但是 ...

  8. c# udp局域网通信

    udp224.0.0.1 子网上的所有系统224.0.0.2 子网上的所有路由器224.0.0.12 dhcp服务器224.0.1.1 ntp224.0.1.24 wins服务器 http://www ...

  9. java定时任务实现

    在java中需要使用到定时任务是,可以通过quartz来实现.

  10. javascript总结

    javascript:它是一种script脚本语言           脚本语言:就是可以和HTML混合在一起使用的语言,可以用来在IE的客                    户端进行程序编制,从 ...