即使数据来自Ehcache,c3p0也总是调用commit

时间:2015-12-05 10:45:38

标签: java oracle hibernate ehcache

我有一个Web服务,它可以通过readonly调用(一堆选择查询)从DB获取数据。但它只是第一次调用数据库,之后,所有涉及的实体都使用Ehcache缓存在hibernate二级缓存中。问题是即使我的请求没有进行任何数据库调用来获取数据,应用程序总是对数据库进行提交调用,这会影响我对Web服务的响应时间。

我的Web服务响应时间是90毫秒,其中提交调用始终贡献35毫秒(40%)。数据源配置为spring bean,数据源类为com.mchange.v2.c3p0.ComboPooledDataSource,如下所示。

每次调用Web服务时都会调用DB,我可以在appdynamics的调用图中看到它。对于请求中涉及的所有条目,缓存命中率为100%。

enter image description here

<bean id="catalogReadDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <!-- jdbc properties -->
    <property name="jdbcUrl"
        value="XXXXXXXXXXXX" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />

    <!-- c3P0 properties -->
    <property name="acquireIncrement" value="${c3p0.acquireIncrement}" />
    <property name="minPoolSize" value="${c3p0.minPoolSize}" />
    <property name="maxPoolSize" value="${c3p0.maxPoolSize}" />
    <property name="maxStatements" value="${c3p0.maxStatements}" />
    <property name="maxIdleTime" value="${c3p0.maxIdleTime}" />
    <property name="preferredTestQuery" value="${c3p0.preferredTestQuery}" />
    <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" />
    <property name="testConnectionOnCheckin" value="${c3p0.testConnectionOnCheckin}" />
    <property name="unreturnedConnectionTimeout" value="${c3p0.unreturnedConnectionTimeout}" />
    <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}" />

    <!-- The below property is not set because we have feeds which require 
        a lot of connections. Resetting the connectionPool size to minPoolSize might 
        not be ideal. Instead we'd use maxIdleTime and maxConnectionAge return unused 
        connections. -->
    <!-- <property name="maxIdleTimeExcessConnections" value="${c3p0.maxIdleTimeExcessConnections}" 
        /> -->

    <!-- The below parameters can be set to prevent connection leaks. Ideally, 
        the application should close all connections, in which case they'll be returned 
        to the pool. -->
    <!-- <property name="unreturnedConnectionTimeout" value="unreturnedConnectionTimeout" 
        /> -->
    <!-- <property name="debugUnreturnedConnectionStackTraces" value="debugUnreturnedConnectionStackTraces" 
        /> -->
</bean>

2 个答案:

答案 0 :(得分:1)

尽管如此,Connection上相关的事务划分也会发生。您可以使用Spring LazyConnectionDataSourceProxy(doc&#39; ed here)之类的内容,以避免在不需要时发送这些内容。

答案 1 :(得分:0)

这听起来像是在打开一个事务并始终只在检查缓存内容之后获得数据库连接。

但是,由于您已经打开了事务上下文,它将被关闭,发出提交,因为没有例外。

您很可能需要在事务上下文之外移动缓存检查。

当然,确认这取决于您未在问题中包含的申请代码。