我正在将Hibernate v5与GAE Flexible环境和Cloud SQL结合使用。
一切正常,但是当一个实例被唤醒或者在一些寒冷的时间之后(没有请求服务),连接到数据库需要很长时间(最多8s),而查询的执行只需要ms。它还会一次又一次地创建 serviceRegistry 。
任何人都可以建议什么是与Cloud SQL连接的最佳方法,以避免更高的延迟获取连接。
PS:我使用cp30进行连接池。
来自应用引擎的日志:
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;
答案 0 :(得分:2)
除非您使用manual scaling,否则您的实例通常会被终止并重新启动。实例必须在它们启动时重新加载所有库和配置,因此它的预期行为需要更长的时间。
您的用例有两个简单的选项:
1)使用Compute Engine instance,它允许您加载代码,库和配置,它是一个专用的VM,它将继续为您的请求提供服务,并且不会“缩小”(终止)。这绝对是最安全的方法。
2)使用manual scaling扩展App Engine Flex应用。这几乎和第一个选项一样有效,但如果实例不健康,实例仍然可以重新启动。在这种情况下,如果发生某些事情,请确保您有health check设置来修复您的实例。这将使他们保持活力并尽可能地工作。
答案 1 :(得分:-2)
我并不完全确定你的意思"一个实例被唤醒"作为一个实例是活着还是死了。空闲时的作用取决于你的scaling settings in the app.yaml,它可能会死亡或保持空转状态。
我认为sessionFactory的创建是导致延迟的原因。由于Session工厂封装会话对象,连接,Hibernate属性缓存和映射,这是一个代价高昂的过程。
我很想知道如果你重复使用sessionFactory会发生什么(根据here无耻地窃取的例子):
.widest{
margin-left: calc( (100vw - 960px) / -2 );
}
由于您没有提供完整的代码,因此您必须根据自己的情况调整此示例。