适用于Cloud SQL的Hibernate连接池提供程序

时间:2014-10-25 15:59:08

标签: java hibernate google-app-engine google-cloud-sql

我将Hibernate与GAE和Cloud SQL结合使用。

一切正常,但是当一个实例被唤醒时,有时连接数据库需要很长时间(最多15秒)

在日志中我看到Hibernate建立连接的时间最多:

   I 17:46:35.936 org.hibernate.cfg.Configuration doConfigure: HHH000041: Configured SessionFactory: null
   W 17:46:36.209 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000402: Using Hibernate built-in connection pool (not for production use!)
   I 17:46:36.243 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000115: Hibernate connection pool size: 0
   I 17:46:36.244 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000006: Autocommit mode: false
   I 17:46:36.244 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000401: using driver [com.mysql.jdbc.GoogleDriver] at URL [jdbc:google:mysql://database?user=someUser]
   I 17:46:36.245 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000046: Connection properties: {}
   I 17:46:45.356 org.hibernate.dialect.Dialect <init>: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect

以下是产生此代码的代码:

properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.GoogleDriver");
properties.put("hibernate.connection.url", "jdbc:google:mysql://" + SQL_INSTANCE + "/" + DATABASE + "?user=someUser");

// disable schema check
properties.put("hibernate.hbm2ddl.auto", ""); // disable
properties.put("hibernate.show_sql", false);            

// single session per request/thread
properties.put("hibernate.connection.pool_size", 0);
properties.put("hibernate.current_session_context_class", "thread");

Configuration cfg = new Configuration();
cfg.configure("/META-INF/hibernate.cfg.xml");
cfg.addProperties(properties);

sessionFactory = cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());

以下方法提供会话

public Session getSession() {

        Session session;
        try {
            session = sessionFactory.getCurrentSession();
        }
        catch (org.hibernate.HibernateException he) {
            log.info("Opening new hibernate session.");
            session = sessionFactory.openSession();
        }

        return session;
    }

我将连接池大小设置为0(按照建议),但显然使用了连接池管理器中的Hibernates内置。

我的问题是,应该在此设置中使用哪个连接池管理器,以及还可以采取哪些措施来加快连接时间。

这种设置的最佳做法是什么,因为除了一些简单的例子我找不到任何东西。

2 个答案:

答案 0 :(得分:1)

我建议您使用HikariCPprobably the fastest open-source CP

我有一个GitHub项目你可以克隆并检查我的配置是否有Hibernate本地事务配置。虽然该示例使用DBCP,但您只需要使用HikariDataSource one替换DataSource配置。

如果您只使用Hibernate API并且不想依赖SPring,那么在创建HikariDataSource对象之后,需要将其发送到Hibernate配置:

@Override
protected SessionFactory newSessionFactory() {
    Properties properties = new Properties();
    ...
    //data source settings
    properties.put("hibernate.connection.datasource", hikariDataSource);
    return new Configuration()
    .addProperties(properties)
    .addAnnotatedClass(SecurityId.class)
    .buildSessionFactory(
            new StandardServiceRegistryBuilder()
            .applySettings(properties)
    .build()
);

答案 1 :(得分:0)

ON_DEMAND SQL实例将在空闲时段后关闭。当实例关闭时,任何新连接都必须等待实例在连接完成之前启动。

这可能是您遇到的延迟。您可以尝试将激活策略更改为ALWAYS,看看这是否会减少连接开销。如果您这样做,您还应该将结算方案更改为&#34; Package&#34;考虑到你的实例将不断运行,因为它会更便宜。

Cloud SQL FAQ

中介绍了这一点