web-dev-qa-db-ja.com

MySqlからの移行: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サーバーでparam'interactive_timeout 'の値を増やしてアプリケーションを実行したこともありますが、役に立ちませんでした。

ところで、Spring-Hibernateを使用し、Commons-pooljarを使用して接続をプールしています。

どんな種類の助けも深く感謝されます。

19
Vivek

誤ったパラメータの組み合わせが原因で、最近同じ問題が発生しました。このエラーは、Webインスタンスが有効ではなくなった接続を使用しようとしたことが原因で発生します。

これは、次のパラメータが正しいことを確認することで解決できます。

  1. データベース接続用にvalidationQueryが構成されています。つまり、サーバー構成で、mariadbの場合はvalidationQuery="SELECT 1"です。
  2. Wait_timeoutが適切な値に設定されています。 8時間のkeepAliveは少し楽観的ですが、現在はwait_timeout=180を使用しています
  3. サーバー構成(Tomcatセットアップの場合はserver.xml)でも設定できるvalidationIntervalが、wait_timeout値よりも低い値に設定されていることを確認してください。あるケースではwait_timeoutを15秒に短縮し、validationIntervalの値がそれよりも大きいため、エラーが引き続き表示されることがありました。これで、validationInterval=60に設定され、wait_timeout=180と組み合わされて、切断された接続を時間内にキャッチする必要があります。
4

'interactive_timeout'の代わりに 'wait_timeout'を増やすことを試みることができます。エラーが発生するまでの8〜12時間は、デフォルト値のwait_timeoutである10時間と非常によく相関します。 JDBCドライバーは接続時に対話型クライアントフラグを設定しないため、「interactive_timeout」に変更しても効果がない場合があります。マリアKBのクロスポストにも返信しました;)

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.
1
user799473

私もこのようなエラーがありましたCould not connect to localhost:3306: unexpected end of stream, read 0 bytes from 4

私のアーキテクチャは、MariaDBにデータを挿入していたTomcatのWebアプリケーションでした。

コネクタバージョン1.5.1RCを使用していました! 1.3.1コネクタバージョンに切り替えて、正常に動作するようになりました。

1
Toni_Mashengo

見る

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

2つのシステム間でmy.cnf値を比較します。あなたは違いを生む上記のようなものの違いを見るかもしれません。それでも問題が明らかでない場合は、さらに議論するためにそれらの値を提供してください。

0
Rick James

問題はMariaDBConnector/Jにあると思います。たとえば、 MariaDB Connector/J 1.2. のような安定したものを使用してみてください。また、autoReconnectがtrueまたは標準フェイルオーバーに設定されている場合の基本フェイルオーバーで フェイルオーバー動作 を調べます。

0

この 記事 の調査結果によると、2つのオプションで逃げることができます:

  1. innodb_file_per_tableをオフにしてみてください

    または...

  2. オープンファイルの制限を増やすと、高スペックのマシンで実行している場合に、YouTubeのマシン$ ulimit -nの現在の値がわかります。

0
Filip