TransactionException на мариадб получить - PullRequest
0 голосов
/ 09 апреля 2019

Извините за вводящий в заблуждение заголовок.

У меня есть приложение device-id, которое в основном сохраняет все новые deviceId, отправленные в систему, или возвращает сведения о любых deviceId согласно запросу.

Эта проблема не очень частая, но она всплывает время от времени , и Google не помогает ее решить!

Хранилище данных включено MariaDB-10.1.35.Служба имеет активность QPS ~ 2,5 тыс., Пара ссылок Google предложила увеличить wait_timeout, но, учитывая QPS, безопасная ставка - wait_timeout 600 секунд.

Конфигурация prod имеет:

validationQuery: "/* Health Check */ SELECT 1"
wait_timeout: 600

стандартная функция (построена вокруг оболочки Hystrix, как показано ниже)

public Optional<DeviceId> get(final String token) throws DeviceIdException {
    try {
        return CommandFactory.<Optional<DeviceId>>create("DeviceId", "Get")
                .executor(() -> DaoRegistry.getDeviceIdLookupDao().get(token))
                .toObservable()
                .toBlocking()
                .single();
    } catch (Exception e) {
        log.error("Get error {}", e);
        throw DeviceIdException.builder()
                .code(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())
                .errorCode("DI000")
                .message("Oops! Something went wrong!")
                .build();
    }
}

Дамп стека, как показано ниже

Caused by: org.hibernate.TransactionException: JDBC begin transaction failed:
    at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.begin(AbstractLogicalConnectionImplementor.java:73)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:263)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:214)
    at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:56)
    at org.hibernate.internal.AbstractSharedSessionContract.beginTransaction(AbstractSharedSessionContract.java:409)
    at io.dropwizard.sharding.utils.TransactionHandler.beginTransaction(TransactionHandler.java:96)
    at io.dropwizard.sharding.utils.TransactionHandler.beforeStart(TransactionHandler.java:48)
    at io.dropwizard.sharding.utils.Transactions.execute(Transactions.java:52)
    at io.dropwizard.sharding.utils.Transactions.execute(Transactions.java:46)
    at io.dropwizard.sharding.dao.LookupDao.get(LookupDao.java:192)
    at io.dropwizard.sharding.dao.LookupDao.get(LookupDao.java:176)
    at com.myOrganisation.MyCustomService.commands.DeviceIdCommands.lambda$get$1(DeviceIdCommands.java:73)
    at io.appform.core.hystrix.GenericHystrixCommand$1.run(GenericHystrixCommand.java:43)
    at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
    at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
    ... 26 common frames omitted
Caused by: java.sql.SQLNonTransientConnectionException: (conn=2997305) unexpected end of stream, read 0 bytes from 4 (socket was closed by server)
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:234)
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:165)
    at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:238)
    at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:356)
    at org.mariadb.jdbc.MariaDbStatement.executeUpdate(MariaDbStatement.java:545)
    at org.mariadb.jdbc.MariaDbConnection.setAutoCommit(MariaDbConnection.java:751)
    at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108)
    at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:79)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108)
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81)
    at com.sun.proxy.$Proxy53.setAutoCommit(Unknown Source)
    at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.begin(AbstractLogicalConnectionImplementor.java:67)
    ... 41 common frames omitted
Caused by: java.sql.SQLException: unexpected end of stream, read 0 bytes from 4 (socket was closed by server)
Query is: set autocommit=0
java thread: hystrix-DeviceId.Get-4
    at org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery(LogQueryTool.java:126)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:222)
    at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:350)
    ... 53 common frames omitted
Caused by: java.io.EOFException: unexpected end of stream, read 0 bytes from 4 (socket was closed by server)
    at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacketArray(StandardPacketInputStream.java:238)
    at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacket(StandardPacketInputStream.java:207)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1427)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1407)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:219)
    ... 54 common frames omitted

Может ли кто-нибудь помочь с правильным направлением здесь относительно того, что может быть сломано/ отсутствует?

1 Ответ

1 голос
/ 09 апреля 2019

Похоже на wait_timeout проблему. Если значение установлено в часах; сократить его до разумного времени; скажем 600 секунд. Было бы чрезмерно оптимистичным ожидать, что связь будет сохраняться в течение нескольких часов. Надеюсь, это поможет.

...