オーロラのMySQL(jOOQ、MariaDBドライバを使用)で瞬時クエリタイムアウト

オスカー・ロペス:

私はjOOQを使用してクエリとオーロラMySQLデータベースに接続するためのMariaDBのドライバを実行したときに私のJavaアプリケーションが正常に動作します。プレーンなSQLでは、このように私のクエリルックス、およびタイムスタンプに注目してください:

select
  A.id, B.x, B.y,
  coalesce(A.modified, A.created) as modified
from
  A join B on A.b_id = B.id
where
  A.created between date_sub(now(), interval 1 day) and now()
  or A.modified between date_sub(now(), interval 1 day) and now();

しかし、私は大きなタイムスタンプ間隔で同じクエリを実行すると、それが失敗した直後にタイムアウトエラー(私の知る限りがない実際のタイムアウトが発生する機会があった)、例えばこのクエリは(再び、タイムスタンプに注意してください)一度失敗すると:

select
  A.id, B.x, B.y,
  coalesce(A.modified, A.created) as modified
from
  A join B on A.b_id = B.id
where
  A.created between date_sub(now(), interval 1 month) and now()
  or A.modified between date_sub(now(), interval 1 month) and now();

MySQLのコンソールを介して直接接続する場合は上記のクエリは成功し、私はタイムアウトなしの苦情で、正常に実行同じスタックを使用してシステム内の他の実行時間の長いクエリを持っています。問題は、私のJavaアプリケーションから発生すると、いくつかの大きな時間の間隔を持って(すべてではない!)のクエリ-たとえば、(数日の間隔ではなくなし)月。私のスタックが含まれています:

  • オープンJDK 8
  • jOOQ 3.11
  • MariaDBコネクタ/ J 2.2
  • オーロラのMySQL 5.6.10a

私のログにスタックトレース(下記添付)は、ショーはあらゆる場所に「読むがタイムアウト」「接続がタイムアウトしました」と。クエリ内の長い間隔が瞬時タイムアウトが発生する理由を任意のアイデア?必要であれば、私はコメントでお願いし、より多くの詳細を提供します。

UPDATE:私は、標準のMySQLのJavaドライバーを使用するように私のドライバを変更し、クエリが動作するようになりました!Iと思い、まだ等が理解しているので、私は、この質問を開いたままだろう、なぜ MariaDBドライバで壊れているもの、これが起こっている、そしてそれは、回避策を見つけることが可能だ場合(私はMariaDBドライバを使用することを好むと思いますので。)

