现状
我正在使用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来编写日志。 我想写的日志就像数据库池状态,如
等等。
问题
是否可以从spring项目访问Tomcat的数据库池? 下面会有类似这样的方法。
答案 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;
}
}
}