5

我有一个过去可以工作的 JPA 项目。这个月,我在我的数据库中添加了一些数据。当我运行通常的工作(我曾经在前几个月运行)时,我收到了这个错误:

异常 [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException 内部异常: java.sql.SQLException: 网络错误 IOException :地址已在使用:连接错误代码:0

我通过打印计数器检查了包含我正在调用的大多数方法的 LocalPersistenceFacade,我在那里得到了关闭和打开的连接的确切数量:457。然后我的工作崩溃了。通常,它应该到 601 而不是 457。

在数据库方面,没有与可能的崩溃相关的信息。一切似乎都是正确的,但我的 java 代码说的是别的东西。

请问有人知道吗?

问候,让

4

1 回答 1

6

我的理解是您正在为每一行打开/关闭一个连接,并且您面临的问题类似于本页中描述的问题:

可能的原因

通过具有多种功能的地图运行大量数据时。Windows 关闭连接的速度不够快,这会导致网络 I/O 异常。

建议

在 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 数据
类型:REG_DWORD 值数据:30-300

引入的症状和变化 - 更多行 - 完美匹配。但是,虽然建议的“建议”可能会解决问题,但我的建议是使用连接池(使用独立的连接池,如c3p0DBCP)。这将 IMO 解决问题提高性能。

于 2010-04-12T20:05:05.633 回答