Tengo una web-app con una Java de back-end que utiliza Tomcat jdbc-piscina para conexiones de base de datos. Esto funciona bien.

Sin embargo estoy tratando de infalible que antes de exportar a otros lugares, y recientemente, un escenario donde se produjo a alguien reiniciar la base de datos SQL Server de servicio, pero no reinicie el servicio Tomcat. Esto causó una SQLException: java.sql.SQLException: I/O Error: Connection reset by peer: socket write error hasta que he reiniciado Tomcat, obligando a la jdbc-piscina origen de datos para volver a conectar.

Busqué algún tipo de configuración en el Tomcat jdbc-piscina docs para contar el origen de datos para intentar volver a conectar, pero no pude encontrar nada.

¿Alguien sabe si hay algún tipo de configuración para esta o debo verificar esta condición antes de cada solicitud?

OriginalEl autor Geronimo | 2012-07-02

3 Comentarios

  1. 15

    No 100% seguro de si este es tu problema, pero en http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency que dice que usted puede utilizar testOnBorrow con un validationQuery.

    <Resource type="javax.sql.DataSource"
                ...
                testOnBorrow="true"
                validationQuery="SELECT 1"
                removeAbandoned="true"
                />
    Yo estaba tratando de evitar la validación de la consulta sobre la cabeza, y encontró otro método en el mismo enlace utilizando timeBetweenEvictionRunsMillis="5000" y minEvictableIdleTimeMillis="5000" y minIdle="0" que parece manejar el problema, gracias.
    bueno, yo upvoted tu comentario de ayer, pero hoy me di cuenta de que el uso de minIdle="0" en realidad puede ser peor: en realidad el cierre de la conexión después de 5 años de inactividad, si está bien o no. Así que no estoy seguro lo que es peor: la ejecución de las SELECT 1 antes de cada consulta o tener que volver a conectar cada 5s de inactividad…
    el testOnBorrow="true" auto de inicio de una nueva conexión si se encuentra la antigua conexión está cerrada?

    OriginalEl autor Natan Cox

  2. 1

    Sólo para añadir a Natan Cox respuesta

    De referencia – http://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes

    <Resource type="javax.sql.DataSource"
                ...
                testOnBorrow="true"
                validationQuery="SELECT 1"
                removeAbandoned="true"
                />

    Como contra Geronimo, me gustaría usar validationQuery

    Base de datos validationQuery notas

    hsqldbselect 1 from INFORMATION_SCHEMA.SYSTEM_USERS

    Oracleselect 1 from dual

    DB2select 1 from sysibm.sysdummy1

    mysqlselect 1

    de microsoft SQL Serverselect 1

    postgresqlselect 1

    ingresselect 1

    derbyvalues 1

    H2select 1

    Firebirdselect 1 from rdb$database

    De referencia – El DBCP – validationQuery de diferentes Bases de datos

    el testOnBorrow=»true» auto de inicio de una nueva conexión si se encuentra la antigua conexión está cerrada?

    OriginalEl autor Indu Devanath

  3. 0

    Mientras se verifica el mismo problema me encontré con este post que tiene la conexión automática de las configuraciones para todos los servidores de aplicaciones.

    A continuación son la configuración que he utilizado para la conexión automática en tomcat para referencia.

        <Resource auth="Container"
    driverClassName="oracle.jdbc.OracleDriver"
    initialSize="5"
    maxActive="120"
    maxIdle="5"
    maxWait="5000"
    name="jdbc/oracle/myds"
    password="secret"
    poolPreparedStatements="true"
    type="javax.sql.DataSource"
    url="jdbc:oracle:thin:@DBHOSTNAME:1521/ServiceName"
    username="testuser"
    validationQuery="select 1 from tab"
    testOnBorrow="true"/>

    Completar la conexión automática de las configuraciones para todos los servidores de aplicaciones se puede encontrar aquí en Datasource autoreconnect en Servidores de Aplicaciones Java.

    OriginalEl autor user1472187

Dejar respuesta

Please enter your comment!
Please enter your name here