Количество сокетов, доступных для соединения JDBC в Windows 2003 - PullRequest
1 голос
/ 03 февраля 2009

Моя команда создала Службу Windows в Java, которая подключается к SQL Server 2005 в Windows 2003 Server, используя чистый JDBC (без объединения пулов) с драйвером JTDS.

Через некоторое время метод, который открывает соединения с базой данных, начинает вызывать исключения со следующей трассировкой стека:

    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) 

Хотя программисты старались закрыть соединения, когда они были сделаны, что-то идет не так.

В настоящее время мы решили проблему с переключением на протокол Named Pipes (поскольку все размещено на одном компьютере), но это временное решение.

Я погуглил проблему, и, похоже, нам следует использовать некоторую библиотеку пулов соединений, такую ​​как c3p0. Это единственное решение проблемы?

Могу ли я попытаться поднять лимит сокетов в Windows 2003?

Ответы [ 2 ]

3 голосов
/ 03 февраля 2009

Вы открываете / закрываете соединения с очень высокой скоростью? Когда TCP-соединение закрыто, они ненадолго задерживаются в состоянии TIME_WAIT . В Windows время по умолчанию составляет 240 секунд. Похоже, у вас может быть довольно много tcp-соединений в состоянии TIME_WAIT.

Вы можете проверить это, запустив netstat. Если у вас огромное количество tcp-соединений с сервером базы данных в состоянии TIME_WAIT, пул соединений решит вашу проблему.

Вы можете попытаться увеличить лимит сокетов и / или уменьшить время, в течение которого соединение будет находиться в состоянии TIME_WAIT. Но это изменит поведение всех соединений TCP. Так что используйте пул соединений :) Мы используем dbcp в качестве нашего решения для пула соединений в Java.

1 голос
/ 03 февраля 2009

Похоже, что ваши соединения не закрываются. Это или вы пытаетесь повторно использовать соединение неправильно ...

Настоятельно рекомендуется использовать пул подключений по разным причинам производительности. Например, вам не нужно каждый раз создавать соединение, что очень дорого. Повторное использование соединений делает мир различий.

Во-вторых, вы действительно хотите создать свой собственный механизм объединения? Это не так просто, как кажется, есть много специфических проблем с потоками. Гораздо проще просто использовать существующую библиотеку, которая выдержала испытание временем.

...