在是Centos上部署项目发现一个奇怪的问题,数据库连接一直引发异常。于是花了两个小时搜了各种数据库连接异常原因的原因,最终问题得以解决。同时,把解决过程中搜集到的异常信息总结一下,当大家遇到类似的问题时,给大家以思路。必须珍藏。
问题现象
先来说说我遇到的问题。项目中遇到的问题很奇怪,在Centos上安装了Mysql数据库,项目使用的是Spring Boot。
项目在本地启动连接服务器数据库正常,本地数据库客户端连接服务器数据库正常,服务器本地连接客户端连接数据库正常。唯独把项目部署到服务器上启动时引发异常。
异常信息大概(当时未保留异常信息)如下:
“”
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信中断的最后一个数据包成功发送到服务器是0倍前。驱动程序已收到来自服务器的任何数据包。在sun.reflect。 NativeConstructorAccessorImpl.newInstance0(本机方法)在sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知源)在java.lang.reflect.Constructor.newInstance(未知源)在com.mysql .jdbc.Util.handleNewInstance(Util.java:425)在com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)在com.mysql.jdbc.MysqlIO。<初始化>(MysqlIO.java:341) 在com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2196) 在com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2229) 在com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2024) )
在com.mysql.jdbc.ConnectionImpl。<init>(ConnectionImpl.java:779)
在com.mysql.jdbc.JDBC4Connection。<init>(JDBC4Connection.java:47)
在sun.reflect.NativeConstructorAccessorImpl.newInstance0 (本机方法) )
在sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源)
在java.lang.reflect.Constructor.newInstance(未知来源)
在com.mysql.jdbc.Util.handleNewInstance( Util.java:425)
在com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
在com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
在java.sql.DriverManager.getConnection(未知源)
在com.ad.MysqlDemo.main(MysqlDemo.java:32)
上的.DriverManager.getConnection(未知源)
造成原因:java.net.ConnectException:连接被拒绝:
在java.net.DualStackPlainSocketImpl.connect0(本机方法)
处连接.net.DualStackPlainSocketImpl.socketConnect(未知来源)
在java.net.AbstractPlainSocketImpl.doConnect(未知来源)
在java.net.AbstractPlainSocketImpl.connectToAddress(未知来源)
在java.net.AbstractPlainSocketImpl.connect(未知来源)
在java.net.PlainSocketImpl.connect(未知源)
在
java.net.SocksSocketImpl.connect(未知源)
在com .mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java)在java.net.Socket.connect(未知源)):211)
放在com.mysql.jdbc.MysqlIO。(MysqlIO.java:300)
…还有15个##异常原因渐进开始开始怀疑是JDK在作怪。本地使用的JDK版本是1.8.0_151,服务器使用的是1.8.0.242,理论上是没有影响的。于是把服务器上的jdk卸载,从官网下载了安装包重新安装了1.8.0_241,数据库连接的问题消失了。后来仔细一想,不是小版本号的问题,或者安装JDK的版本问题,本机安装的JDK是从Oracle官网下载的,而服务器上存储的我们知道,从jdk7之后,JDK和OpenJDK属于两个不同的授权协议的版本,而OpenJDK源代码不完整,OpenIDK只包含最精简的JDK。下面分享一下搜索上述异常##袜子问题路径问题现象与上述相同,除了服务器部署应用无法连接服务器之外,其他方式都可以连接数据库。导致问题的原因是:服务器有两块磁盘,中间执行过mv命令,将数据库的存储内容 结果:使用JAVA程序本地连接失败,引发了组织。apache.commons.dbcp.SQLNestedException:无法创建PoolableConnectionFactory(通信链接失败异常。解决方案:修改了datadir相应在配置之后,需要核查一下mysql.sock文件路径的配置。可以在/ var / lib / mysql / mysql / mysql中进行。sock或/temp/mysql.sock。然后,统一修改所有的端([client ],[mysql],[mysqld]等)均使用统一路径。## SSL连接问题如果一次信息中还出现如下异常信息:
javax.net.ssl.SSLHandshakeException:没有适当的协议(协议被替换为或密码套件不适当的)在sun.security.ssl.Handshaker.activate(Handshaker.java:529)在sun.security.ssl。 security.ssl.SSLSocketImpl.performInitia的SSLSocketImpl.kickstartHandshake(SSLSocketImpl.java:1492)lHandshake(SSLSocketImpl.java:1361)和sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
在sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)```
则有可能是SSL连接的问题。网络是有朋友升级到jdk1.8之后出现上述异常。
解决方案:删除SSLv3。在JAVA_HOME / jre / lib / security / java.security文件中找到jdk.tls.disabledAlgorithns = SSLv3,……相关的配置,删除SSLv3部分。
针对SSL连接的问题,还有一种情况就是Mysql使用SSL连接。关于如何配置可参见该文章:https://www.cnblogs.com/maggieq8324/p/11414889.html。
数据库连接超时
这种情况是网上主流的信息,有大量的文章,但经常都没有说明具体的场景:应用程序使用过程中出现类似上述异常,注意这里是使用过程中,而不是启动引发异常。
导致使用过程中出现异常的原因是:Mysql服务器初始化的“ wait_timeout”是8小时(28800秒),也就是一个连接超时(没有活动)超过8小时,Mysql将自动连接该连接。而连接池却认为该连接还是有效的(因为重新校正连接的有效性),当应用申请使用该连接时,就会导致上面的报错。
解决方案:修改my.ini配置,增加超时时间或在连接网址中添加“&autoReconnect = true”。
在端口= 3306下面添加如下配置:
WAIT_TIMEOUT = 31536000 interactive_timeout = 31536000
然后重启的MySQL的的的的的的的的的的的的这种情况也有可能是数据库连接池maxIdleTime配置导致的。
-最大最大值时间, 60秒内未使用则连接被终止:0-> <属性名=“ maxIdleTime”值=“ 0”> </属性>
MySQL的连接超过8小时就关闭了,但是连接池却永不替换连接,认为该连接还是有效的(因为重新重置连接的有效性),当应用申请使用该连接时,就会解决方法:将值设置为20 ##其他原因当然,关于MySQL的连接出现类似异常还有其他很多原因:-数据库帐户访问权限问题:指定的IP和帐户授权;-网络权限问题:防火墙是否打开了对应的访问权限;;;;-范围问题:访问的端口是否正确,端口是否开启防火墙权限;;-帐户密码问题:帐户密码错误或帐户没有指定IP的访问权限; -ipv4-网络驱动问题:网络驱动导问-相应库连接池问题:的IPv4的数据库连接池配置过大,导致的MySQL的交替连接数不够的问题与IPv6的的问题的
— <中> <乙>新</ B >:精彩和成长都不容错错错错错错错错错过错过错过错过错过错过错过错过错过错过错过错过错过错过错过错过错过错过 错过错过错过错过错过错过错过错过错过错过错过错过过<
共同学习,写下你的评论
评论加载中...
作者其他优质文章