Developer Aspirations

YAPB - Yet Another Programming Blog

Wednesday

13

January 2010

Two Databases, One Hibernate

by Colin Miller, on development, Hibernate, Scalability

Hibernate is a very interesting ORM product that hides the SQL behind mapping your objects to your database. In general it works pretty well at making it easier to deal with database objects. Unfortunately, there seems to be some lack of flexibility. For instance, utilizing two databases for the same dataset in Hibernate.

Here's my issue: I have a MySQL database that acts as a primary master. There is a slave database that is replicated off of this first database (to make it easier to talk about, I'll call the master db "db1" and the slave "db2"). Db2 has an up-to-date copy of db1 and is set in read-only mode because we only ever want changes to happen in one location (db1). However, due to database load or scaling we want to modify our application to send all read-only requests to db1 while sending write requests to db2. Since Hibernate abstracts out the database fairly well, I'm not sure how to accomplish this.

In Hibernate you can read an object from the database, make modifications to that object, and Hibernate will seamlessly save those modifications right back into the database. How then do you force Hibernate to read objects from one DB but save them to another? You obviously can't use the same session, which hibernate is centered around. However attaching a persistent object to a new session of a different database doesn't seem very feasible either. I suppose there are perhaps some sort of interface or abstract class I can implement or extend to plug in, but there's no documentation that I've found that deals with this issue.

The hassle of losing this flexibility makes me wonder if dealing with an ORM suite is really a benefit. Portability seems to decrease (as much as database agnostic Hibernate's queries are) because I'm still tied to the one database model. The feature list of the framework talks about "extreme scalability" and that it may be used in a cluster, yet the documentation does not make any mention of this supposed feature. It almost seems like a bullet point that someone placed on the hibernate website as a marketing point that they later expected no one to really look into. Perhaps it can be adopted into a cluster yet out of the 'box' functionality seems to be missing or hidden.

I'm not really sure if 'cluster support' would really be of any benefit to us anyway. We're not running what would be called a 'cluster'. We're using multiple front-end machines behind a load balancer that handle stateless requests. There is no coupled connection between the application servers. None of them know about any other application server running as there is no clustering software that would do something like share session data. Having a decoupled stateless database system where we can separate reads and writes to different (though content-wise identical) databases does not seem to fit into Hibernate's current scope.

If anyone has any insight onto this matter I'd really appreciate it. I realize that there's many aspects of the framework that I have not delved too deeply into and it is very possible that there are interfaces and/or abstract classes that I can implement and/or extend to gain the required functionality I desire. However the pickings will be slow due to lack of decent documentation in this area. I shall instead have to resign myself to trolling internet forums about Hibernate usage in Java, looking for nuggets of useful truth among the squalid remains of ORM flamewars.

comments powered by Disqus