2009-07-25 14 views
5

Arquitectónicamente, ¿cuál es la mejor manera de manejar JDBC con múltiples hilos? Tengo muchos hilos que acceden concurrentemente a la base de datos. Con una sola conexión y declaración me sale el siguiente mensaje de error:multiproceso JDBC

org.postgresql.util.PSQLException: Este ResultSet está cerrado.

¿Debo usar conexiones múltiples, declaraciones múltiples o hay un método mejor? Mi pensamiento preliminar fue utilizar una declaración por hilo que garantizara un único conjunto de resultados por declaración.

Respuesta

4

Debe usar una conexión por tarea. Si usa la agrupación de conexiones, no puede usar declaraciones preparadas preparadas por alguna otra conexión. Todos los objetos creados por conexión (ResultSet, PreparedStatements) no son válidos para su uso después de la conexión devuelta al grupo.

lo tanto, es igual

public void getSomeData() { 
    Connection conn = datasource.getConnection(); 
    PreparedStatement st; 
    try { 
    st = conn.prepareStatement(...); 
    st.execute(); 
    } finally { 
    close(st); 
    close(conn); 
    } 
} 

Así que en este caso todos los objetos DAO no tienen conexión, pero objeto DataSource (java.sql.DataSource), que es de hecho la fábrica de conexiones agrupables. Y en cada método, antes que nada tienes que conectarte, hacer todo tu trabajo y cerrar la conexión. Debe devolver la conexión al grupo lo más rápido posible. Después de la conexión devuelta, puede que no se cierre físicamente, sino que se reinicialice (todas las transacciones activas se cierren, todas las variables de sesión se destruyan, etc.)

1

Sí, utilice varias conexiones con un grupo de conexiones. Abra la conexión por el tiempo suficiente para hacer lo que necesita, luego ciérrelo tan pronto como haya terminado. Deje que el grupo de conexiones se ocupe de la administración de conexión "física" para la eficiencia.