java - 从 MySql 迁移 : MariaDB server closing client connections unexpectedly

标签 java hibernate jdbc connection mariadb

由于许可/商业用途原因,我们正在从 MySql 迁移到 MariaDB。

我们已经成功地将 MySql 连接器 jar 替换为 MariaDB 客户端 jar(第一次更改),现在正尝试在不更改数据文件的情况下将 MySql 服务器替换为 MariaDB 服务器。

我们所有的应用程序都完美运行了大约 8-12 小时,之后我们看到以下异常:


org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection
Caused by:
org.hibernate.exception.JDBCConnectionException: Cannot open connection
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
        at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
        at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119)
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:494)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:315)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:257)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:102)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
        at $Proxy4.getMessageCountByStatus(Unknown Source)
        at com.onmobile.cmfweb.monitoring.CmfMessagesMonitor.getMessageCounts(CmfMessagesMonitor.java:56)
        at sun.reflect.GeneratedMethodAccessor625.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:270)
        at com.onmobile.cmfshare.MethodInvockingBean.invoke(MethodInvockingBean.java:28)
        at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:212)
        at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:79)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
Caused by: java.sql.SQLNonTransientConnectionException: Could not connect to localhost:3306: unexpected end of stream, read 0bytes from 4
        at org.mariadb.jdbc.internal.SQLExceptionMapper.get(SQLExceptionMapper.java:136)
        at org.mariadb.jdbc.internal.SQLExceptionMapper.throwException(SQLExceptionMapper.java:106)
        at org.mariadb.jdbc.Driver.connect(Driver.java:114)
        at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)
        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:840)
        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:544)
        at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
        ... 21 more
Caused by: org.mariadb.jdbc.internal.common.QueryException: Could not connect to localhost:3306: unexpected end of stream, read 0bytes from 4
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.connect(MySQLProtocol.java:509)
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.connect(MySQLProtocol.java:669)
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.<init>(MySQLProtocol.java:264)
        at org.mariadb.jdbc.Driver.connect(Driver.java:110)
        ... 28 more
Caused by: java.io.EOFException: unexpected end of stream, read 0bytes from 4
        at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:84)
        at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:92)
        at org.mariadb.jdbc.internal.common.packet.RawPacket.nextPacket(RawPacket.java:77)
        at org.mariadb.jdbc.internal.common.packet.SyncPacketFetcher.getRawPacket(SyncPacketFetcher.java:67)
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.connect(MySQLProtocol.java:467)
        ... 31 more

再次使用MySql服务器异常消失

到目前为止,根据我调试的内容,MariaDB 服务器出于某种原因正在关闭客户端连接。我最初怀疑是空闲连接,但我们使用的是像“testOnBorrow”这样的 Hibernate 配置,所以不应该是这种情况。

谁能帮我们找出这个问题的原因并帮助我们解决问题? MariaDB 中是否有我应该做的任何特定配置?

我什至通过增加 MariaDB 服务器中参数“interactive_timeout”的值来运行我们的应用程序,但它没有帮助。

顺便说一句,我们正在使用 Spring-Hibernate 并使用 Commons-pool jar 来汇集我们的连接。

我们将不胜感激任何形式的帮助。

最佳答案

由于参数组合不正确,我们最近遇到了同样的问题。 此错误是由于您的 Web 实例尝试使用不再有效的连接造成的。

这可以通过确保以下参数正确来解决:

  1. 您为数据库连接配置了一个验证查询。即 validationQuery="SELECT 1" 在 mariadb 的情况下,在服务器配置中。
  2. 您已将 wait_timeout 设置为合理的值。 8 小时 keepAlive 似乎有点乐观,我们现在使用 wait_timeout=180
  3. 确保将 validationInterval 设置为低于 wait_timeout 值的值,您也可以在服务器配置(如果是 tomcat 设置则为 server.xml)中设置该值。我在一个案例中将 wait_timeout 减少到 15s,validationInterval 值高于该值,导致错误仍然有时出现。 现在它被设置为 validationInterval=60,结合 wait_timeout=180 应该及时捕获任何断开的连接。

关于java - 从 MySql 迁移 : MariaDB server closing client connections unexpectedly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18816974/

相关文章:

java - 如何在java或jsp中对查询结果应用where条件

java - 检查映射键是否大于值

java - 如何在 Catalina.out 中禁用 hibernate 日志

java - JDBC:更新表的最佳方法?

java - 使用未包装的 oracle.jdbc.driver.T4CConnection 的 HikariCP 连接泄漏

java - Press Enter to Continue 跳过后续

java - ServletContext 和 Session 对象

java - 是否可以并行初始化多个惰性集合?

mysql - 使用 TableGenerator 时出现重复的 id

java - 将preparedStatement添加到select语句中