文章目录
- 使用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
,登录后再执行上面的命令
- 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
参数的值引起的,从网上查询说是有两种解决方案
- 加大wait_timeout和interactive_timeout的值,用set global interactive_timeout=800set global wait_timeout=800;,如果查询还是没变,用
SHOW GLOBAL VARIABLES LIKE '%timeout%';
查询就会查询到设置之后的,因为不加GLOBAL 默认查询的是session的 - druid连接池配置testOnBorrow: true testOnReturn: true testWhileIdle: true validationQuery: SELECT 1 FROM DUAL,
testOnBorrow和testOnReturn必须同时设置为true此报错才会解除
连接地址重要参数的解释
参数名称 | 参数说明 | 缺省值 | 最低版本要求 |
---|---|---|---|
user | 数据库用户名(用于连接数据库) | 所有版本 | |
password | 用户密码(用于连接数据库) | 所有版本 | |
useUnicode | 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true | false | 1.1g |
characterEncoding | 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk | false | 1.1g |
autoReconnect | 当数据库连接异常中断时,是否自动重新连接? | false | 1.1 |
autoReconnectForPools | 是否使用针对数据库连接池的重连策略 | false | 3.1.3 |
failOverReadOnly | 自动重连成功后,连接是否设置为只读? | true | 3.0.12 |
maxReconnects | autoReconnect设置为true时,重试连接的次数 | 3 | 1.1 |
initialTimeout | autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 | 2 | 1.1 |
connectTimeout | 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 | 0 | 3.0.1 |
socketTimeout | socket操作(读写)超时,单位:毫秒。 0表示永不超时 | 0 | 3.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