【发布时间】:2014-10-25 15:59:07
【问题描述】:
我将 Hibernate 与 GAE 和 Cloud SQL 结合使用。
一切正常,但是当实例被唤醒时,有时连接数据库需要很长时间(最长15s)
在日志中我看到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 内置的连接池管理器。
我的问题是,在此设置中应该使用哪个连接池管理器,以及可以做些什么来加快连接时间。
这种设置的最佳实践是什么,因为除了一些琐碎的例子我什么都找不到。
【问题讨论】:
标签: java hibernate google-app-engine google-cloud-sql