Java。无法打开连接 [英] Java. Cannot open connection
问题描述
我正在使用
oracle.ucp.jdbc.PoolDataSource
获取连接。每个连接包装到自定义类(历史解决方案)。一般来说,连接是通过entityManager获取的。我的系统需要高性能处理。有ThreadPool使用它。线程池可以同时提供 15 个线程,如连接池。
每一件事情都很好,但有时我得到异常(在这一刻只使用4个连接):
2012 -09-26 17:51:45.835 |错误| ThreadExecutor-7 | org.hibernate.ejb.AbstractEntityManagerImpl |线程ThreadExecutor-7中的异常
javax.persistence.PersistenceException:org.hibernate.exception.GenericJDBCException:无法打开连接
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)
...
在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)
在java。 util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)
在java.lang.Thread.run(Thread.java:619)
Caused by:org.hibernate.exception.GenericJDBCException:无法打开连接
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)
在org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
在org.hibernate.jdbc.ConnectionManager。 openConnection(ConnectionManager.java:449)
在org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
在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次。
有任何解决方案吗?
解决方案为
设置适当的值< property name =minPoolSizevalue =5/&
< property name =maxPoolSizevalue =100/> //如果你想要改变
< property name =initialPoolSizevalue =5/>
< property name =validateConnectionOnBorrowvalue =true/>
< property name =maxStatementsvalue =10/>
您可以检查配置这里
您应该在hibernate中更改连接池。
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
I'm using
oracle.ucp.jdbc.PoolDataSource
for getting connections. Each connection wrapped to custom class (historic solution). Generally connection is getting by entityManager. My system require hight performance processing. There is ThreadPool using for it. Thread pool can provide 15 threads at the same time, like connection pool. Every thing works fine, but sometimes i get exception (in this moment were used only 4 connections):
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)
If i synchronize specified getConnection performance of the system going down 8-12 times.
Is any ideas for fix?
解决方案Please check you are setting appropriate values for
<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"/>
You can check configuration here
You should change connection pooling in hibernate.
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html
Hibernate's own connection pooling algorithm is, however, quite rudimentary. It is intended to help you get started and is not intended for use in a production system, or even for performance testing. You should use a third party pool for best performance and stability. Just replace the hibernate.connection.pool_size property with connection pool specific settings. This will turn off Hibernate's internal pool. For example, you might like to use c3p0.
hibernate.c3p0.min_size=5 hibernate.c3p0.max_size=20 hibernate.c3p0.timeout=1800 hibernate.c3p0.max_statements=50
这篇关于Java。无法打开连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!