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

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

Вот мой вопрос: я получаю соединение из пула, затем выполняю несколько запросов к нему.Но когда я использую то же соединение более 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)

1 Ответ

3 голосов
/ 10 октября 2010

Вещи, которые вы можете попробовать:

  1. setMaxWait(-1) в BasicDataSource. Это говорит о том, что нужно ждать подключения бесконечно.

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

  3. Установите ?autoReconnect=true на свой URL JDBC

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...