2017-02-09 62 views
0

代码使用更多最大JDBC连接池的Hibernate(MySQL的)比预期

Session session = sessionFactorty.openSession(); 

    session.beginTransaction(); 
    session.save(userDetails); 
    session.save(userDetails1); 
    session.getTransaction().commit(); 

    session.close(); 

Hibernate配置

<!-- JDBC connection pool (use the built-in) --> 
<property name="connection.pool_size">1</property> 

对于这种配置,我得到错误:内部连接池已达到其最大尺寸

INFO: HHH000476: Executing import script 'org.hiber[email protected]2b4c1d96'Exception in thread "main" org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available! 
at org.hibernate.engine.jdbc.connections.internal.PooledConnections.poll(PooledConnections.java:82) 
at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:186) 
at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:48) 
at org.hibernate.id.enhanced.TableStructure$1.getNextValue(TableStructure.java:125) 
at org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40) 
at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:432) 
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:105) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:682) 
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674) 
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669) 

将connection.pool_size增加到2解决了问题。我期望它只使用一个连接。
问题:是一种预期的行为?为什么它发生?

+0

嗯,我会说这是**预计不会建立一个连接池只有一个连接**。无论如何,[似乎](https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/PooledConnections.java# L73)没有可用的连接,并且在引发此异常时不可能* addConnection *。您可能需要检查* size()*以查看是否有可用连接... –

回答

-1
<property name="hibernate.connection.pool_size">1</property> 

下面替换上述行(pool_size已更改表格1到100)

<property name="hibernate.connection.pool_size">100</property>