Tomcat と MySQL の間の接続プールの問題の詳細な説明について 1 日研究してきました (オリジナル) が
、最終的に皆さんのお役に立てれば幸いです。まず最初に注意してください。ここでは、Tomcat 5.5 バージョンで発生する問題について具体的に説明します。なぜこのバージョンが特に特殊なのかについては、後ほど説明します。
質問 1: 接続 URL 'null' に対してクラス '' の JDBC ドライバーを作成できません
答え:
【原因分析】
多くの友人は、$Tomcat/conf/server.xml、$Tomcat/conf/context.xml、さらには WEB-INF/web.xml を設定した後に接続プールを呼び出すときに上記のエラーが発生することを発見しました。エラーの原因を分析すると、一般的にはデータ ソースをバインドしていないことが原因です (エラーの実際の原因は、driverClassName と url の設定が空であるためですが、この場所の設定を忘れてはいけないので、必ず行う必要があります)接続せずに設定を完了しました!)。通常、データ ソースを構成するには 2 つの方法があります ($Tomcat/conf/context.xml の設定方法だけではありません)。1 つは、$Tomcat/conf/server.xml の </GlobalNamingResources> の前に次のコードを追加する方法です。
設定方法1:
<リソース
name="jdbc/test" //データソース名
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" //これは先ほど述べた driverClassName の設定です
password="admin" //データベースのパスワード
maxIdle="2"
maxWait="5000"
username="root" //データベースのユーザー名
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //データベース URL、これは先ほど述べた URL です
maxActive="4"/>
コメントがある場合を除き、すべてのパラメータは接続数、アイドル状態、アクティビティ状態の設定に使用されます。学習実験を行うだけの場合は、変更する必要はありません。このメソッドの効果は、Tomcat グラフィカル インターフェイスで操作を構成するのと同じです。
別の方法は、$Tomcat/conf/server.xml の <Context ...></Context> に次のコードを追加することです。
設定方法 2:
<リソース名="jdbc/test" auth="コンテナ" タイプ="javax.sql.DataSource"/>
<ResourceParams name="jdbc/test">
<パラメータ>
<名前>工場</名前>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</パラメータ>
<パラメータ>
<名前>ユーザー名</名前>
<値>ルート</値>
</パラメータ>
<パラメータ>
<名前>パスワード</名前>
<値>管理者</値>
</パラメータ>
<パラメータ>
<name>ドライバークラス名</name>
<値>com.mysql.jdbc.Driver</値>
</パラメータ>
<パラメータ>
<名前>URL</名前>
<value>jdbc:mysql://localhost:3306/test?autoReconnect=true</value>
</パラメータ>
<パラメータ>
<name>初期サイズ</name>
<値>20</値>
</パラメータ>
<パラメータ>
<name>maxActive</name>
<値>30</値>
</パラメータ>
<パラメータ>
<name>maxWait</name>
<値>10000</値>
</パラメータ>
</ResourceParams>
この設定の通常の目的は、データ ソースを別のマッピング ディレクトリに実装できるようにすることです。つまり、通常、このコードは <Context docBase="特定のディレクトリ (D:webappsmyjsp など) に表示されます。 " path= "アクセス名 (/myjsp など)" reloadable="true"></Context> により、 http://localhost:8080/myjsp/にアクセスして D:webappsmyjsp 内のファイルにアクセスできるようになります。 XXX.jsp次に、jsp ページはデータ ソースを取得するか、データ ソースを取得するための他の操作を実行します。
問題は、どの方法を使用しても誰も接続できないことです。 ResourceLink を使用しない場合、Bean は設定したコードを見つけることができません。どうすれば driverClassName と URL を見つけることができますか?実際、パラメータ設定はどれも見つかりません。
[解決]
理由がわかれば解決も容易になります。どの方法を使用しても構いません。
解決策 1:
ResourceLink をマッピングディレクトリに実装する場合は、<Context...></Context> の途中に <ResourceLink global="データソース名" name="マップ名" type="javax.sql.DataSource" を追加します。 "/> では、コードの関係が理解できない場合は、<Context...> の後に厳密に記述する必要があることに注意してください。
解決策 2:
これをグローバルにしてすべてのマッピング ディレクトリで使用できるようにしたい場合は、$Tomcat/conf/context.xml に記述するだけで問題ありません。
一般に、「データ ソース名」と「マップされた名前」はすべて同じに設定します。たとえば、次のように設定します。 <ResourceLink global="jdbc/test" name="jdbc/test" type="javax. sql.DataSource" "/>。
なお、Tomcat5.5 では、上記 2 番目の方法を設定すると、ResourceLink を追加しても正常に動作しないという問題が発生するので注意してください。
質問 2: javax.naming.NameNotFoundException: 名前 XXX はこのコンテキストにバインドされていません
答え:
【原因分析】
Tomcat5.5 では、<Context...><Context> でのデータ ソースの設定が正しく機能しません。私の英語レベルは高くありませんが、理解できます。これは、上位バージョン (Tomcat と dbcp である必要があります) では、factory の値が org.apache.commons.dbcp.BasicDataSourceFactory から org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory に変更されたためであると彼は言いました。しかし、試してみましたが問題は解決しませんでした。そして、Tomcat5.5 の標準バージョンには、$Tomcatcommonlib にある dbcp が付属していることがわかりました。他のネチズンの説明を読んだところ、2番目の設定方法は不可能だと言われました。これは、2番目の設定方法が以前のバージョンにのみ適用できることを示しています。現在のバージョンでどの部分を変更すればよいかわかりませんが、エラーの理由は、それを一緒に設定したいのですが、サーバーが見つからないためです。 「データソース名」に対応するデータソース。
[解決]
理由が分かれば解決できますが、<GlobalNamingResources>でデータソースが宣言されている場合にのみ機能するようです。したがって、誰もが最初の設定方法に従って Tomcat5.5 をセットアップできます (これが、特に Tomcat5.5 について説明する理由です)。
質問 3: JDBC ドライバー クラス 'com.mysql.jdbc.Driver' をロードできません
答え:
【原因分析】
mysql に限らず、他のデータベースでも、それが見つからない限り、「JDBC ドライバー クラスをロードできません」というエラーがスローされます。では、なぜデータベース ドライバー クラスが見つからないのでしょうか。どうやって見つけますか?実はとてもシンプルなのです。
[解決]
jdbc を $Tomcatcommonlib にコピーするだけです。
質問 4: 接続を取得できない、プールが枯渇している
【原因分析】
これは非常に単純です。接続が確立できず、接続プールがオーバーフローします。これは、接続リソースが時間内にリサイクルされなかったために無駄になっていることを意味します。
[解決]
close() メソッドを使用して、ResultSet、Statement、Connection を解放します。具体的なステートメントについては、最後に記述することをお勧めします。
概要: したがって、Tomcat5.5 を使用してデータ ソース接続プールを確立する場合、必要な手順は 3 つだけです。
まず、データ ソースを設定します。手動で行う場合は、$Tomcat/conf/server.xml の </GlobalNamingResources> の前に次のコードを追加します
。
name="jdbc/test" //データソース名
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" //これは先ほど述べた driverClassName の設定です
password="admin" //データベースのパスワード
maxIdle="2"
maxWait="5000"
username="root" //データベースのユーザー名
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //データベース URL、これは先ほど述べた URL です
maxActive="4"/>
コメント パラメータを必ず独自のものに変更してください。
2 番目: リソース接続を設定します。別個にマッピングする場合は、$Tomcat/conf/context.xml に <ResourceLink global="データソース名" name="マップ名" type="javax.sql.DataSource"/> を記述することをお勧めします。ディレクトリの実装は、$Tomcat/conf/server.xml でマッピングする必要があるディレクトリの <Context...> の後に記述されます。
3 番目: JDBC を $Tomcatcommonlib にコピーします。
また、この問題は比較的単純ですが、DataSource ds=(DataSource)envCtx.lookup(" という点に注意してください)。参照データ ソース "); ステートメント内の「参照されるデータ ソース」は、「マップされた名前」のみであり、「データ ソース名」ではないため、便宜上、2 つの名前を同じに設定することをお勧めします。また、アイドル状態のリソースを時間内に解放することに特に注意してください。そうしないと、接続プールがオーバーフローしてしまいます。
以上が私が今日調べた結果の一部であり、この記事が皆さんのお役に立てば幸いです。ご質問がございましたら、私のメールアドレス: [email protected] (ネオンを見るのが好きな人) までご連絡ください。この記事は neonlight.bokee.com (CSDN_MathMagician) のオリジナルであり、複製することはできません。 2006 年 8 月 11 日
http://blog.csdn.net/mathmagician/archive/2007/03/01/1518689.aspx