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.DataSourceor是一样的org.apache.tomcat.jdbc.pool.DataSource吗?

此外,有时我会收到“连接太多”错误。我已经阅读了许多关于此的 stackoverflow 问题/答案,但我没有成功理解问题可能出在哪里。

我遵循了 tomcat 文档,并正确关闭了结果集、语句和连接。

编辑

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

4

4 回答 4

6

如果您将 JDBC 资源放在 $CATALINA_HOME/conf/context.xml 中,它会为您部署的每个 webapp 加载资源。(这可能意味着大量的连接)如果您将该资源移动到您的 web 应用程序的 META-INF/context.xml,它只会在部署该特定 web 应用程序时加载。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

确保没有资源泄漏:示例 java.sql.Connection not getting closed

于 2013-10-15T20:07:08.660 回答
0

You may need to increase the max connection on mysql , the default max is 151.

于 2013-02-07T21:25:25.687 回答