ライセンス/商用利用上の理由により、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を使用して接続をプールしています。
どんな種類の助けも深く感謝されます。
誤ったパラメータの組み合わせが原因で、最近同じ問題が発生しました。このエラーは、Webインスタンスが有効ではなくなった接続を使用しようとしたことが原因で発生します。
これは、次のパラメータが正しいことを確認することで解決できます。
validationQuery="SELECT 1"
です。wait_timeout=180
を使用していますvalidationInterval=60
に設定され、wait_timeout=180
と組み合わされて、切断された接続を時間内にキャッチする必要があります。'interactive_timeout'の代わりに 'wait_timeout'を増やすことを試みることができます。エラーが発生するまでの8〜12時間は、デフォルト値のwait_timeoutである10時間と非常によく相関します。 JDBCドライバーは接続時に対話型クライアントフラグを設定しないため、「interactive_timeout」に変更しても効果がない場合があります。マリアKBのクロスポストにも返信しました;)
私もこの問題に直面しました。この問題は、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.
私もこのようなエラーがありましたCould not connect to localhost:3306: unexpected end of stream, read 0 bytes from 4
私のアーキテクチャは、MariaDBにデータを挿入していたTomcatのWebアプリケーションでした。
コネクタバージョン1.5.1RCを使用していました! 1.3.1コネクタバージョンに切り替えて、正常に動作するようになりました。
見る
SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE '%connect%';
2つのシステム間でmy.cnf値を比較します。あなたは違いを生む上記のようなものの違いを見るかもしれません。それでも問題が明らかでない場合は、さらに議論するためにそれらの値を提供してください。
問題はMariaDBConnector/Jにあると思います。たとえば、 MariaDB Connector/J 1.2. のような安定したものを使用してみてください。また、autoReconnectがtrueまたは標準フェイルオーバーに設定されている場合の基本フェイルオーバーで フェイルオーバー動作 を調べます。
この 記事 の調査結果によると、2つのオプションで逃げることができます:
innodb_file_per_table
をオフにしてみてください
または...
オープンファイルの制限を増やすと、高スペックのマシンで実行している場合に、YouTubeのマシン$ ulimit -n
の現在の値がわかります。