【问题标题】:Close database connection in connection pool关闭连接池中的数据库连接
【发布时间】:2015-06-27 10:18:32
【问题描述】:

我正在使用 JDBC 连接池与 mysql 服务器建立连接。

下面是我的代码sn-p

  try {
       InitialContext initialContext = new InitialContext();
        Context context = (Context) initialContext.lookup("java:comp/env"); 
        DataSource ds = (DataSource) context.lookup("connpool");
        Connection conn =  ds.getConnection();
        //some query is executed 
    }
    catch(SQLException ex)
   {   } 
   finally {  conn.close(); }

我的疑惑:

我怀疑我什至正在 MySQL 中关闭连接(conn.close()) show processlist 命令它显示连接。

如果我向 servlet 发送更多请求,show processlist 中的连接数也会增加,

此连接何时关闭。

为什么我害怕意味着它达到了最大连接数,它会显示错误。

我的连接池配置是:

          <Resource name="connpool" auth="Container" 
             type="javax.sql.DataSource" 
             maxActive="1" maxIdle="0"
             maxWait="-1"
             username="xxxxx" 
             password="xxxxx"
             driverClassName="com.mysql.jdbc.Driver"
             url="jdbc:mysql://localhost:3306/govsocial"/>

【问题讨论】:

  • 检查数据源的配置。可能它会打开一个新连接,直到达到允许的最大连接数,然后它会开始重用它们。
  • 当您发出conn.close 时,连接池可能不会真正关闭物理 数据库连接,而是将其释放以供另一个getConnection 使用。
  • @LuiggiMendoza 我已设置 maxActive="1" maxIdle="0" maxWait="-1"
  • 你能发布你的连接池的完整配置吗?你用的是什么库?
  • @JohnR 我已经在帖子中添加了资源配置。

标签: java mysql servlets tomcat7 connection-pooling


【解决方案1】:

tomcat documentation 开始,有些初始值与您在资源配置中的设置不一致。

  • minIdle(默认为 10)
  • initialSize(默认为 10)

如果您有look at the code for init() method,则具有上述默认值和您的配置

  • maxActive = "1"
  • maxIdle = "0"

你最终会得到:

  • maxActive = "1"
  • maxIdle = "1"
  • minIdle = "1"
  • initialSize = "1"

这是一个有 1 个连接的池,该池的目的是为传入请求保持一些(取决于配置)连接打开。调用close() 只会将连接从busy 队列传递到idle 队列。

如果你真的想要没有游泳池,你应该尝试明确设置:

  • maxActive = "1"
  • maxIdle = "0"
  • minIdle = "0"
  • initialSize = "0"

请注意,maxWait = -1 表示新连接将等待连接可用 - 没有超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多