Tomcat连接池中的基本问题

时间:2012-04-03 06:22:37

标签: java java-ee tomcat web-applications connection-pooling

我在Web应用程序中使用Tomcat 7连接池(作为server.xml和context.xml中的T​​omcat资源)并且它可以正常工作。
我的问题是:是否有可能“告诉”/“强制”tomcat在创建后配置连接池?

我问的原因如下:
我正在使用H2并在关机时遇到一些“赛车”问题 只要有连接打开,H2保持打开状态,但Tomcat不会释放连接池,因此连接保持打开状态。结果我在关机时遇到了各种各样的问题。

我发现我可以发出一个SQL SHUTDOWN命令来关闭H2,但我想探索我案例的所有替代方案。

那么可以“告诉”/“强制”tomcat配置连接池(至少在关机时)吗?

4 个答案:

答案 0 :(得分:1)

我认为您可以尝试调试日志并检查其连接问题是否未由应用程序发布,或者是否与server.xml中的数据源配置参数等相关。

主要应该是应用程序未释放连接的情况。

答案 1 :(得分:1)

如何编写自定义ServletContextListener,然后在销毁上下文时关闭池。这是一篇关于用于创建关闭钩子的ServletContextListener的文章:

shutdown hook for java web application

上下文侦听器的API看起来非常简单:

http://docs.oracle.com/javaee/5/api/javax/servlet/ServletContextListener.html

答案 2 :(得分:0)

请参阅我的回答:Context specific JNDI parameters problem in tomcat 6。你可以用jndi资源做很多事情。

<Resource name="jdbc/NAME" auth="Container" type="javax.sql.DataSource"
               maxActive="100" minIdle="10" maxWait="10000" removeAbandoned="true"
               removeAbandonedTimeout="60" logAbandoned="true"
               testWhileIdle="true" testOnBorrow="true" testOnReturn="false"
               timeBetweenEvictionRunsMillis="5000"
               validationQuery="SELECT 1" initialSize="10"
               username="usrname" password="password"   
               driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/databb?autoReconnect=true"/>

答案 3 :(得分:0)

如文档http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Resource_Definitions中所述,可以设置容器数据源的closeMethod。我不确定'处理'连接池,但我认为值得一试。

  

在单个资源上调用的零参数方法的名称   它不再是必需的。这是为了加快清理速度   否则将作为垃圾收集的一部分发生的资源。   如果singleton属性为false,则忽略此属性。如果不   具体化,没有定义默认值,也不会调用close方法。

此外,您可以通过编程方式部署DataSource并在ServletContextListener中启动/停止它,例如dbcp(抱歉,它来自我的单元测试,但很容易重写):

import org.apache.commons.dbcp.BasicDataSource;

static BasicDataSource bds = new BasicDataSource();

@BeforeClass
public void setUp() throws Exception {
    bds.setDefaultAutoCommit(false);
    bds.setDriverClassName("org.h2.Driver");
    bds.setInitialSize(0);
    bds.setMaxActive(2);
    bds.setMaxWait(10000);
    bds.setPassword(null);
    bds.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
    bds.setUsername("sa");
    bds.setValidationQuery("select 1 as test");
}

@AfterClass
public void tearDown() throws Exception {
    bds.close();
}