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

使用tomcat datasource-如何通过spring jndi访问datasource以获取当前数据库池状态

陈瀚玥
2023-03-14

现状

我在web和rest api服务器上使用Jmeter进行压力负载测试,但是有些转换的响应时间延迟很多,所以我使用Spring方面来获取方法处理时间。我无法设置的是,一些过程调用花费了太多的时间,因此尝试通过编写特定事务的日志来检查DB进程时间(get con,release con,pure DB进程时间)。JMX不是一个选项,因为我无法跟踪使用它的事务。我只想保留DB池状态,并将ThreadContext标记为on,这样我就可以同时检查慢速事务和DB池状态。

Spring项目的事务管理器使用带有Oracle数据源的Tomcat DBCP池(带有javax.sql.datasource的Oracle.jdbc.oracleDriver)

ApplicationContext.xml-数据库设置

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:/comp/env/jdbc/svc"/>
    <property name="resourceRef" value="true"/>
</bean> 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="mapperLocations" value="classpath*:../sql/**.xml"/>
    <property name="dataSource"><ref bean="dataSource"/></property>
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="sqlSessionFactory"/>
</bean>

<bean id="oracleTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" />
<bean id="transactionManager" class="com.xxx.xxx.api.transaction.TransactionManager">
    <property name="transactionManagers">
        <list>
            <ref bean="oracleTransactionManager"/>
        </list>
    </property>
</bean>

试图做...记录数据库池状态

    null
    null

共有1个答案

宋英杰
2023-03-14

您可以简单地创建TomcatJDBCPoolDataSource的代理,并将其用作spring bean。我已经为C3P0池数据源创建了一个代理。随后,我使用所需的配置创建了类的spring bean并将其用作数据源。我相信你也能做些类似的事。

public class C3PODataSourceProxy extends AbstractComboPooledDataSource {

    public C3PODataSourceProxy() {
        super();
    }

    public C3PODataSourceProxy(boolean autoregister) {
        super(autoregister);
    }

    public C3PODataSourceProxy(String configName) {
        super(configName);
    }

    @Override
    public Connection getConnection() throws SQLException {
        try {
            Connection connection = super.getConnection();
            //You can call the below methods and log it, send it to some other class etc
            getNumIdleConnections();
            getNumBusyConnections();
            return connection;
        } catch (Exception exception) {
            //log the exception
            throw exception;
        }
    }

    public Connection getConnection(String username, String password) throws SQLException {

        try {
            Connection connection = super.getConnection(username, password);
               //You can call the below methods and log it, send it to some other class etc
            getNumIdleConnections(username, password);
            getNumBusyConnections(username, password);
            return connection;
        } catch (Exception exception) {
            //log the exception
            throw exception;
        }
    }

}
 类似资料:
  • 本文向大家介绍如何获取当前数据库版本?相关面试题,主要包含被问及如何获取当前数据库版本?时的应答技巧和注意事项,需要的朋友参考一下 使用 select version() 获取当前 MySQL 数据库版本。

  • //MySQL,,mysql -v select version(); //Oracle select * from v$version;

  • 问题内容: 有没有一种方法可以通过Hibernate 3.2 API获得一些基础数据库版本的信息?我在这里和javadoc中都找不到相关的位。 问题答案: 获取数据库引擎的版本是特定于实现的。这意味着没有获取版本的共享方法,因此Hibernate不能真正提供API,因为它没有绑定到任何特定的RDBMS。例如,以下是通过一些著名的RDBMS使用SELECT语句获取版本的几种不同方法: Oracle

  • 问题内容: 我是PHP和SQL领域的一名新开发人员。到目前为止,我只完成了Objective- C编程。但是,我的一个项目要求我拥有一个在线数据库,我需要从我的应用程序访问该数据库。我打算使用该框架来远程访问数据库,如下所示: 但这是行不通的,因为我联系了我的托管服务提供商,并且他们已经对其进行了设置,因此我无法从外部主机访问我的数据库(出于安全性考虑)。因此,我将不得不寻找替代方案。我唯一想到的

  • 我正在使用spring boot和sql server,当我有以下代码获得DB时间时,得到了意外的子树结尾;

  • 我得到了这段代码,但我认为这是不好的方法,如果有像100K的结果,它会返回100K的新用户怎么办?对于,我是否可以使用其他方法,但我不太确定如何实现。另外,是否应该使用块?