MySQL使用过程中常见异常

  1. 使用telnet信息提示FHost '192.168.1.123' is not allowed to connect to this MySQL serverConnection closed by foreign host.
    原因:这个原因是因为索要链接的mysql数据库只允许其所在的服务器连接,需要在mysql服务器上设置一下允许的ip权限
    解决方案:登录图形化界面不选中任何库,执行:
grant all privileges on *.* to 'root'@'192.168.0.1' identified by 'password';  // 给某个ip授权
grant all privileges on *.* to 'username'@'%' identified by 'password'; // 给所有ip授权
FLUSH PRIVILEGES; // 刷新权限

也可以用命令登录MySQL:mysql -u root -p,登录后再执行上面的命令

  1. wait_timeout和interactive_timeout参数值导致的异常

错误信息

一、

java.sql.SQLException: The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.

二、

The last packet successfully received from the server was 60,002 milliseconds ago.  The last packet sent successfully to the server was 60,003 milliseconds ago

java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost

这两个报错都是因为mysql服务端的wait_timeout参数和interactive_timeout参数的配置,这两个参数的值可以通过show variables like '%timeout%';查询到

  • wait_timeout:是指如果空余Ns(N就是这个属性的值),那么会自动kill掉mysql的一部分连接线程。这里的连接就是指的是非交互式连接。值默认为8小时

  • interactive_timeout:是指如果空余Ns(N就是这个属性的值),那么就会自动关闭mysql的连接。关闭什么样的mysql连接?mysql是有两种操作方式,那就有两种连接的,一种是交互式,一种是非交互式。而这个属性控制的是交互式。就是你打开一个mysql客 户端黑窗口,进入操作之后,又隔了Ns你不操作了,之后你想继续操作,对不起,mysql会在之前关闭了你的那个连接,mysql会帮你自动重新连接。

  • 交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议。

  • 非交互式操作:就是你在你的项目中进行程序调用。比如一边是tomcat web服务器,一边是数据库服务器,两者怎么通信?在java web里,我们通常会选择hibernate或者是jdbc来连接。那么这时候就是非交互式操作。

根据上面两个参数和交互式的名词解释就可以看出,代码中报错的原因都是wait_timeout参数的值引起的,从网上查询说是有两种解决方案

  1. 加大wait_timeout和interactive_timeout的值,用set global interactive_timeout=800set global wait_timeout=800;,如果查询还是没变,用SHOW GLOBAL VARIABLES LIKE '%timeout%';查询就会查询到设置之后的,因为不加GLOBAL 默认查询的是session的
  2. druid连接池配置testOnBorrow: true testOnReturn: true testWhileIdle: true validationQuery: SELECT 1 FROM DUAL,testOnBorrow和testOnReturn必须同时设置为true此报错才会解除

连接地址重要参数的解释

参数名称参数说明缺省值最低版本要求
user数据库用户名(用于连接数据库)所有版本
password用户密码(用于连接数据库)所有版本
useUnicode是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为truefalse1.1g
characterEncoding当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbkfalse1.1g
autoReconnect当数据库连接异常中断时,是否自动重新连接?false1.1
autoReconnectForPools是否使用针对数据库连接池的重连策略false3.1.3
failOverReadOnly自动重连成功后,连接是否设置为只读?true3.0.12
maxReconnectsautoReconnect设置为true时,重试连接的次数31.1
initialTimeoutautoReconnect设置为true时,两次重连之间的时间间隔,单位:秒21.1
connectTimeout和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本03.0.1
socketTimeoutsocket操作(读写)超时,单位:毫秒。 0表示永不超时03.0.1

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure,代码未捕获到

虽然代码try catch注入了,但是发现此类异常仍然捕获不到,查看DataSource源码,是因为异常只是打印了下,并没有抛出异常,所以代码没有捕获到

java.lang.NullPointerException: null

    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:150)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
    at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
    at com.sun.proxy.$Proxy118.selectPrizeLog(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

这个是代码中报的错
是因为查询语句中group by中没有查询结果的列,修改为一样就可以了,原因this is incompatible with sql_mode=only_full_group_by

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值