0

我正在使用

oracle.ucp.jdbc.PoolDataSource

用于获取连接。每个连接都包装到自定义类(历史解决方案)。通常连接是通过 entityManager 获得的。我的系统需要高性能处理。有 ThreadPool 用于它。线程池可以同时提供15个线程,就像连接池一样。一切正常,但有时我会遇到异常(此时仅使用了 4 个连接):

2012-09-26 17:51:45.835 | ERROR | ThreadExecutor-7 | org.hibernate.ejb.AbstractEntityManagerImpl | Exception in thread "ThreadExecutor-7"
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1245)
    at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:63)
    ...
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1463)
    at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:60)
    ...
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)

如果我同步指定的系统getConnection性能下降 8-12 次。

有什么解决办法吗?

4

1 回答 1

0

请检查您是否设置了适当的值

 <property name="minPoolSize" value="5"/>
 <property name="maxPoolSize" value="100"/>//Change if you want
 <property name="initialPoolSize" value="5"/>
 <property name="validateConnectionOnBorrow" value="true"/>
 <property name="maxStatements" value="10"/>

您可以在此处检查配置

您应该在休眠中更改连接池。

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html

然而,Hibernate 自己的连接池算法非常初级。它旨在帮助您入门,而不是用于生产系统,甚至不用于性能测试。您应该使用第三方池以获得最佳性能和稳定性。只需将 hibernate.connection.pool_size 属性替换为连接池特定设置即可。这将关闭 Hibernate 的内部池。例如,您可能喜欢使用 c3p0。

hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
于 2012-09-26T17:12:47.973 回答