当前位置: 首页 > 知识库问答 >
问题:

如何调试/记录Tomcat JDBC连接池的连接?

宋昊然
2023-03-14
    null

任何想法都将受到赞赏。

共有1个答案

钱旻
2023-03-14

经过大量的研究,我能够找到3种方法来记录和监视数据库连接池。

https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html

>

  • 使用Spring Boot属性进行监视。

    这些属性(以及更多的属性)没有被记录下来。详情请参阅以下github发行版。https://github.com/spring-projects/spring-boot/issues/1829

    #Maximum no.of active connections
    spring.datasource.max-active=10
    
    #Log the stack trace of abandoned connection
    spring.datasource.log-abandoned=true
    
    #Remove abandoned connection,So, new connection will be created and made available to threads which are waiting for DB connection
    spring.datasource.remove-abandoned=true
    
    #If any connection is not used for 10 seconds, consider that connection as "abandoned"
    spring.datasource.remove-abandoned-timeout=10 
    
    #Number of ms to wait before throwing an exception if no connection is available.
    spring.datasource.max-wait=1000
    

    此列表包含更多仅与datasource相关的属性。(摘自上面的链接)

    spring.datasource.abandon-when-percentage-full
    spring.datasource.access-to-underlying-connection-allowed
    spring.datasource.alternate-username-allowed
    spring.datasource.auto-commit
    spring.datasource.catalog
    spring.datasource.commit-on-return
    spring.datasource.connection-customizer
    spring.datasource.connection-customizer-class-name
    spring.datasource.connection-init-sql
    spring.datasource.connection-init-sqls
    spring.datasource.connection-properties
    spring.datasource.connection-test-query
    spring.datasource.connection-timeout
    spring.datasource.data-source
    spring.datasource.data-source-class-name
    spring.datasource.data-source-j-n-d-i
    spring.datasource.data-source-properties
    spring.datasource.db-properties
    spring.datasource.default-auto-commit
    spring.datasource.default-catalog
    spring.datasource.default-read-only
    spring.datasource.default-transaction-isolation
    spring.datasource.driver-class-loader
    spring.datasource.fair-queue
    spring.datasource.idle-timeout
    spring.datasource.ignore-exception-on-pre-load
    spring.datasource.init-s-q-l
    spring.datasource.initialization-fail-fast
    spring.datasource.isolate-internal-queries
    spring.datasource.jdbc-interceptors
    spring.datasource.jdbc-url
    spring.datasource.jdbc4-connection-test
    spring.datasource.leak-detection-threshold
    spring.datasource.log-abandoned
    spring.datasource.log-validation-errors
    spring.datasource.log-writer
    spring.datasource.login-timeout
    spring.datasource.max-age
    spring.datasource.max-lifetime
    spring.datasource.max-open-prepared-statements
    spring.datasource.maximum-pool-size
    spring.datasource.metrics-tracker-class-name
    spring.datasource.minimum-idle
    spring.datasource.num-tests-per-eviction-run
    spring.datasource.pool-name
    spring.datasource.pool-prepared-statements
    spring.datasource.pool-properties
    spring.datasource.propagate-interrupt-state
    spring.datasource.read-only
    spring.datasource.record-metrics
    spring.datasource.register-mbeans
    spring.datasource.remove-abandoned
    spring.datasource.remove-abandoned-timeout
    spring.datasource.rollback-on-return
    spring.datasource.suspect-timeout
    spring.datasource.test-on-connect
    spring.datasource.thread-factory
    spring.datasource.transaction-isolation
    spring.datasource.use-disposable-connection-facade
    spring.datasource.use-equals
    spring.datasource.use-lock
    spring.datasource.validation-interval
    spring.datasource.validation-query-timeout
    spring.datasource.validator
    spring.datasource.validator-class-name
    spring.datasource.xa
    spring.datasource.xa.data-source-class-name
    spring.datasource.xa.properties
    

    第二种方式:使用JMX(Java管理扩展)进行监视

    第三种方式:使用Spring方面进行监视(仅用于开发/QA环境)。

    我使用这个方面来记录TomcatJdbc连接池。

    我创建了一个Spring方面,它将拦截每个数据库调用,这肯定会影响性能。

    @Before("execution(* com.test.app.db.dao.*.*(..))")
        public void logBeforeConnection(JoinPoint jp) throws Throwable {
            String methodName = "";
            methodName += jp.getTarget().getClass().getName();
            methodName += ":";
            methodName += jp.getSignature().getName();
            logger.info("before method call : " + methodName +  " : number of connections in use by the application (active) : "+ tomcatJdbcPoolDataSource.getNumActive());
            logger.info("before method call : " + methodName +  " : the number of established but idle connections : "+ tomcatJdbcPoolDataSource.getNumIdle());
            logger.info("before method call : " + methodName +  " : number of threads waiting for a connection : "+ tomcatJdbcPoolDataSource.getWaitCount());
        }
    
    
    @After("execution(* com.test.app.db.dao.*.*(..)) ")
    public void logAfterConnection(JoinPoint jp) throws Throwable {
        String methodName = "";
        methodName += jp.getTarget().getClass().getName();
        methodName += ":";
        methodName += jp.getSignature().getName();
        logger.info("after method call : " + methodName +  " : number of connections in use by the application (active) : "+ tomcatJdbcPoolDataSource.getNumActive());
        logger.info("after method call : " + methodName +  " : the number of established but idle connections : "+ tomcatJdbcPoolDataSource.getNumIdle());
        logger.info("after method call : " + methodName +  " : number of threads waiting for a connection : "+ tomcatJdbcPoolDataSource.getWaitCount());
        //tomcatJdbcPoolDataSource.checkAbandoned();
    }
    

  •  类似资料:
    • 此刻我被困住的一点是调试处于“活动”状态的连接,以及它们正在做什么或它们当前被困的原因。 当我运行“10个同时用户”时,它基本上可以转换成2或3倍于此的查询,因此,当我打开HikariCP调试日志时,它会挂在类似的位置-上,而“active”连接并没有真正释放连接,这正是我试图找出的原因,因为查询相当简单,表本身只有4个字段(包括主键)。 HikariCP人员的最佳实践通常也是,增加连接池不是实现

    • 问题内容: 我已经用Java实现了一个非常简单的ConnectionPool。它没有花哨的功能,只有获取/释放连接方法。 我如何测试它是否正常工作? 我知道那里有很多准备使用的连接池,它们比我将要使用的要可靠得多,但是我只是在尝试练习以了解连接池的工作方式。 谢谢! 如果有帮助,下面是代码: 还有我的PooledConnection.java: 问题答案: 你可以测试一下 在池为空时获得连接将为您

    • 问题内容: 嘿,我刚开始使用c3p0进行数据库连接池。它正在将自身附加到当前的log4j输出中。如何将注销仅设置为c3p0或至少设置为SEVERE级别?我尝试调整属性文件,但不确定是否正确选择了该文件。 关于如何最好地关闭它的任何想法? 谢谢 更新:这似乎在log4j.properties文件中起作用 问题答案: 如果使用log4j.xml文件,则可以简单地为c3po软件包定义一个记录器: log

    • 问题内容: 如何查看我的池库(C3P0)创建和关闭JDBC连接的时间? 注意:我已经对此进行了研究,并且已经找到了解决方案。我将其发布在这里,以便对其他人有用,并且可以参考以防万一将来忘记它。 欢迎其他方法/答案。 问题答案: 库可用于记录JDBC连接。将此库添加到POM- 配置。修改日志记录选项以根据自己的需要调整详细信息级别。 配置数据源。 关于上述数据源配置的注意事项: 您通常的驱动程序类名

    • 我对连接池有一些疑问。在SQL Server连接池文章中提到的内容类似于“打开新连接时,如果连接字符串与现有池不完全匹配,则会创建一个新池。每个进程、每个应用程序域、每个连接字符串以及使用集成安全性时、每个Windows标识将连接池化。” 现在我有了自己的windows窗体应用程序,它具有SQL连接。 > 所以当我打开应用程序时,SQL连接首次打开,并创建了一个池。所以,如果我关闭应用程序池会被自

    • 作为一个专业的服务端开发工程师,我们必须要对连接池、线程池、内存池等有较深理解,并且有自己熟悉的库函数可以让我们轻松驾驭这些不同的 池子。既然他们都叫某某池,那么他们从基础概念上讲,原理和目的几乎是一样的,那就是 复用。 以连接池做引子,我们说说服务端工程师基础必修课。 从我们应用最多的 HTTP 连接、数据库连接、消息推送、日志存储等,所有点到点之间,都需要花样繁多的各色连接。为了传输数据,我们