簡體   English   中英

從MySql遷移:MariaDB服務器意外關閉客戶端連接

[英]Migrating from MySql: MariaDB server closing client connections unexpectedly

由於許可/商業使用原因,我們正在從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匯集我們的連接。

任何形式的幫助將深表感謝。

由於參數不正確,我們最近遇到了同樣的問題。 此錯誤是由您的Web實例嘗試使用不再有效的連接引起的。

這可以通過確保以下參數正確來解決:

  1. 您已為數據庫連接配置了validationQuery。 即,在mariadb的情況下,在服務器配置中, validationQuery="SELECT 1"
  2. 您將wait_timeout設置為合理的值。 8小時keepAlive似乎有點樂觀,我們現在使用wait_timeout=180
  3. 確保您還可以在服務器配置中設置的validationInterval(在tomcat設置的情況下為server.xml)設置為低於wait_timeout值的值。 在一種情況下,我將wait_timeout減少到15秒,其中validationInterval值高於該值,這導致錯誤仍然有時出現。 現在將它設置為validationInterval=60 ,並結合wait_timeout=180 ,它應該及時捕獲任何斷開的連接。

您可以嘗試增加'wait_timeout'而不是'interactive_timeout'。 8-12小時,直到錯誤與wait_timeout的默認值10小時相關。 JDBC驅動程序在連接時不設置交互式客戶端標志,因此更改為“interactive_timeout”可能無效。 我還回復了Maria KB的交叉帖子;)

我也有一個像這樣的錯誤Could not connect to localhost:3306: unexpected end of stream, read 0 bytes from 4

我的架構是Tomcat的webapp,它將數據插入MariaDB。

我使用的是連接器版本1.5.1RC 我切換到1.3.1連接器版本 ,現在運行正常!

我也遇到過這個問題。 問題隨着降低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.

看着

SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE '%connect%';

比較兩個系統之間的my.cnf值; 你可能會發現像上面這樣的東西有所不同。 如果問題仍然不明顯,請提供這些值以供進一步討論。

根據本文的調查結果,您可以選擇兩種方法:

  1. 您應該嘗試關閉innodb_file_per_table

    要么...

  2. 增加打開文件限制,如果你在高規格機器上運行,這會告訴你機器$ ulimit -n上的當前值

我認為問題出在MariaDB Connector / J上。 嘗試使用像MariaDB Connector / J 1.2.3這樣的穩定​​版本。 此外,當autoReconnect設置為true或標准故障轉移時,請研究使用基本故障轉移的故障轉移行為

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM