2009-09-10 4 views
7

-je obtenir l'exception suivante parfois:Java JDBC: Reply.fill()

com.ibm.db2.jcc.b.gm: [jcc] [t4] [2030] [11211] [ 3.50.152] Une erreur de communication s'est produite pendant les opérations sur le socket sous-jacent de la connexion, le flux d'entrée du socket, ou le flux de sortie du socket. Emplacement de l'erreur: Reply.fill(). Message: Réinitialisation de la connexion. ERRORCODE = -4499, SQLSTATE = 08001

Le problème est que, le code s'exécute avec succès pendant un certain temps et puis soudainement je reçois cette exception. Cependant, il fonctionne correctement lorsque je réexécute le code.

Pourriez-vous s'il vous plaît dites-moi ce qui pourrait être faux et de me fournir quelques pointeurs pour résoudre ce problème.

+0

Veuillez également consulter ce lien http://www-01.ibm.com/support/docview.wss?uid=swg21962086 et http://www-01.ibm.com/support/docview.wss?uid = swg21600160 –

Répondre

0

Il semble que votre connexion expire. Je ne suis pas vraiment où le problème est cependant. Ce pourrait être avec la connexion à votre serveur DB. Je suis désolé je ne peux pas vous aider plus, mais j'espère que cela aide.

3

Ceci indique que les ressources JDBC ne sont pas correctement fermées/libérées. Vous devez acquérir et fermer toutes les ressources JDBC dans la portée la plus courte possible, à savoir vous devez les fermer dans l'ordre inverse dans le bloc finally du bloc try du même bloc de méthode que vous les avez acquis. Par exemple.

Connection connection = null; 
Statement statement = null; 
ResultSet resultSet = null; 
try { 
    connection = database.getConnection(); 
    statement = connection.createStatement(); 
    resultSet = statement.executeQuery(SQL); 
    // ... 
} finally { 
    if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} 
    if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
} 

Si vous ne les fermez pas correctement le plus tôt possible, la DB prendra tôt ou tard dans les mains propres et votre application peut se casser tôt ou tard, comme vous vous rencontrez. Pour améliorer les performances de connexion, utilisez un pool de connexions - vous devez toujours les acquérir et les fermer de la même manière que ci-dessus! C'est maintenant juste l'implémentation du pool de connexion qui sous les hottes s'inquiète de en réalité fermant la connexion ou non.

+1

Espérons que le bloc try-with-resources de Java 7 aidera à résoudre ce problème dans le futur. Bien qu'il y ait une partie de moi qui a peur de laisser les développeurs s'en tirer sans nettoyer les ressources. Je crains que cela puisse conduire à un développement bâclé. Et que se passe-t-il si ces développeurs doivent travailler sur du code pré-JRE 7? Juste penser à haute voix en réponse à votre réponse. Mais définitivement ++ sur la réponse. –

+1

@Chris: certainement ARM aidera beaucoup dans la réduction de la norme 'close()' -in-'finally'. Cependant, vous pouvez également opter pour JPA qui à son tour réduit l'ensemble de la plaque JDBC à un oneliner. – BalusC

+1

Intéressant. Connaissez-vous des articles sur JPA vs JDBC pur.Je suppose que je viens de l'expérience où les couches d'abstraction ont parfois rendu notre application pire et plus difficile à déboguer. J'ai trouvé JDBC pur assez simple (au moins en travaillant avec des chaînes SQL pur). Je peux voir où cela fonctionnerait mieux avec les objets. Et il gère la fermeture des ressources pour vous? –

0

Je semble que cela peut être causé par https://www-304.ibm.com/support/docview.wss?uid=swg1IC63952

Au moins pour nous, il est.

Vérifiez votre db2diag.log pour les messages d'erreur ZRC=0x8005006D=-2147155859=SQLE_CA_BUILT "SQLCA has been built and saved in component specific control block." lorsque vous obtenez de telles déconnexions.

Plus tard cette semaine, nous prévoyons de passer à DB2 9.7 FixPack 3a - nous répondrons si cela vous a aidé.

1

nous avons récemment fait face à ce problème, et il était dû à la confusion des clauses AND et avec une clause rownum <. Mettre des accolades aux bons endroits l'a résolu.

+1

ce message shud être un commentaire, pas une réponse – Chani