Hibernate on Google AppEngine
We're in the process of migrating ActivityInfo.org to Google AppEngine and their MySQL-based Cloud SQL service.
The experience has been quiet straightforward, but we've had to a do a bit of tuning to get Hibernate working well on AppEngine.
First, you have to completely disable connection pooling. CloudSQL instances pop up and down so you can't hold on to a Connection beyond the duration of a request. This can be done through configuration:
hibernate.connection.pool_size = 0
The second issue is startup time. By default, Hibernate 3.6 (the version we're using) will scan your classpath looking for classes annotated with @Entity. This isn't a big deal when you bring up new instances once a day or so, but AppEngine instances pop up and down quite frequently.
Hibernate was taking 30+ seconds to initialize, which means that many warm up requests-- the first requests from the user to a new instance -- were timing out.
We were able to work around this by providing the list of classes explicitly using the Ejb3Configuration API:
Ejb3Configuration config = new Ejb3Configuration();
config.setProperty("hibernate.connection.driver_class",
"com.google.appengine.api.rdbms.AppEngineDriver");
config.setProperty("hibernate.connection.url",
"jdbc:google:rdbms://domain.com:project:instance/db");
config.setProperty("hibernate.connection.pool_size", "0");
config.addAnnotatedClass(MyEntity.class);
config.addAnnotatedClass(MyEntity2.class);
return config.buildEntityManagerFactory();
We had been using persistence.xml for configuration, but I wasn't able to find away to disable the class path scan without resorting to the Ejb3Configuration API.
Written by Alex Bertram
Related protips
3 Responses
I am getting the following error when explicitly using the Ejb3Configuration API:
Class org.hibernate.cfg.Configuration can not access a member of class org.hibernate.cfg.beanvalidation.TypeSafeActivator with modifiers "public static"
Did you experience anything similar?
Hmm, no I didn't but it sounds like a version mismatch -- does your validator library match your version of hibernate?
Yes. Seems like could be a gae issue:
https://code.google.com/p/googleappengine/issues/detail?id=6593