我使用Hibernate v5,结合GAE、灵活的环境和Cloud。
所有操作都很好,但是当一个实例被唤醒或经过一些冷时间(没有请求服务)之后,连接到数据库(最多8s)需要很长的时间,而查询的执行只需要ms。此外,它还一次又一次地创建serviceRegistry。
有谁能建议一下什么是连接Cloud的最佳方法,避免在获得连接时出现更高的延迟。
PS:我正在使用cp30作为连接池。
来自app引擎的日志:


HibernateUtil Config:
props.put("hibernate.hbm2ddl.auto", "validate");
props.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
props.put("hibernate.generate_statistics", "true");
props.put("hibernate.cache.use_query_cache", "true");
props.put("hibernate.transaction.coordinator_class", "org.hibernate.transaction.JDBCTransactionFactory");
props.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory");
props.put("hibernate.cache.use_second_level_cache", "true");
props.put("connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
props.put("hibernate.c3p0.min_size", "40");
props.put("hibernate.c3p0.max_size", "250");
props.put("hibernate.c3p0.acquire_increment", "1");
props.put("hibernate.c3p0.testConnectionOnCheckin", "true");
props.put("hibernate.c3p0.idle_test_period", "300");
props.put("hibernate.c3p0.maxIdleTimeExcessConnections", "240");
props.put("hibernate.c3p0.preferredTestQuery", "SELECT 1");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
System.out.println("Hibernate Java Config serviceRegistry created");
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;发布于 2018-03-02 11:32:09
我不太清楚你所说的“一个实例被唤醒”是什么意思,因为一个实例要么是活的,要么是死的。它在空闲时所做的事情取决于您的app.yaml中的缩放设置,它要么死掉要么空转。
我认为sessionFactory的创建是延迟的原因。这是一个昂贵的过程,因为会话工厂封装了会话对象、连接、Hibernate属性缓存和映射。
我很想知道如果您重用sessionFactory会发生什么(如从这里中无耻窃取的示例所示):
package net.codejava.hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
// loads configuration and mappings
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry
= new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
// builds a session factory from the service registry
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
return sessionFactory;
}
}由于您没有提供完整的代码,所以您必须根据自己的情况调整这个示例。
https://stackoverflow.com/questions/48982293
复制相似问题