Hibernate вызывает слишком много соединений time_wait - PullRequest
1 голос
/ 13 ноября 2009

Я использую Hibernate 3 и столкнулся с проблемой, связанной с закрытием соединений.

Я использую c3p0-0.9.1.2.jar и проверил соединения с сервером базы данных, открытым Hibernate, я обнаружил, что существуют установленные соединения, число которых составляет 5; на некоторых TCP-портах сервера (см. журнал ниже).

Но эти установленные соединения продолжают изменять порты TCP, на которых они установлены, и таким образом освобождают ранее используемые ими порты, переводя эти порты в состояние TIME_WAIT (а не закрывая их).

Это продолжается и делает счет в сотнях; для соединений в состоянии TIME_WAIT.

Я не уверен, что происходит и почему порты переключаются с Установлено на TIME_WAIT, и ни один из предыдущих не закрывается.

Ниже приведен пример, полученный при запуске NETSTAT -ano | find "x.9", где x.9 - IP-адрес сервера базы данных.

TCP     x.124.x.66:4379     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4381     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4382     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4383     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4384     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4385     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4386     x.124.x.9:1433      ESTABLISHED     5916

TCP     x.124.x.66:4387     x.124.x.9:1433      ESTABLISHED     5916

TCP     x.124.x.66:4388     x.124.x.9:1433      ESTABLISHED     5916

TCP     x.124.x.66:4389     x.124.x.9:1433      ESTABLISHED     5916

TCP     x.124.x.66:4390     x.124.x.9:1433      ESTABLISHED     5916

Используемый мной файл Hibernate.properties.

hibernate.c3p0.min_size=5
hibernate.c3p0.timeout=2
hibernate.c3p0.max_size=50
hibernate.c3p0.idle_test_period=10000
hibernate.connection.release_mode=auto

Спасибо за помощь.

1 Ответ

3 голосов
/ 13 ноября 2009

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

С другой стороны, когда клиент подключается к серверу, указанному именем хоста и портом назначения, соединение на стороне клиента будет назначено порту. Причина этого в том, что соединение идентифицируется четырьмя вещами: хост назначения, порт назначения, хост источника, порт источника .

Это именно то, что вы видите в выходных данных netstat: у вас есть 5 установленных соединений, созданных пулом, и несколько соединений, которые вскоре будут закрыты в состоянии TIME_WAIT. Каждый имеет свой собственный порт источника, динамически назначаемый из диапазона. Это совершенно нормально.

...