Как мне обрабатывать исключение SQLNonTransientConnectionException?

Это ошибка:

5760 feb 04 07:45:17 TestServer java[13777]: java.sql.SQLNonTransientConnectionException: Could not read resultset: unexpected end of stream, read 0bytes from 4
5761 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.SQLExceptionMapper.get(SQLExceptionMapper.java:136)
5762 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.SQLExceptionMapper.throwException(SQLExceptionMapper.java:106)
5763 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.MySQLStatement.executeQueryEpilog(MySQLStatement.java:264)
5764 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:288)
5765 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.MySQLStatement.executeUpdate(MySQLStatement.java:317)
5766 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.MySQLPreparedStatement.executeUpdate(MySQLPreparedStatement.java:156)
5767 feb 04 07:45:17 TestServer java[13777]: at com.zaxxer.hikari.proxy.PreparedStatementProxy.executeUpdate(PreparedStatementProxy.java:61)
5768 feb 04 07:45:17 TestServer java[13777]: at com.zaxxer.hikari.proxy.PreparedStatementJavassistProxy.executeUpdate(PreparedStatementJavassistProxy.java)
5769 feb 04 07:45:17 TestServer java[13777]: at com.testserver.deviceapi.data.DataDAO.insertBootEvent(DataDAO.java:64)
5770 feb 04 07:45:17 TestServer java[13777]: at com.testserver.deviceapi.server.ServerRunnable.processJsonObject(ServerRunnable.java:198)
5771 feb 04 07:45:17 TestServer java[13777]: at com.testserver.deviceapi.server.ServerRunnable.run(ServerRunnable.java:93)
5772 feb 04 07:45:17 TestServer java[13777]: at java.lang.Thread.run(Thread.java:745)
5773 feb 04 07:45:17 TestServer java[13777]: Caused by: org.mariadb.jdbc.internal.common.QueryException: Could not read resultset: unexpected end of stream, read 0bytes from 4
5774 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.mysql.MySQLProtocol.getResult(MySQLProtocol.java:926)
5775 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.mysql.MySQLProtocol.executeQuery(MySQLProtocol.java:991)
5776 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:281)
5777 feb 04 07:45:17 TestServer java[13777]: ... 8 more
5778 feb 04 07:45:17 TestServer java[13777]: Caused by: java.io.EOFException: unexpected end of stream, read 0bytes from 4
5779 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:84)
5780 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:92)
5781 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.common.packet.RawPacket.nextPacket(RawPacket.java:77)
5782 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.common.packet.SyncPacketFetcher.getRawPacket(SyncPacketFetcher.java:67)
5783 feb 04 07:45:17 TestServer java[13777]: at org.mariadb.jdbc.internal.mysql.MySQLProtocol.getResult(MySQLProtocol.java:894)
5784 feb 04 07:45:17 TestServer java[13777]: ... 10 more

Сервер представляет собой сервер Java, работающий как служба на CentOS. Я реализовал его как сервис только вчера, и это моя первая попытка сделать что-то подобное. По состоянию на вчерашний вечер все было ок. Я протестировал сервер из локальной сети и подключился из-за пределов локальной сети без каких-либо проблем, все данные были успешно обработаны и сохранены.

Вот что говорит Javadoc SQLNonTransientConnectionException:

Подкласс SQLException, созданный для значения класса SQLState '08' или в соответствии с условиями, указанными поставщиком. Это указывает на то, что неудачная операция подключения не будет успешной, если операция будет повторена без устранения причины сбоя. Обратитесь к документации поставщика вашего драйвера, чтобы узнать об условиях, указанных поставщиком, для которых может быть выдано это исключение.

значение класса SQL '08' означает:

Table 6. Class Code 08: Connection Exception
SQLSTATE Value    Meaning
08001             The connection was unable to be established to the application server or other server.
08002             The connection already exists.
08003             The connection does not exist.
08004             The application server rejected establishment of the connection.

Итак, я пришел сегодня утром и попытался сохранить некоторые данные в базе данных с помощью моего тестового клиента, когда произошли эти ошибки. После пары попыток я запустил сервер на своей локальной машине, точно такую ​​же версию, и он работал без каких-либо проблем, успешно подключился к базе данных на главном сервере и без проблем сохранил те же данные с того же клиента.

Затем я перезапустил службу на основном сервере. С этого момента все возвращается к норме, и я не знаю, что произошло, чтобы вызвать ошибку.

Может ли это быть что-то вроде этого? Но это сообщение об ошибке Last packet not finished, а мое Could not read resultset: unexpected end of stream, read 0bytes from 4.

Ребята, вы хоть представляете, что это может быть? Как мне с этим справиться? Поскольку в ошибке четко указано, что проблема не будет решена при повторной попытке, я думаю, что смогу поймать ошибку и выключить сервер. Служба настроена на немедленный перезапуск, поэтому CentOS перезапустит ее после завершения работы. Это разумный поступок?


person mal    schedule 04.02.2015    source источник
comment
Возможно, проверьте время ожидания подключения к базе данных и убедитесь, что maxLifetime пула настроен на 2 минуты или около того.   -  person brettw    schedule 04.02.2015
comment
Хорошо, я проверю это.   -  person mal    schedule 04.02.2015