Java的。无法打开连接

时间:2012-09-26 16:53:35

标签: java multithreading oracle hibernate connection

我正在使用

  

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次。

有什么想法可以修复吗?

1 个答案:

答案 0 :(得分: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"/>

您可以查看配置here

您应该在休眠状态下更改连接池。

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