Hi, I answered your question on SO, but, next time, please use the forum ( https://forum.hibernate.org/ ) or Twitter to send the SO question link. This mailing list is dedicated to discussions about developing Hibernate.
Thanks, Vlad On Fri, Apr 29, 2016 at 7:10 AM, Bhuvan Gupta <bhuva...@gmail.com> wrote: > Hello All, > > Link to question and discussion: > > > http://stackoverflow.com/questions/36920695/hibernate-and-transaction-using-method-annotation > > Below i have pasted whats in the link: > > Help/suggestion/advise/data points is really appreciated. > > Thanks in Advance: > > ------------------------------------------ > > Firstly, I have given few data points. > Next will be the problem described. > ------------------------------ > > *DATA POINTS:* > *[D1]* In Hibernate and Annotation and managed objects world, what i have > seen a common pattern like > > @Transactionalpublic void createStuff(..){// get entity manager and > call persist and other operatation}@Transactionalpublic SomeDtoObject > getStuff(..){// get entity manager and call find and getter to > polulate a object to return} > > In managed beans the Hibernate transaction is started and commited when we > call this methods. > > Hibernate doc says (link > < > https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/transactions.html > > > ): > > The most common pattern in a multi-user client/server application is > session-per-request. > > *[D2]* Also it is advised that connection to database should be pooled > using connection pool library C3P0 as stated on postgres documentation > (link > <https://jdbc.postgresql.org/documentation/91/thread.html>): > > Pg will usually complete the same 10,000 transactions faster by doing them > 5, 10 or 20 at a time than by doing them 500 at a time. > > *[D3]* Also with JDBC > > *Given a single connection we can run one transaction at a time and as many > statement as we like within that transaction.Its upto the application(C3P0) > to make sure that two different thread executing two different > transactional method should not use same connection and one should wait > before calling the other method .* > ------------------------------ > > *Problem:* > Now if we use the managed bean transaction pattern using annotation along > with a connection pool(*Let say only with 1 connection*) with hibernate and > session-per-request > Also let say the code is something like > > @Transactionalpublic SomeDtoObject getStuff(..){// get entity manager > and call find and getter to polulate a object to returnSomeEntity se = > entityManager.find(someentity, primaryKey);//create Dtos// access > someEntity to all over this method to create SomeDtoObject that we > have to return.// also may access some file on system to fetch some > data is order to populate someDtoObject.// overall let say the method > take 150 milli second to do all its work} > > Now imagine there are two different thread(T1, T2) called for getStuff(...) > T1 will enter the method and will acquire jdbc connection from connection > pool. > And when T2 will reach entityManager.find the C3P0 will check that there is > no connection left it will put T2 on hold till T1 complete the execution > which will take around 150 milli second. > > Ideally, Given that getStuff(...) is going to do read only querys, both > thread can use same connection and dont hold thread from executing queries. > In above case we are keep that connection idle and also keeping the thread > to wait. > > *MAIN QUESTION* > *Is there a way i can say to hibernate that a particular hibernate > transaction is readonly and hibernate can then reuse an already acquired > connection instead of asking for a new connection from the connection pool > ?* > ------------------------------ > > *Few solution found/suggested:(not convincing)* > > 1 > < > https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/transactions.html > > > If > you are so much worried, dont use transaction using annotation, use > hibernate session yourself..... no i like that pattern :) > 2 <https://jdbc.postgresql.org/documentation/91/thread.html> Hibernate > provide a ConnectionReleaselink > < > https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/transactions.html#transactions-connection-release > > > option > which can be set to after_statement. > *First* Hibernate C3P0 connection pool provider does not support > after_statement. > *Second* it will be a overhead just release and reacquire a connection. > _______________________________________________ > hibernate-dev mailing list > hibernate-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/hibernate-dev > _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev