【问题标题】:Monitoring JDBC connection pools监控 JDBC 连接池
【发布时间】:2014-07-25 03:15:26
【问题描述】:

我正在通过 JDBC 驱动程序和 Tomcat 配置连接我的 Java 应用程序。我使用this 类来定义我的配置。但有时,我会遇到以下异常:

  • com.mysql.jdbc.exceptions.MySQLTimeoutException: 由于超时或客户端请求,语句被取消
  • java.sql.SQLException: 查询执行被中断
  • java.sql.BatchUpdateException: 由于超时或客户端请求,语句被取消

但是数据库负载不大,所以我认为问题出在我的配置上。以下是我的一些配置:

  • maxActive = 100
  • minIdle = 10
  • initialSize = 10
  • maxWait = 10000
  • maxIdle = 15

这些适用于一些负载较重的系统。所以我需要随时观察我的池大小是否足够以及其他可用连接数等。有什么好的方法可以监控连接池内部吗?

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

    对于超时异常,请考虑以下伪代码:

    if(!connection.isValid())
      connection = getNewConnection();
    resultSet rs = connection.execute(qry);
    

    在执行查询之前基本上检查你的连接是否超时。

    如果您的查询被中断,除了回滚事务并重试之外,您无能为力。

    【讨论】:

    • 在我从连接池中获取连接之前,连接是否可能超时?
    • 我相信这是可能的。如果您使用的是 c3p0 连接池,则可以使用属性 idleConnectionTestPeriod 和 preferredTestQuery 来确保您的连接始终处于活动状态。
    【解决方案2】:

    启用 JMX 和 tomcat 会将您的数据源注册到它的 mbean 服务器。然后您可以使用 jconsole 查看连接池详细信息。

    【讨论】:

    • 其实我没有使用Tomcat,只是在Tomcat类上进行了配置。因为没有tomcat文件夹,所以无法在tomcat上启用jmx。那么这仍然有效吗?
    • 另外,我的应用程序位于远程 Linux 服务器中,jconsole 显然无法连接到非 JRMP 服务器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2016-07-06
    相关资源
    最近更新 更多