Contexto: La nubeJDBC de SQL Server restablecimiento de la conexión de error: Sólo en Amazon EC2
Tenemos una aplicación web basada en Java que normalmente los anfitriones en nuestros propios servidores. Recientemente utilizamos la nube de Amazon Web Services (AWS EC2) para alojar una instancia.
Esta "configuración de la nube" coincide con nuestra típica "in situ" de configuración: un servidor para el servidor de aplicaciones, otro servidor para el servidor de base de datos. (Varios servidores de aplicaciones apuntan al mismo servidor de base de datos)
El problema En esta configuración la nube, recibimos intermitente "restablecimiento de conexión por errores de pares" entre la base de datos y el controlador JDBC, donde al (aparentemente) intervalos aleatorios y en puntos al azar en la base de código, la conexión de la base de datos falla.
Éstos son algunos extractos de error para el registro de
Seguimiento de la pila Ejemplo 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)
Seguimiento de la pila Ejemplo 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)
Medio Ambiente Técnica
- Jboss 4.2.2.GA (Jboss en la Web 2.0/Tomcat 6)
- MSSQL 2005 2.0 controlador JDBC
Algunos puntos
- Tenemos nunca se ven este problema en nuestro propio entorno (es decir, propios centros de datos) ejecutando la aplicación durante varios años
- Esto me llevó a concluir que "algo gracioso está sucediendo con el entorno de red de Amazon". Puedo estar equivocado/falta algo/etc.
- Este problema solo ocurre con nuestra aplicación. Tenemos otras aplicaciones java y php que no han tenido este problema. La otra aplicación Java utiliza un controlador JDBC diferente (jtds, que yo sepa)
- no parece como un simple tiempo de espera de conexión
Preguntas
-Tiene Alguien ha visto esto antes? -Si es un "problema conocido" de EC2, ¿podemos configurar nuestro camino para resolver el problema (es decir, asegurarse de que todo esté en su propia subred o nube privada virtual (vpc)? -¿Alguna configuración del controlador jdbc para superar este problema?
** actualización ** he ampliado y aumentado la recompensa por esta pregunta
en poco más de información: los dos servidores virtuales (base de datos y servidor de aplicaciones) estaban en diferentes subredes - es decir, un salto. entre los dos servidores.
En un entorno no en la nube, tenemos "cero saltos" entre los dos servidores.
Nuestros administradores de alojamiento dijeron que no teníamos control sobre las subredes de nuestras instancias EC2. Esto me hizo preguntarme si la nube privada virtual ayudaría.
gracias de antemano
se
¿Intentó cambiar el controlador JDBC a jTDS? Debería ser un intento fácil. – MicSim
Un cambio de controlador requeriría un ciclo completo de qa. En teoría, todos los controladores jdbc funcionan igual (es decir, "En teoría, el comunismo funciona") ... En la práctica, tienen ligeras variaciones ... por lo que no es una opción para nosotros en este momento. – user331465
¿Estás compartiendo conexiones a través de varios hilos en tu aplicación? ¿O hay un elemento de red como un firewall que deja caer las conexiones después de un tiempo preestablecido (me temo que no estoy bien informado sobre EC2)? La segunda traza de la pila es el resultado de una IOException que se encuentra al leer desde el canal. La excepción en sí misma no se manejó correctamente, porque la conexión lógica subyacente (la instancia de SQLServerConnection) se cerró antes. Esto sugeriría que la conexión lógica fue compartida, o que el enlace físico subyacente fue interrumpido. –