使用tomcat数据源 - 如何通过spring jndi

时间:2017-07-20 02:00:48

标签: java spring oracle tomcat

现状

我正在使用Jmeter在web和rest api服务器上进行压力负载测试,但有些转换'响应时间延迟了很多,所以我使用Spring Aspect来获取方法处理时间。我无法设置的是某些过程调用需要花费太多时间,因此尝试通过使用特定事务写入日志来检查数据库进程时间(获取con,释放con,纯数据库进程时间)。 JMX不是一个选项,因为我无法跟踪使用它的交易。我只想保留标记为ThreadContext的数据库池状态,以便我可以同时检查慢速事务和数据库池状态。

在这里不使用来自Tomcat的DB数据源,因为它不想在项目文件中进行数据库设置。

在Spring项目中使用数据源不是我目前正在考虑的选项。

当前设置

Spring project的事务管理器使用Tomcat DBCP池和Oracle数据源(oracle.jdbc.OracleDriver和javax.sql.DataSource)

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>

尝试执行...记录数据库池状态

我试图在调用特定dao类中的函数时使用Spring Aspect来编写日志。 我想写的日志就像数据库池状态,如

  1. 有效连接数
  2. 空闲连接计数
  3. 最大活动连接设置
  4. 最大空闲连接设置
  5. 等等。

    问题

    是否可以从spring项目访问Tomcat的数据库池? 下面会有类似这样的方法。

    1. getNumIdle()
    2. getWaitCount()
    3. getNumActive()

1 个答案:

答案 0 :(得分:0)

您可以简单地为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;
        }
    }

}