Tomcat连接池配置:DataSource类型和"Too many connection"错误

Sef*_*an2 7 java mysql tomcat database-connection connection-pooling

我通过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" />
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

从我需要数据库连接的java类中,我执行以下查找:

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

我的第一个疑问是DataSource类型.是否使用相同javax.sql.DataSourceorg.apache.tomcat.jdbc.pool.DataSource

而且,有时我会收到"Too many connections"错误.我已经阅读了很多有关此问题的stackoverflow问题/答案,但我没有成功地理解问题所在.

我已经关注了tomcat文档,并且我正确地关闭了结果集,语句和连接.

编辑

我的tomcat版本是7.0.26.所以应该有一个bug(参见informatik01用户建议的链接)

use*_*732 6

如果将JDBC资源放在$ CATALINA_HOME/conf/context.xml中,则会为已部署的每个Web应用加载资源.(这可能意味着大量的连接)如果将该资源移动到webapp的META-INF/context.xml,它将仅在部署该特定Web应用程序时加载.http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html

也可能是你有太多的maxActive和maxIdle.


Rav*_*lli 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 秒。

  • 那就更糟了。你想要更多**更少**的连接。所以像 `maxActive="50"` 但绝对不是“无限” (2认同)