MySQL JDBC 出现多个 SHOW VARIABLES 语句。
一次偶然的机会,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 语句。的更多相关文章
- JDBC进阶之PreparedStatement执行SQL语句(MySQL)
一.什么是PreparedStatement 参阅Java API文档,我们可以知道,PreparedStatement是Statement的子接口(如图所示),表示预编译的 SQ ...
- 异常解决:Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
异常描述 这个异常通常有如下信息: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failu ...
- 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 ...
- mysql,jdbc、连接池
show processlist; select * from information_schema.processlist; Command: The type of command the thr ...
- 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 ...
- 前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est
前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: ...
- MySQL JDBC URL参数(转)
MySQL的 JDBC URL格式: jdbc:mysql://[host][,failoverhost...][:port]/[database] » [?propertyName1][=prope ...
- 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 ...
- Jmeter的JDBC请求执行多条SQL语句
注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1. 下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...
随机推荐
- lvs+keepalived+nginx实现高性能负载均衡集群
一.为什么要使用负载均衡技术? 1.系统高可用性 2. 系统可扩展性 3. 负载均衡能力 LVS+keepalived能很好的实现以上的要求,LVS提供负载均衡,keepalived提供健康检查, ...
- PHP从mysql获取数据的方法
<?php require "database.php"; //读取数据库中的数据 $sql_1 = "SELECT * FROM test_table" ...
- C#邮箱发送验证码
public static void SendTo(string mailAddress, string subject, string body) { //mailAddress 所要 ...
- PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天
PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数 1 构造 2 析构 3 赋值 4 拷贝构造 5 oper ...
- [[UIScreen mainScreen] bounds]获取尺寸不对
http://www.cocoachina.com/bbs/read.php?tid-264373.html [[UIScreen mainScreen] bounds]获取尺寸不对 我在 ...
- 史上最强大网盘,网络上的赚钱神器【Yunfile网盘】,注册就送8元
YunFile.com,是提供在线存储和文件保存服务最大的网站之一,从2007年创立至今,我们提供免费的和您可以承受的收费服务.这些服务包括高级在线存储/远程备份服务,和先进的上传和下载工具.上百万来 ...
- 【Java学习笔记】其他对象API
System类 package p1; import java.util.Properties; import java.util.Set; public class SystemDemo { pri ...
- 写了一个基于React+Redux的仿Github进度条
曾经实现过Angular版,这次感觉用了高大上的React却写了更多的代码,需要的配置也更多了,有利有弊吧. 但这个“导航条问题”很有意思,涉及到在Redux中写timer,其实我很困惑,到底如何完美 ...
- UML类图6种关系的总结
http://www.open-open.com/lib/view/open1328059700311.html
- selenium-pageobject设计模式
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom time import sleepfrom ...