Контекст: Облако
У нас есть веб-приложение на основе Java, которое мы обычно размещаем на наших собственных серверах.Недавно мы использовали облако Amazon Web Services (AWS EC2) для размещения экземпляра.
Эта «настройка облака» соответствует нашей типичной настройке «на месте»: один сервер для сервера приложений, другой сервер для сервера базы данных.(Несколько серверов приложений указывают на один и тот же сервер базы данных)
Проблема В этой облачной настройке мы получаем прерывистый «сброс соединения по одноранговым ошибкам» между базой данных и драйвером jdbc, где на(казалось бы) случайные интервалы и в случайных точках в кодовой базе соединение с базой данных завершается неудачно.
Вот несколько отрывков ошибок для журнала
Пример трассировки стека 1:
at com.participate.pe.genericdisplay.client.taglib.GenDisplayViewTag.doStartTag(GenDisplayViewTag.java:77)
... 75 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:304)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.getMetaData(SQLServerConnection.java:1734)
at org.jboss.resource.adapter.jdbc.WrappedConnection.getMetaData(WrappedConnection.java:354)
Пример трассировки стека 2
at java.lang.Thread.run(Thread.java:619)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1368)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1355)
at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1532)
at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:3274)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4437)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4389)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:1457)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectionCommand(SQLServerConnection.java:1462)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.setAutoCommit(SQLServerConnection.java:1610)
at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.checkTransaction(BaseWrapperManagedConnection.java:429)
Техническая среда
- Jboss 4.2.2.GA (Jboss-Web 2.0 / Tomcat 6)
- MSSQL 2005 2.0 JDBC-драйвер
Некоторые баллы
- У нас есть никогда не видел эту проблему в нашей собственной среде (то есть в собственных центрах обработки данных), в которой приложение работало в течение нескольких лет
- Это привело меня к выводу, что «в сетевой среде Amazon происходит нечто странное».Я могу ошибаться / что-то упустить / т.д.
- Эта проблема возникает только с нашим приложением.У нас есть другие приложения java и php, у которых не было этой проблемы.Другое java-приложение использует другой драйвер jdbc (jtds, afaik)
- Это не похоже на простое время ожидания соединения
Вопросы
- Кто-нибудь видел это раньше?-Если это «известная проблема» в EC2, можем ли мы настроить способ ее решения (т. Е. Убедиться, что все находится в собственной подсети или виртуальном частном облаке (vpc)?) -Все настройки драйвера jdbc позволяют обойти эту проблему?
** Обновление ** Я увеличил и увеличил награду за этот вопрос.
Дополнительная информация: два виртуальных сервера (база данных и сервер приложений) находились в разных подсетях - т.е. однапрыжок между двумя серверами.
В не облачной среде мы имеем «нулевой скачок» между двумя серверами.
Наши администраторы хостинга сказали, что у нас нет контроля над подсетями наших экземпляров EC2Это заставило меня задуматься, поможет ли виртуальное частное облако.
заранее спасибо
будет