Проблема тайм-аута соединения с основным источником данных (с использованием mysql)

0

Я использую BasicDatasource в своем приложении. Это приложение обрабатывает огромное количество необработанных данных. Иногда 1 запрос может занять более 15 минут. (используя mysql как db)

Вот мой вопрос, я получаю соединение из пула, а затем выполняю несколько запросов на нем. Но когда я использую то же соединение более 15 минут, я получаю ошибку ниже. На сервере mysql max_wait установлен на 180 часов, поэтому не должно быть проблем, чтобы поддерживать соединение в живом состоянии, и правило брандмауэра не установлено, чтобы убивать соединения, которые живут больше определенного времени.

Что мне здесь не хватает, как вы думаете?

The last packet successfully received from the server was 928,374 milliseconds ago.  The last packet sent successfully to the server was 928,374 milliseconds ago.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3055)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2941)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3489)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562)
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1664)
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1583)
        at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
        at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
        at com.adsclick.logs.cron.adsclickv261.global.ProcessBase.executeUpdate(ProcessBase.java:766)
Теги:
connection-pooling
timeout

1 ответ

3
Лучший ответ

Что вы можете попробовать:

  • setMaxWait(-1) в источнике BasicDataSource. Это говорит о том, что он ждет бесконечное соединение.

  • Убедитесь, что для параметра wait_timeout на вашем сервере MySQL установлено значение по умолчанию 8h.

  • Установите ?autoReconnect=true в URL-адрес JDBC

  • setTestOnBorrow(true) в источнике BasicDataSource. Это предотвратит передачу устаревших соединений, но добавит накладные расходы на ваше приложение (хотя, если у вас уже есть такие длинные одиночные запросы, вы, вероятно, даже не заметите эту часть).

В общем, я считаю плохую идею продолжать повторное использование соединения. Для меня смысл иметь пул в том, что мне не нужно это делать.

Являются ли ваши запросы транзакционными? Какой-то действительно длинный запрос блокирует основную таблицу?

  • 0
    Спасибо за ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню