1

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

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

    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接続の動作が変更されます。したがって、接続プールを使用します: )Javaの接続プールソリューションとしてdbcpを使用します。

于 2009-02-03T18:10:27.883 に答える
1

接続が閉じられていないようです。それか、接続を間違って再利用しようとしています...

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

次に、独自のプーリング メカニズムを本当に作成しますか? 見た目ほど単純ではありません。多くの特異なスレッドの問題があります。時の試練に耐えた既存のライブラリをそのまま使用する方がはるかに簡単です。

于 2009-02-03T17:38:00.570 に答える