1

我的团队使用带有 JTDS 驱动程序的纯 JDBC(无连接池)用 Java 构建了一个连接到 Windows 2003 Server 中的 SQL Server 2005 的 Windows 服务。

一段时间后,打开与数据库的连接的方法开始引发异常,并带有以下堆栈跟踪:

    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) 

尽管程序员在完成后很小心地关闭了连接,但有些事情并不顺利。

目前,我们解决了切换到命名管道协议的问题(因为所有都托管在同一台机器上),但这是一个临时解决方案。

我已经用谷歌搜索了这个问题,似乎我们应该使用一些连接池库,比如 c3p0。这是解决问题的唯一方法吗?

我可以尝试提高 Windows 2003 中的套接字限制吗?

4

2 回答 2

3

您是否以非常快的速度打开/关闭连接?当 TCP 连接关闭时,它们会在TIME_WAIT状态下徘徊一会儿。在 Windows 上,它们存在的默认时间是 240 秒。听起来您可能有很多处于 TIME_WAIT 状态的 tcp 连接。

您可以通过运行 netstat 来检查这一点。如果您在 TIME_WAIT 状态下与数据库服务器有大量 tcp 连接,则连接池将解决您的问题。

您可以尝试提高套接字限制,和/或降低连接保持在 TIME_WAIT 状态的时间。但这会改变所有 tcp 连接的行为。所以使用连接池 :) 我们使用dbcp作为 Java 中的连接池解决方案。

于 2009-02-03T18:10:27.883 回答
1

看起来您的连接确实没有关闭。那或者您正在尝试错误地重新使用连接...

出于各种性能原因,强烈建议使用连接池。例如,您不需要每次都创建一个连接,这非常昂贵。重复使用连接会带来不同的世界。

其次,你真的要创建自己的池化机制吗?它并不像看起来那么简单,有很多特殊的线程问题。仅使用经受住时间考验的现有库要容易得多。

于 2009-02-03T17:38:00.570 回答