1


0

私のチームは、純粋なJDBC(接続プーリングなし)とJTDSドライバを使用して、Windows 2003 Server内のSQL Server 2005に接続するWindowsサービスをJavaで構築しました。

しばらくすると、データベースへの接続を開くメソッドは、次のスタックトレースで例外の発生を開始します。

java.net.BindException:アドレスはすでに使用されています。接続はjava.net.PlainSocketImpl.socketConnect(ネイティブメソッド)でjava.net.PlainSocketImpl.doConnect(PlainSocketImpl .java:305)でjava.net.PlainSocketImpl.connectToAddress(PlainSoc ketImpl)で.java:171)java.net.PlainSocketImpl.connect(PlainSocketImpl.j ava:158)でjava.net.Socket.connect(Socket.java:452)でjava.net.Socket.connect(Socket.java:402) java.net.Socketで(Socket.java:309)java.net.Socketで(Socket.java:124)

プログラマーは接続が完了したときに接続を閉じるように注意を払っていましたが、うまくいかないことがあります。

当面は、名前付きパイププロトコルへの切り替えの問題は解決しました(すべてが同じマシンでホストされているため)が、これは一時的な解決策です。

私はその問題についてグーグルしました、そしてそれは我々がc3p0のような何らかの接続プールライブラリを使うべきであるようです。 これが問題の唯一の解決策ですか?

Windows 2003でソケットの上限を引き上げようとすることはできますか?

2 Answer


3


あなたは非常に速い速度で接続を開閉していますか? TCP接続が閉じられるとき、それらは TIME_WAIT状態にある間、しばらくハングします。 Windowsでは、デフォルトの存在時間は240秒です。 TIME_WAIT状態ではかなりの数のtcp接続があるかもしれません。

これを確認するには、netstatを実行します。 TIME_WAIT状態のデータベースサーバーへのTCP接続が大量にある場合は、接続プールを使用して問題を解決できます。

ソケットの上限を上げたり、接続がTIME_WAIT状態に留まる時間を減らしたりすることができます。 しかし、これはすべてのTCP接続の動作を変更します。 そのため、接続プールを使用します。私たちは、Javaの接続プールソリューションとして dbcpを使用します。


1


あなたはつながりが閉じられていないようです。 それとも、あなたは間違って接続を再利用しようとしています…​

さまざまなパフォーマンス上の理由から、接続プールを使用することを強くお勧めします。 たとえば、毎回接続を作成する必要はありません。これは非常にコストがかかります。 接続を再利用すると、違いが生まれます。

第二に、あなたは本当にあなた自身のプール機構を作りたいですか? それは見かけほど単純ではありません、特異なスレッド問題がたくさんあります。 時の試練に耐えた既存のライブラリを使う方がはるかに簡単です。