【发布时间】:2018-09-19 18:00:29
【问题描述】:
我正在开发一个 Spring-MVC 应用程序,其中我们使用 Hibernate 和 c3p0 进行数据库事务和连接池。大多数时候它工作得很好,没有问题。但在某些情况下,我必须在当前事务中复制大量对象和文件。发生这种情况时,整个服务器会变慢,最后我开始收到 could not rollback exception 。我的 c3p0 设置有什么问题吗?谢谢。
pom.xml:
<!--- Hibernate dependencies -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>4.3.9.Final</version>
</dependency>
根上下文.xml:
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<beans:property name="driverClassName" value="org.postgresql.Driver"/>
<beans:property name="url"
value="jdbc:postgresql://localhost:PORT/DB_NAME"/>
<beans:property name="username" value="USERNAME"/>
<beans:property name="password" value="PASSWORD"/>
<beans:property name="removeAbandoned" value="true"/>
<beans:property name="removeAbandonedTimeout" value="20"/>
<beans:property name="defaultAutoCommit" value="false"/>
</beans:bean>
<!-- Hibernate 4 SessionFactory Bean definition -->
<beans:bean id="hibernate4AnnotatedSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource"/>
<beans:property name="packagesToScan" value="com.ourapp.spring.model"/>
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL9Dialect</beans:prop>
<beans:prop key="hibernate.show_sql">false</beans:prop>
<!--<beans:prop key="hibernate.jdbc.batch_size">1000</beans:prop>-->
<beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop>
<beans:prop key="cache.use_second_level_cache">true</beans:prop>
<beans:prop key="cache.use_query_cache">true</beans:prop>
<beans:prop key="hibernate.order_updates">true</beans:prop>
<beans:prop key="show_sql">false</beans:prop>
<beans:prop key="hibernate.c3p0.min_size">1</beans:prop>
<beans:prop key="hibernate.c3p0.max_size">750</beans:prop>
<beans:prop key="hibernate.c3p0.acquire_increment">1</beans:prop>
<beans:prop key="hibernate.c3p0.idle_test_period">1000</beans:prop>
<beans:prop key="hibernate.c3p0.max_statements">150</beans:prop>
<beans:prop key="hibernate.c3p0.timeout">1200</beans:prop>
<beans:prop key="hibernate.connection.release_mode">auto</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
谢谢。
【问题讨论】:
-
这里的重点是要知道 c3p0 并不能真正处理大量数据,这会导致服务器速度慢和出现您描述的错误。当你遇到这样的麻烦时,要么你需要尝试优化你的查询,要么你需要切换到原生 SQL 查询
-
@DamCx :有多个查询,因为需要从 DB 获取大量信息。所有这些查询都会定期使用,没有任何问题。
-
我无法对配置发表评论,但您是否尝试过将 C3PO 换成 Hikari 之类的东西? github.com/brettwooldridge/HikariCP
-
你是如何确定是 C3P0 的罪魁祸首?
-
使用
top不太适合分析Java 进程。虽然您可能会观察到没有任何实际的内存泄漏,但您对内存使用模式一无所知。
标签: java spring postgresql hibernate c3p0