(JPA / Toplink) Ошибка сети IOException: Адрес уже используется: подключение - PullRequest
5 голосов
/ 12 апреля 2010

У меня есть проект JPA, который работал. В этом месяце я добавил некоторые данные в свою базу данных. Когда я запускаю обычное задание (которое я запускал в предыдущие месяцы), я получаю эту ошибку:

Исключение [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (сборка b09d-fcs (12.06.2007))): oracle.toplink.essentials.exceptions.DatabaseException Внутреннее исключение: java.sql.SQLException: Сетевая ошибка IOException: Адрес уже используется: подключение Код ошибки: 0

Я проверил свой LocalPersistenceFacade, содержащий большинство методов, которые я вызываю, напечатав счетчик, и я получил точное количество закрытых и открытых соединений там: 457. И тогда моя работа падает. Обычно должно идти до 601, а не до 457.

На стороне базы данных нет информации о возможном сбое. Все кажется правильным, но мой код Java говорит что-то еще.

У кого-нибудь была идея, пожалуйста?

С уважением, Jean

1 Ответ

5 голосов
/ 13 апреля 2010

Насколько я понимаю, вы открываете / закрываете соединение для каждой строки, и проблема, с которой вы сталкиваетесь, выглядит как описанная в на этой странице :

Возможные причины

При запуске большого объема данных через карты, которые имеют несколько функции. Винда не закрывается соединения достаточно быстро, что вызывает исключение сетевого ввода-вывода.

Рекомендации

Измените следующие два значения в Реестр Windows:

Этот изменяет диапазон портов что Windows использует для открытия соединений. По умолчанию это позволяет только до порт 5000. Изменяя это значение, Windows сможет открыть больше порты, прежде чем вернуться к начало. Каждое соединение использует порт, поэтому он начинается в 1025 и идет вверх к этой стоимости. Когда он достигает максимума значение восходит к 1025 и пытается чтобы снова открыть этот порт.

Системный ключ:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
Имя: MaxUserPort Тип: REG_DWORD
Значение: 5000-65534

Это "освободит" закрытые порты Быстрее. По умолчанию Windows оставляет порт в состоянии TIME_WAIT для 240 секунд. Это может вызвать проблемы, если значение MaxPort установлено где новое соединение будет использовать «старый» порт, который не был удален из TIME_WAIT состояние пока. Уменьшением это значение, вы разрешите соединения быть выпущенным быстрее.

Системный ключ:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
Имя значения: TcpTimedWaitDelay Data
Тип: REG_DWORD Значение данных: 30-300

Симптомы и изменения - больше строк - введены идеально совпадают. Однако, хотя предложенная «рекомендация» может решить проблему, моей рекомендацией будет использование пула соединений (используйте автономный пул соединений, например c3p0 или DBCP ). Это позволило бы ИМО решить проблему и , чтобы повысить производительность.

...