由于许可/商业使用原因,我们正在从MySql迁移到MariaDB。
我们已经成功地用MariaDB客户端jar替换了MySql连接器jar(第一次更改),现在正尝试用MariaDB服务器替换MySql服务器而不更改数据文件。
我们所有的应用程序都运行良好约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服务器中param'interactive_timeout'的值来运行我们的应用程序,但它没有帮助。
顺便说一下,我们正在使用Spring-Hibernate并使用Commons-pool jar汇集我们的连接。
任何形式的帮助都将深受赞赏。
答案 0 :(得分:4)
由于参数不正确,我们最近遇到了同样的问题。 此错误是由您的Web实例尝试使用不再有效的连接引起的。
这可以通过确保以下参数正确来解决:
validationQuery="SELECT 1"
。wait_timeout=180
validationInterval=60
,并与wait_timeout=180
结合使用,它应及时捕获任何断开的连接。答案 1 :(得分:1)
您可以尝试增加'wait_timeout'而不是'interactive_timeout'。 8-12小时,直到错误与wait_timeout的默认值10小时相关。 JDBC驱动程序在连接时不设置交互式客户端标志,因此更改为“interactive_timeout”可能无效。我还回复了Maria KB的交叉帖子;)
答案 2 :(得分:1)
我也遇到了像Could not connect to localhost:3306: unexpected end of stream, read 0 bytes from 4
我的架构是Tomcat的webapp,它正在将数据插入MariaDB。
我使用的是连接器版本1.5.1RC ! 我切换到 1.3.1连接器版本,现在运行正常!
答案 3 :(得分:0)
看看
SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE '%connect%';
比较两个系统之间的my.cnf值;你可能会发现像上面这样的东西有所不同。如果问题仍然不明显,请提供这些值以供进一步讨论。
答案 4 :(得分:0)
根据article中的调查结果,您可以选择两种方法:
您应该尝试关闭innodb_file_per_table
...或
增加打开文件限制,如果您在高规格机器上运行,这会告诉您机器$ ulimit -n
上的当前值
答案 5 :(得分:0)
我认为问题出在MariaDB Connector / J上。尝试使用像MariaDB Connector/J 1.2.3这样的稳定版本。此外,当 autoReconnect 设置为true或标准故障转移时,请使用基本故障转移学习Failover behaviour。
答案 6 :(得分:0)
我也遇到了这个问题。通过降低wait_timeout可以解决问题。
SHOW SESSION VARIABLES LIKE 'wait_timeout'; ->> would be 8 hours. which is huge.
SET session wait_timeout=300; ->> this should fix the issue.