我将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内置。
我的问题是,应该在此设置中使用哪个连接池管理器,以及还可以采取哪些措施来加快连接时间。
这种设置的最佳做法是什么,因为除了一些简单的例子我找不到任何东西。
答案 0 :(得分:1)
我建议您使用HikariCP,probably 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;考虑到你的实例将不断运行,因为它会更便宜。
中介绍了这一点