2009-07-25 7 views
5

Quelle est la meilleure façon de gérer JDBC avec plusieurs threads? J'ai plusieurs threads accédant simultanément à la base de données. Avec une seule connexion et instruction, le message d'erreur suivant s'affiche:JDBC multithread

org.postgresql.util.PSQLException: ce ResultSet est fermé.

Dois-je utiliser plusieurs connexions, plusieurs instructions ou existe-t-il une meilleure méthode? Ma pensée préliminaire était d'utiliser une déclaration par thread qui garantirait un ensemble de résultats unique par déclaration.

Répondre

4

Vous devez utiliser une connexion par tâche. Si vous utilisez le regroupement de connexions, vous ne pouvez pas utiliser les instructions préparées préparées par une autre connexion. Tous les objets créés par la connexion (ResultSet, PreparedStatements) ne sont pas valides après la connexion au pool.

Ainsi, il est aussi bien

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

Donc dans ce cas tous vos objets DAO prennent pas la connexion, mais l'objet DataSource (java.sql.DataSource) qui est l'usine de connexion piscinable en effet. Et dans chaque méthode, vous devez d'abord vous connecter, faire tout votre travail et établir une connexion étroite. Vous devriez retourner la connexion à la piscine aussi vite que possible. Une fois la connexion renvoyée, elle peut ne pas être physiquement fermée, mais réinitialisée (toutes les transactions actives sont fermées, toutes les variables de session ont été détruites, etc.)

1

Oui, utilisez plusieurs connexions avec un pool de connexions. Ouvrez la connexion juste assez longtemps pour faire ce dont vous avez besoin, puis fermez-la dès que vous avez terminé. Laissez le pool de connexion s'occuper de la gestion de la connexion "physique" pour plus d'efficacité.