ある日、サーバー上のWebページが開けなくなり、以下のエラーが頻繁に報告されるようになりました。
2007-3-18 1:08:26 org.apache.tomcat.util.threads.ThreadPool logFull
重大: すべてのスレッド (150) が現在ビジー状態で、待機中です。maxThreads (150) を増やすか、サーブレットのステータスを確認してください。
私が正しいと思う答えは次のとおりです。
1. リソースの一部が解放されておらず、バックログのために停止していると思います。
2. 接続プールの問題
3. これは、サーバー側でリクエストに応答するスレッドの処理時間が長いことが原因であると考えられます
。
当時 Web サイトを使用しているのは 2 人だけだったので、150 の同時スレッドをオンラインにすることは不可能でした。したがって、データベースの問題ではないはずです。
エラー プロンプトから判断すると、接続プールの不正な使用が原因であるか、接続プールがまったく設定されていないことが原因であると考えられます。データベースに接続する部分は、次のように Spring のデータソース JDBC を使用して接続されます。
<豆>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- MySQL 用ドライバー -->
<property name="driverClassName"><value>org.gjt.mm.mysql.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8</value></property>
<property name="username"><value>テスト</value></property>
<property name="password"><value>テスト</value></property>
、
これらの接続の管理を担当する Spring の DriverManagerDataSource で発生するはずです。
DriverManagerDataSource の説明は次のとおりです。
javax.sql
の DriverManagerDataSource
Interface DataSource を介してプレーンな古い JDBC ドライバーを構成する SmartDataSource の実装
Bean のプロパティを取得し、毎回新しい Connection を返します。J2EE
コンテナ外のテスト環境またはスタンドアロン環境に役立ちます。
それぞれの ApplicationContext 内の DataSource Bean として、またはそれと組み合わせて
単純な JNDI 環境では、プールを前提とした Connection.close() 呼び出しが行われます。
接続を閉じると、DataSource 対応の永続化コードがすべて機能するようになります。J2EE
コンテナーでは、 によって提供される JNDI DataSource を使用することをお勧めします。
このような DataSource は、DataSource Bean としてコンテナにエクスポートできます。
JndiObjectFactoryBean 経由の ApplicationContext、シームレスな切り替えを実現
このクラスのようなローカル DataSource Bean。J2EE
コンテナの外部に「実際の」接続プールが必要な場合は、次のことを検討してください。
Apache の Jakarta Commons DBCP は完全な接続プールです。
Bean は、このクラスと同じ基本プロパティに加えて特定の設定をサポートします。
変更するだけで、このクラスのインスタンスの代わりとして使用できます。
Bean定義のクラス名
「org.apache.commons.dbcp.BasicDataSource」
-------------------------------------- --------- ----------
Jakarta プロジェクトの多くは、リレーショナル データベースとの対話をサポートしています。
ユーザーごとに新しい接続を行うと時間がかかる場合があります (複数の接続が必要になることがよくあります)
クロック時間の秒)、データベース トランザクションを実行するために、
ユーザーごとに接続を開くのは数ミリ秒かかります。
同時に利用できるユーザーの数が制限される、公的にホストされているインターネット アプリケーション
したがって、開発者は多くの場合、オープンな「プール」を共有したいと考えます。
アプリケーションの現在のユーザー全員間の接続数。
特定の時点で実際にリクエストを実行するのは通常、非常に小さいです
アクティブ ユーザーの総数に対するパーセンテージ。リクエストの処理中は
データベース接続が必要になるのはアプリケーション自体だけです。
DBMS にログインし、ユーザー アカウントの問題を内部で処理します。
すでに利用可能なデータベース接続プールがいくつかあります。
このコモンズ パッケージは、ジャカルタの製品やその他の場所での機会を提供します。
効率的な環境を構築し維持するために必要な取り組みを調整し、
ASF ライセンスに基づく機能豊富なパッケージ
commons-dbcp パッケージは、commons-pool パッケージのコードに依存して提供されます。
アプリケーションは、commons-dbcp コンポーネントを直接または既存のコンポーネントを通じて使用できます
。
コンテナ/サポート フレームワークのインターフェイス。たとえば、Tomcat。
サーブレット コンテナは、DBCP データソースを JNDI データソースとして提示します (Java.
Apache Mail Enterprise Server) は、DBCP を Avalon フレームワークに統合しました。
Avalon スタイルのデータソースは、DBCP 実装をラップすることによって作成されます。
DBCP のプーリング ロジックと Avalon の excalibur コードにある構成は次のとおりです。
説明を読むと、接続を確立するときに、接続が存在する限り DriverManagerDataSource は新しい接続を作成し、接続プールはまったく存在しません
。
次のオープンソース接続プールに切り替えることをお勧めします。
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<プロパティ名="ドライバークラス名">
<値>org.hsqldb.jdbcドライバー</値>
</プロパティ>
<プロパティ名="url">
<value>jdbc:hsqldb:hsql://localhost:9001</value>
</プロパティ>
<プロパティ名="ユーザー名">
<値>さ</値>
</プロパティ>
<プロパティ名="パスワード">
<値></値>
</プロパティ>
</bean>
テストに合格し、問題が解決されました。答えを見つけるための検索エンジンがなければ、問題はすぐには解決されません。