Подтвердить что ты не робот

Как обратиться к ошибке "Получите минус один из чтения" при подключении к экземпляру Oracle Amazon RDS

Я запускаю Oracle 11GR2 на экземпляре RDS Amazon. иногда я получаю IO Error: Got minus one from a read call при вызове DriverManager.getConnection(getUrl()), и я не уверен, почему. Другие приложения работают правильно.

Чтобы еще больше запутать вещи, ошибка будет исправляться сама по себе (после следующей итерации программы).

Как мне подойти к ошибке "Получена минус одна из ошибки чтения"?

Полная трассировка стека:

java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:243)
    at com.cwd.facile.db.Database.<init>(Database.java:44)
    at com.cwd.facile.ns.NetSuiteRequestBased.<init>(NetSuiteRequestBased.java:29)
    at com.cwd.facile.ns.CommonOperations.isInventoryItem(CommonOperations.java:205)
    at com.cwd.facile.ns.CommonOperations.findItemIdByName(CommonOperations.java:188)
    at com.cwd.facile.ns.CommonOperations.createSalesOrder(CommonOperations.java:970)
    at com.cwd.facile.Main.main(Main.java:47)
Caused by: oracle.net.ns.NetException: Got minus one from a read call
    at oracle.net.ns.Packet.receive(Packet.java:311)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:300)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
    ... 12 more

Database.java строка 44: setConn(DriverManager.getConnection(getUrl()));

Дополнительная информация:

  • Я думал, что это плохой URL-адрес JDBC, но он работает, иногда в течение нескольких дней подряд, перед сбоем.
  • Amazon RDS - управляемый экземпляр, и изменения конфигурации могут быть невозможны.
  • Я использую ojdbc6.jar для подключения
4b9b3361

Ответ 1

Непосредственная причина проблемы заключается в том, что драйвер JDBC попытался прочитать из сетевой розетки, которая была закрыта "другим концом".

Это может быть связано с несколькими вещами:

  • Если удаленный сервер настроен (например, в файле "SQLNET.ora" ), чтобы не принимать соединения с вашего IP-адреса.

  • Если URL-адрес JDBC неверен, вы можете попытаться подключиться к тому, что не является базой данных.

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

Учитывая симптомы, я думаю, что сценарий "слишком много соединений" наиболее вероятен. Это говорит о том, что ваше приложение является утечкой соединений; т.е. создавать соединения, а затем не закрывать их.

Ответ 2

Мы столкнулись с той же проблемой и исправлены. Ниже приведена причина и решение.

Проблема

Когда мы создаем соединение с базой данных через механизм пула соединений, тогда сервер приложений (в нашем случае это JBOSS) создает соединение, как указано в параметре min-connection. Если у вас 10 приложений, и у каждого есть мин-соединение как 10, тогда в базе данных будет создано 100 сеансов. Также в каждой базе данных есть параметр max-session, если ваше общее соединение пересекает эту границу, чем вы получите "Получил минус один из прочитанного вызова", FYI: используйте нижеприведенный запрос для просмотра общей сессии

SELECT username, count(username) FROM v$session 
WHERE username IS NOT NULL group by username

Решение. С помощью нашего администратора баз данных мы увеличили таковую максимальную сессию, чтобы можно было использовать все наше приложение min-connection.

Ответ 3

Я хотел бы добавить к Стивену С ответ, мое дело было на первой точке. Поэтому, поскольку у нас есть DHCP для распределения IP-адресов в компании, DHCP изменил мой машинный адрес, не спрашивая ни меня, ни Oracle. Таким образом, из синего оракула отказался что-то сделать и дал минус одно страшное исключение. Поэтому, если вы хотите обходить это раз и навсегда, и поскольку TCP.INVITED_NODES файла SQLNET.ora не принимает подстановочные знаки, как указано здесь, вы может добавить имя хоста машины вместо IP-адреса.