Как обратиться к ошибке "Получите минус один из чтения" при подключении к экземпляру 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 для подключения
Ответы
Ответ 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-адреса.