java - 在 GAE Flex 中通过连接池连接 Cloud SQL 的最佳方式

标签 java sql google-app-engine google-cloud-platform google-cloud-sql

我将 Hibernate v5 与 GAE Flexible 环境和 Cloud SQL 结合使用。

一切正常,但是当一个实例被唤醒或者在某个冷时间之后(没有服务请求),它需要很长时间才能连接到数据库(最多 8s),而查询的执行只需要 ms。它还一次又一次地创建 serviceRegistry

任何人都可以建议连接 Cloud SQL 的最佳方法是什么,以避免在获得连接时出现更高的延迟。

PS:我正在使用 cp30 进行连接池。

来自应用引擎的日志:

enter image description here

enter image description here HibernateUtil 配置:

        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;

最佳答案

除非您使用 manual scaling ,您的实例经常被终止并重新启动。实例在启动时必须重新加载所有库和配置,因此需要更长的时间是预期的行为。

您的用例有两个简单的选项:

1) 使用 Compute Engine instance ,它允许您加载您的代码、库和配置,它是一个专用的 VM,它将继续为您的请求提供服务,并且不会“缩小”(终止)。这绝对是最安全的方法。

2) 使用manual scaling扩展您的 App Engine Flex 应用程序。这几乎与第一个选项一样有效,但如果实例不健康,它们仍然可以重新启动。在这种情况下,请确保您有 health check设置以在发生某些事情时治愈您的实例。这将使它们尽可能地保持活力和工作。

关于java - 在 GAE Flex 中通过连接池连接 Cloud SQL 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48982293/

相关文章:

sql - 扩大两个日期之间的月份

sql - 一个和三个其他表之间的最佳关系

google-app-engine - 通过取消删除 POST 调用恢复云功能默认服务帐户

java - "context"在上下文(不)敏感的分析中到底意味着什么?

java - 有没有一种方法可以有效地添加多个按键绑定(bind)?

mysql - Group Key如何Json、Sum、动态?

java - 使用 ReSTLet 和 GAE 过滤 ROOT 路径

google-app-engine - 清理 AppEngine BlobStore

java - hibernate 一对一未映射

java - 在整数值上同步