Контекст: облако
У нас есть Java-приложение, которое мы обычно размещаем на наших собственных серверах. Недавно мы использовали облако веб-сервисов Amazon Web Services (AWS EC2) для размещения экземпляра.
Эта "облачная настройка" соответствует нашей типичной настройке "на сайте": один сервер для сервера приложений, другой сервер для сервера базы данных. (Несколько серверов приложений указывают на тот же сервер базы данных)
Проблема В этой облачной настройке мы получаем прерывистое "соединение reset путем одноранговых ошибок" между базой данных и драйвером 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. Это заставило меня задуматься, поможет ли виртуальное частное облако.
заблаговременно
будет