2009-02-03 9 views
1

Mon équipe a créé un service Windows en Java qui se connecte à SQL Server 2005 sur un serveur Windows 2003, en utilisant JDBC pur (pas de pool de connexions) avec le pilote JTDS.Nombre de sockets disponibles pour une connexion JDBC sous Windows 2003

Après un certain temps, la méthode qui ouvre les connexions à la base de données soulevons exceptions avec la trace de pile 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 ont pris soin de fermer les connexions quand ils ont été faits, quelque chose ne va pas droite.

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

J'ai recherché le problème et il semble que nous devrions utiliser une bibliothèque de regroupement de connexions telle que c3p0. Est-ce la seule solution au problème? Pourrais-je essayer d'augmenter la limite de sockets dans Windows 2003?

Répondre

3

Etes-vous en train d'ouvrir/fermer des connexions très rapidement? Lorsqu'une connexion TCP est fermée, ils restent pendant un petit moment dans l'état TIME_WAIT. Sous Windows, l'heure par défaut est de 240 secondes. Il semble que vous ayez plusieurs connexions tcp dans l'état TIME_WAIT.

Vous pouvez vérifier cela en exécutant netstat. Si vous avez un grand nombre de connexions tcp au serveur de base de données dans l'état TIME_WAIT, un pool de connexions résoudra votre problème.

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

1

Il semble vraiment que vos connexions ne sont pas fermées. Cela ou vous essayez de réutiliser la connexion de manière incorrecte ...

Il est fortement recommandé d'utiliser un pool de connexion pour diverses raisons de performances. Par exemple, vous n'aurez pas besoin de créer une connexion à chaque fois, ce qui est très coûteux. La réutilisation des connexions 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 temps.