Got it On Fri, Apr 29, 2016 at 11:46 AM, Vlad Mihalcea <mihalcea.v...@gmail.com> wrote:
> 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