Nombre de sockets disponibles pour une connection JDBC sous Windows 2003

Mon équipe a créé un service Windows en Java qui se connecte à un server SQL Server 2005 dans un server Windows 2003, en utilisant du JDBC pur (pas de regroupement de connections) avec le pilote JTDS.

Après un moment, la méthode qui ouvre les connections à la database commence à lever des exceptions avec la trace de stack suivante:

java.net.BindException: Address already in use: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl .java:305) at java.net.PlainSocketImpl.connectToAddress(PlainSoc ketImpl.java:171) at java.net.PlainSocketImpl.connect(PlainSocketImpl.j ava:158) at java.net.Socket.connect(Socket.java:452) at java.net.Socket.connect(Socket.java:402) at java.net.Socket.<init>(Socket.java:309) at java.net.Socket.<init>(Socket.java:124) 

Bien que les programmeurs aient pris soin de fermer les connections quand ils l'ont fait, quelque chose ne va pas.

Pour l'instant, nous avons résolu le problème en passant au protocole Named Pipes (puisque tout est hébergé sur la même machine), mais il s'agit d'une solution temporaire.

J'ai googlé pour le problème et il semble que nous devrions utiliser une bibliothèque de mise en commun de connection telle que c3p0. Est-ce la seule solution au problème?

Puis-je essayer d'augmenter la limite de sockets dans Windows 2003?

Ouvrez-vous / fermez-vous les connections à un rythme très rapide? Lorsqu'une connection TCP est fermée, ils restnt un peu dans l'état TIME_WAIT . Sous Windows, l'heure par défaut est de 240 secondes. Il semble que vous ayez plusieurs connections tcp dans l'état TIME_WAIT.

Vous pouvez vérifier ceci en exécutant netstat. Si vous avez un grand nombre de connections tcp au server de database dans l'état TIME_WAIT, un pool de connections résoudra votre problème.

Vous pouvez essayer d'augmenter la limite de socket et / ou réduire la durée pendant laquelle une connection restra dans l'état TIME_WAIT. Mais cela va modifier le comportement de toutes les connections tcp. Donc, utilisez un pool de connection 🙂 Nous utilisons dbcp comme solution de pool de connection en Java.

On dirait vraiment que les connections ne sont pas fermées. Cela ou vous essayez de réutiliser la connection de façon incorrecte …

Il est fortement recommandé d'utiliser un pool de connections pour diverses raisons de performances. Par exemple, vous n'aurez pas besoin de créer une connection à chaque fois, ce qui est très coûteux. La réutilisation des connections fait toute la différence.

Deuxièmement, voulez-vous vraiment créer votre propre mécanisme de mise en commun? Ce n'est pas aussi simple qu'il y paraît, il y a beaucoup de problèmes de threading idiosyncrasiques. Il est beaucoup plus facile d'utiliser une bibliothèque existante qui a résisté à l'épreuve du time.