org.jooq.exception.DataAccessException: SQL [<query>]; (conn=349133) Communications link failure with primary host <host>. Connection timed out
at org.jooq_3.11.4.MARIADB.debug(Unknown Source) ~[?:?]
at org.jooq.impl.Tools.translate(Tools.java:2384) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:811) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:364) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractResultQuery.fetchLazy(AbstractResultQuery.java:393) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractResultQuery.fetchLazy(AbstractResultQuery.java:380) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractResultQuery.fetchStream(AbstractResultQuery.java:351) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractResultQuery.fetchStreamInto(AbstractResultQuery.java:356) ~[jooq-3.11.4.jar:?]
<redacted>
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_222]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_222]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_222]
Caused by: java.sql.SQLException: (conn=349133) Communications link failure with primary host <host>. Connection timed out
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:198) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:110) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:228) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternal(MariaDbPreparedStatementClient.java:216) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.MariaDbPreparedStatementClient.execute(MariaDbPreparedStatementClient.java:150) ~[Mariadb-java-client-2.2.x.jar:?]
at org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:209) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.Tools.executeStatementAndGetFirstResultSet(Tools.java:3483) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractResultQuery.execute(AbstractResultQuery.java:268) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:350) ~[jooq-3.11.4.jar:?]
... 17 more
Caused by: java.sql.SQLException: Communications link failure with primary host <host>. Connection timed out
on HostAddress{host='<host>', port=3306},master=true. Driver has reconnect connection
at org.mariadb.jdbc.internal.failover.AbstractMastersListener.throwFailoverMessage(AbstractMastersListener.java:517) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.failover.FailoverProxy.handleFailOver(FailoverProxy.java:354) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.failover.FailoverProxy.executeInvocation(FailoverProxy.java:292) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.failover.FailoverProxy.invoke(FailoverProxy.java:263) ~[Mariadb-java-client-2.2.x.jar:?]
at com.sun.proxy.$Proxy48.executeQuery(Unknown Source) ~[?:?]
at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternal(MariaDbPreparedStatementClient.java:209) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.MariaDbPreparedStatementClient.execute(MariaDbPreparedStatementClient.java:150) ~[Mariadb-java-client-2.2.x.jar:?]
at org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:209) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.Tools.executeStatementAndGetFirstResultSet(Tools.java:3483) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractResultQuery.execute(AbstractResultQuery.java:268) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:350) ~[jooq-3.11.4.jar:?]
... 17 more
Caused by: java.sql.SQLException: Read timed out
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.handleIoException(AbstractQueryProtocol.java:1786) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1344) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1323) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:252) ~[Mariadb-java-client-2.2.x.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_222]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_222]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_222]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_222]
at org.mariadb.jdbc.internal.failover.impl.MastersSlavesListener.invoke(MastersSlavesListener.java:217) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.failover.FailoverProxy.executeInvocation(FailoverProxy.java:270) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.failover.FailoverProxy.invoke(FailoverProxy.java:263) ~[Mariadb-java-client-2.2.x.jar:?]
at com.sun.proxy.$Proxy48.executeQuery(Unknown Source) ~[?:?]
at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternal(MariaDbPreparedStatementClient.java:209) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.MariaDbPreparedStatementClient.execute(MariaDbPreparedStatementClient.java:150) ~[Mariadb-java-client-2.2.x.jar:?]
at org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:209) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.Tools.executeStatementAndGetFirstResultSet(Tools.java:3483) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractResultQuery.execute(AbstractResultQuery.java:268) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:350) ~[jooq-3.11.4.jar:?]
... 17 more
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_222]
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[?:1.8.0_222]
at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[?:1.8.0_222]
at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_222]
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) ~[?:1.8.0_222]
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) ~[?:1.8.0_222]
at java.io.BufferedInputStream.read(BufferedInputStream.java:345) ~[?:1.8.0_222]
at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacketArray(StandardPacketInputStream.java:237) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacket(StandardPacketInputStream.java:207) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1342) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1323) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:252) ~[Mariadb-java-client-2.2.x.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_222]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_222]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_222]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_222]
at org.mariadb.jdbc.internal.failover.impl.MastersSlavesListener.invoke(MastersSlavesListener.java:217) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.failover.FailoverProxy.executeInvocation(FailoverProxy.java:270) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.internal.failover.FailoverProxy.invoke(FailoverProxy.java:263) ~[Mariadb-java-client-2.2.x.jar:?]
at com.sun.proxy.$Proxy48.executeQuery(Unknown Source) ~[?:?]
at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternal(MariaDbPreparedStatementClient.java:209) ~[Mariadb-java-client-2.2.x.jar:?]
at org.mariadb.jdbc.MariaDbPreparedStatementClient.execute(MariaDbPreparedStatementClient.java:150) ~[Mariadb-java-client-2.2.x.jar:?]
at org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:209) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.Tools.executeStatementAndGetFirstResultSet(Tools.java:3483) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractResultQuery.execute(AbstractResultQuery.java:268) ~[jooq-3.11.4.jar:?]
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:350) ~[jooq-3.11.4.jar:?]
... 17 more
ディエゴ・デュパン:

オーロラの構成は10秒のデフォルトのソケットタイムアウトがあります参照socketTimeoutしてドキュメントをhttps://mariadb.com/kb/en/library/about-mariadb-connector-j/

デフォルト:0(標準設定)または10000ms(「オーロラ」フェイルオーバー構成を使用して)。

0手段タイムアウトなしにその値を変更します。

これはのように、接続文字列を使用して行うことができます jdbc:mariadb:aurora://myHost/db?socketTimeout=0

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=315904&siteId=1
おすすめ