(JPA/Toplink) Ошибка сети IOException: Адрес уже используется: подключение
У меня есть проект 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 говорит что-то еще.
У кого-нибудь была идея, пожалуйста?
С уважением, Жан
1 ответ
Насколько я понимаю, вы открываете / закрываете соединение для каждой строки, и проблема, с которой вы сталкиваетесь, выглядит так, как описано на этой странице:
Возможные причины
При запуске большого объема данных через карты, которые имеют несколько функций. Windows не закрывает соединения достаточно быстро, что вызывает исключение сетевого ввода-вывода.
рекомендации
Измените следующие два значения в реестре 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). Это позволило бы ИМО решить проблему и повысить производительность.