JdbcSession is a centralization of JDBC/transaction handliong (managing 
the flow of events between the 2).  I picked the name as I said because 
it models the concept on the database side of a session (which is a 
"connection"+transaction).

TransactionCoordinator is its exposed conceptualization of its 
transactionality.  There are (currently just 2) concrete impls 
(TransactionCoordinatorJdbcImpl and TransactionCoordinatorJtaImpl) for 
the different usage environments.

The other major components of the JdbcSession are the "logical 
connection" and the "resource registry".

In regards to the inter-play between components for transactions, it 
all centers on the TransactionCoordinator.  Think of this guy as the 
thing that manages all aspects of transactionality as far as Hibernate 
is concerned.  I personally like to think of these as "flows".  There 
are 2 flows when we talk about transactions.  I personally call them 
inflow and outflow:

1) Outflow is the actual management of the "physical transaction".  
Outflow is when we tell the jdbc connection to start or complete a 
transaction or when we tell the jta system to start or complete a 
transaction.
2) Inflow is the process of "transaction events" causing Hibernate to 
have to "do something".  For example, when a transaction is about to 
complete we might need to initiate a flush, or release jdbc resources, 
etc.

TransactionCoordinator coordinates all these behavoirs.  Like I said 
there are 2 distinct flavors of this now because I think it simplifies 
the code to do that (polymorphism), rather than to have a single piece 
of code attempt to handle all cases via if/else blocks.

TransactionCoordinatorJdbcImpl is actually already fully hooked up.  It 
works exactly like discussed in the README.  But this one was easier.  
Here inflow and outflow are really the same, and they are demarcated 
and initiated via the "local transaction", which is the client view of 
"transaction management".  Ultimately "local transaction" maps back to 
org.hibernate.Transaction, but that integration wont get done until 
after we integrate this all back upstream[1].  The integration point 
between the "local transaction" (org.hibernate.Transaction) and the 
TransactionCoordinator is the 
org.hibernate.resource.transaction.PhysicalTransactionInflow[2].  Its 
through this link that the user's transaction requests feed back into 
the TransactionCoordinator and get handled there appropriately.  On the 
jdbc-transaction side this ultimately needs to get routed to the 
PhysicalJdbcTransaction to handle "outflow" and to the 
TransactionCoordinator to handle "inflow".

The mechanism would be exactly the same for JTA as well insofar as the 
general Transaction -> PhysicalTransactionInflow -> 
TransactionCoordinator flow.  I simply paused wiring up the JTA side 
until the Synchronization thing got decided.


[1] BTW, I should point out that this all completely removes the need 
for TransactionFactory as it is today.  Upstream TransactionFactory is 
a factory for different concrete "local transaction" implementations.  
Given the proposed changes we would have just one "local transaction" 
implementation, since all the variation is handled behind the 
TransactionCoordinator.

[2] As I said up front, this is badly named and I am already changing 
this locally to PhysicalTransactionDelegate





On Fri 06 Dec 2013 09:51:38 PM CST, Gail Badner wrote:
> I've been trying to sort out the relationships between JdbcSession, 
> Transaction, TransactionCoordinatorJdbcImpl, PhysicalJdbcTransaction, 
> TransactionCoordinatorJtaImpl, and PhysicalJtaTransaction.
>
> I've only looked at the ReadMe so far. Have you started fleshing that out in 
> the code? I've kind of guessed what you mean in the ReadMe and created 
> https://gist.github.com/gbadner/7837050 . Feel free to ignore this gist if 
> you've already started fleshing this out.
>
> I'm not sure how the synchronizations all work for each case, but I imagine 
> it will really help clean up the logic splitting up the cases (which is 
> great!).
>
> Regards,
> Gail
>
> ----- Original Message -----
>> From: "Steve Ebersole" <st...@hibernate.org>
>> To: "Gail Badner" <gbad...@redhat.com>
>> Cc: "Sanne Grinovero" <sa...@hibernate.org>, "hibernate-dev" 
>> <hibernate-dev@lists.jboss.org>, "Tom Jenkinson"
>> <tom.jenkin...@redhat.com>, "Scott Marlow" <smar...@redhat.com>
>> Sent: Friday, December 6, 2013 7:09:16 PM
>> Subject: Re: [hibernate-dev] JdbcSession proposal
>>
>> On Fri 06 Dec 2013 05:10:10 PM CST, Gail Badner wrote:
>>
>>>
>>> It would be nice to make the return value generic:
>>>
>>> public T accept(PreparedStatementQueryOperation operation, Class<T>
>>> resultClass);
>>
>>
>> 95 times out of 100 inside Hibernate code we really can't take advantage
>> of the parameterized type. So its less important in my mind. Like I said
>> earlier, the intent here is not to build a general purpose JDBC
>> abstraction library.
>>
>> But if you look at Operation you can see it is parameterized
>> (Operation<T>) and that accept() leverages that:
>>
>> public <T> T accept(Operation<T> operation);
>>
>>
>>>
>>> I can see the merit of breaking out
>>> PreparedStatementQueryOperation.getStatementPreparer(),
>>> getStatementExecutor().execute(), and
>>> getResultSetProcessor().extractResults(), as opposed to
>>> PreparedStatementQueryOperation.prepare(), execute(), extractResults().
>>>
>>> I think there should also be a
>>> PreparedStatementQueryOperation.getStatementBinder() returning a
>>> StatementBinder, since it's really a step that is separate from preparing.
>>
>>
>> Yep, I contemplated the same.
>>
>>>
>>> In the case where operation.holdOpenResources() == true, which object
>>> would hold the open resources? If it's JdbcSession that manages them,
>>> there would also need to be JdbcSession.closeResources( operation );
>>> otherwise, something like
>>> PreparedStatementQueryOperation.closeResources() would be needed.
>>
>> Its the ResourceRegistry which in the actual code.  It does not segment
>> resources by the operation they come from atm.  The only thing it x-refs
>> is Statement->ResultSets.  I am not sure it is worth the overhead to do
>> this segmenting either.
>>
>> But you are correct, if we did segment these registered resources by
>> operation we would need a level of releasing them by operation too.
>>
_______________________________________________
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev

Reply via email to