7

JNDI リソース経由で tomcat 接続プールを使用しています。

context.xml

<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
          username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
          maxActive="1000" maxIdle="100" maxWait="10000"
          url="jdbc:mysql://localhost:3306/mydatabase" 
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" />

web.xml

<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mydb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

データベース接続が必要な Java クラスから、次のルックアップを行います。

Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/mydb");

私の最初の疑問は DataSource 型です。javax.sql.DataSourceまたはを使用しても同じorg.apache.tomcat.jdbc.pool.DataSourceですか?

さらに、「接続が多すぎます」というエラーが表示されることがあります。これに関する多くのスタックオーバーフローの質問/回答を読みましたが、問題がどこにあるのか理解できません。

私はTomcatのドキュメントに従っており、結果セット、ステートメント、および接続を適切に閉じています。

編集

私のTomcatのバージョンは7.0.26です。したがって、バグがあるはずです(informatik01ユーザーが提案したリンクを参照してください)

4

4 に答える 4

6

JDBC リソースを $CATALINA_HOME/conf/context.xml に配置すると、デプロイしたすべての Web アプリケーションのリソースがロードされます。(これは膨大な数の接続を意味する可能性があります) そのリソースを webapp の META-INF/context.xml に移動すると、その特定の webapp がデプロイされたときにのみ読み込まれます。http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html

また、maxActive と maxIdle が多すぎる可能性もあります。

于 2013-03-06T01:47:47.973 に答える
1

javax.sql.DataSourceはインターフェイスでorg.apache.tomcat.jdbc.pool.DataSourceあり、クラスです。tomcat で直接インスタンス化できるかどうかはわかりませんorg.apache.tomcat.jdbc.pool.DataSource。はいの場合、これらのいずれかを使用できます。

接続関連のエラーが原因である可能性があります

maxActive="1000" maxIdle="100" maxWait="10000"あなたのTomcat設定ファイルで。

maxActive="10" maxIdle="10" maxWait="10"- 10 のアクティブ接続数、10 のアイドル接続数、最大 10 秒の待機時間に設定します。

于 2013-02-07T20:22:21.940 に答える
0

mysql の最大接続数を増やす必要がある場合があります。デフォルトの最大数は 151 です。

于 2013-02-07T21:25:25.687 に答える
0

リソース リークがないことを確認してください: java.sql.Connection が閉じられない例

于 2013-10-15T20:07:08.660 に答える