I’m developing a web app with Spring and Hibernate and I was so obsessed by making he application thread safe and being able to support heavy load that based on my boss recommendation I end up writing my own session and a session container to implement a session per request pattern. Plus I have a lot of DAOs and me not willing to write the same save method for all the DAOs I copy paste this Hibernate GenericDAO (I can’t tell it’s the same thing because at the time hibernate wasn’t owned by jboss) and do the plumbing stuff, and under pressure, all become quickly complicated and on production, the is StaleObjectException and duplicated data right, and i have the feeling that it’s time to review what I’ve done, simplify it and make it more robust for large data handling. One thing you should know is that one request involves many DAO’s.
There is quartz running for some updates in the database.
As much as I want to tune everything for the better I lack time to do the necessary research plus Hibernate is kind of huge (learning).
So this is it, I’ll like to borrow your experience and ask for few question to know what direction to take.
Question 1 : is Hibernate generated uuid safe enough for threading environment and avoiding StaleObjectException?
Question 2 what are best strategy to use hibernate getCurrentSession in threadSafe scenario (I’ve read about threadlocal stuff but didn’t get too much understanding so didn’t do it)
Question 3 : will HIbernateTemplate do for the simplest solution approach?
Question 4 : what will be your choice if you were to implement a connection pool and tuning requirement for production server?
Please do no hesitate to point me to blogs or resources online , all that I need is a approach that works for my scenario. your approach if you were to do this.
Thanks for reading this, everybody’s idea is welcomed…
You should just drop all this code and use Spring/Hibernate APIs instead: less bugs, less maintenance.
You can use a
GenericDaoand inject the required stuff with Spring.To strictly answer your question, here is what Reference Guide writes about the uuid generator:
So I consider it as safe. But I think your
StaleObjectExceptionare unrelated (it’s another problem).The best strategy is to just use it,
sessionFactory.getCurrentSession()will always give you aSessionscoped to the current database transaction aka a “contextual session”. Again, quoting the Reference Documentation:There is no need to implement your own
ThreadLocal-based solution nowadays, don’t do that.Well, the
HibernateTemplateis not deprecated but it is not recommended anymore and I prefer to implement template-less DAOs:Where the
SessionFactoryis injected by Spring. I suggest to read So should you still use Spring’s HibernateTemplate and/or JpaTemplate?? for complete background and also the whole section 13.3. Hibernate in the Spring documentation on ORM Data Access.Hmm… What? I would never implement my connection pool but use the one from my application server. Maybe you should clarify this question.
Update: In production, I wouldn’t use Hibernate built-in connection pool but configure Hibernate to use an application server provided JNDI datasource (and thus the application server connection pool). From the documentation: