Hibernate - 是否有可能等待 createEntityManager 获得免费连接
Hibernate - Is there a possibility to wait with createEntityManager for a free connection
我正在使用来自 Hibernate 的 EntityManagerFactory
并且 connectionPoolSize 为 20。现在我有一些更大的查询(t > 30 分钟)完全占用了我的池。当我开始新查询(使用 getEntityManager)时,出现以下异常:
javax.persistence.PersistenceException: org.hibernate.HibernateException:
The internal connection pool has reached its maximum size and no connection is currently available!
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1538)
at org.hibernate.query.Query.getResultList(Query.java:165)
是否有任何舒适的功能可以让我的线程休眠直到连接可用?
我只使用标准函数:
public static EntityManager getEntityManager () {
return emFactory.createEntityManager ();
}
我的 EntityManagerFactory 的创建:
public static void createEntityManagerFactory(String hostname, Integer port, String driver,
String database, boolean validate, int maxConnections, Properties properties) {
Properties props = new Properties();
props.setProperty("hibernate.connection.url", "jdbc:" + driver + ":thin:@" + hostname + ":" + port + ":" + database);
props.setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver");
props.setProperty("hibernate.connection.username", properties.getProperty("user"));
props.setProperty("hibernate.connection.password", properties.getProperty("password"));
props.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
emFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, props);
}
我的 persistence.xml 包含:
<property name="connection.pool_size" value="20" />
我阅读了有关 C3P0 设置的信息,它们可以帮助我吗?
-- 更新--我在使用 C3P0 时遇到了一些问题(例如:ORA-01652:无法将表空间 SYSTEM 中的临时段扩展 128,即使有少量的最大连接池大小),我没有与冬眠香草。 --
配置c3p0
<property name="hibernate.c3p0.min_size" value ="2"/>
<property name="hibernate.c3p0.max_size" value ="10"/>
<property name="hibernate.c3p0.acquire_increment" value ="2"/>
<property name="hibernate.c3p0.idle_test_period" value ="100"/>
<property name="hibernate.c3p0.timeout" value ="3600"/>
我使用 hikaricp 连接池解决了这个问题。
我正在使用来自 Hibernate 的 EntityManagerFactory
并且 connectionPoolSize 为 20。现在我有一些更大的查询(t > 30 分钟)完全占用了我的池。当我开始新查询(使用 getEntityManager)时,出现以下异常:
javax.persistence.PersistenceException: org.hibernate.HibernateException:
The internal connection pool has reached its maximum size and no connection is currently available!
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1538)
at org.hibernate.query.Query.getResultList(Query.java:165)
是否有任何舒适的功能可以让我的线程休眠直到连接可用?
我只使用标准函数:
public static EntityManager getEntityManager () {
return emFactory.createEntityManager ();
}
我的 EntityManagerFactory 的创建:
public static void createEntityManagerFactory(String hostname, Integer port, String driver,
String database, boolean validate, int maxConnections, Properties properties) {
Properties props = new Properties();
props.setProperty("hibernate.connection.url", "jdbc:" + driver + ":thin:@" + hostname + ":" + port + ":" + database);
props.setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver");
props.setProperty("hibernate.connection.username", properties.getProperty("user"));
props.setProperty("hibernate.connection.password", properties.getProperty("password"));
props.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
emFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, props);
}
我的 persistence.xml 包含:
<property name="connection.pool_size" value="20" />
我阅读了有关 C3P0 设置的信息,它们可以帮助我吗?
-- 更新--我在使用 C3P0 时遇到了一些问题(例如:ORA-01652:无法将表空间 SYSTEM 中的临时段扩展 128,即使有少量的最大连接池大小),我没有与冬眠香草。 -- 配置c3p0
<property name="hibernate.c3p0.min_size" value ="2"/>
<property name="hibernate.c3p0.max_size" value ="10"/>
<property name="hibernate.c3p0.acquire_increment" value ="2"/>
<property name="hibernate.c3p0.idle_test_period" value ="100"/>
<property name="hibernate.c3p0.timeout" value ="3600"/>
我使用 hikaricp 连接池解决了这个问题。