2010-07-01 15 views
1

Je reçois l'exception MaxOpenPreparedStatement dans mon programme. Je peux surveiller le nombre d'objets dans GenericObjectPool avec les fonctions getNumActive()/getNumIdle(). Comment puis-je obtenir la connexion & pools d'instructions préparées à partir de l'objet org.apache.commons.dbcp.BasicDataSource? Mercidbcp: nombre d'instructions préparées ouvertes

Répondre

0

BasicDataSource de DBCP expose la valeur maxOpenPreparedStatements avec laquelle la source de données est configurée.

La présence de cette exception semble indiquer que vous ouvrez trop de déclarations et non les fermer cependant:

Depuis une connexion utilise généralement une ou deux déclarations à un moment, cela est surtout utilisé pour aider à détecter les fuites de ressources.

+0

C'est une valeur de configuration, pas de courant statique – dbf

2

Je ne suis pas sûr de la réponse sur la réelle question, mais le montant maximum admissible de PreparedStatements ouvert est généralement assez élevé. Donc, je soupçonne fortement que le problème technique vous obligeant à poser cette question est que le code JDBC ne ferme pas correctement toutes les déclarations ouvertes dans le bloc finally selon l'idiome JDBC suivant:

Connection connection = null; 
PreparedStatement preparedStatement = null; 
ResultSet resultSet = null; 
// ... 

try { 
    connection = database.getConnection(); 
    preparedStatement = connection.prepareStatement(SQL_STRING); 
    resultSet = preparedStatement.executeQuery(); 
    // ... 
} finally { 
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {} 
    if (preparedStatement != null) try { preparedStatement.close(); } catch (SQLException ignore) {} 
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {} 
} 
0

Vous pourriez être en mesure de mettre la main sur les composants internes de DBCP en sous-classant BasicDataSource, puis en remplaçant createPoolableConnectionFactory et en remplaçant la fabrique de pool d'instructions par celle que vous créez vous-même (et pouvez donc suivre). Comme avec les autres réponses ici, cela semble indiquer que les instructions préparées sont laissées ouvertes - dans ce cas, vous aurez le même problème même si vous désactivez la mise en pool des instructions préparées (ou arrêtez d'utiliser un pool de connexions).), ce qui pourrait rendre le problème original beaucoup plus facile à déboguer.