首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过GAE Flex中的连接池连接Cloud的最佳方法

通过GAE Flex中的连接池连接Cloud的最佳方法
EN

Stack Overflow用户
提问于 2018-02-26 05:57:52
回答 2查看 627关注 0票数 3

我使用Hibernate v5,结合GAE、灵活的环境和Cloud。

所有操作都很好,但是当一个实例被唤醒或经过一些冷时间(没有请求服务)之后,连接到数据库(最多8s)需要很长的时间,而查询的执行只需要ms。此外,它还一次又一次地创建serviceRegistry

有谁能建议一下什么是连接Cloud的最佳方法,避免在获得连接时出现更高的延迟。

PS:我正在使用cp30作为连接池。

来自app引擎的日志:

HibernateUtil Config:

代码语言:javascript
运行
复制
        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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-17 22:45:08

除非您正在使用人工定标,否则您的实例通常会被终止并重新启动。实例在启动时必须重新加载所有库和配置,因此需要更长的时间才能完成预期的行为。

对于用例,有两个简单的选项:

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

2)使用人工定标来扩展app应用程序。这几乎和第一个选项一样有效,但是如果实例不健康,仍然可以重新启动。在这种情况下,如果发生了什么事情,请确保安装了健康检查来修复实例。这样他们就能活下来,工作得越多越好。

票数 2
EN

Stack Overflow用户

发布于 2018-03-02 11:32:09

我不太清楚你所说的“一个实例被唤醒”是什么意思,因为一个实例要么是活的,要么是死的。它在空闲时所做的事情取决于您的app.yaml中的缩放设置,它要么死掉要么空转。

我认为sessionFactory的创建是延迟的原因。这是一个昂贵的过程,因为会话工厂封装了会话对象、连接、Hibernate属性缓存和映射。

我很想知道如果您重用sessionFactory会发生什么(如从这里中无耻窃取的示例所示):

代码语言:javascript
运行
复制
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;
    }
}

由于您没有提供完整的代码,所以您必须根据自己的情况调整这个示例。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48982293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档