[keycloak-dev] JPA connections provider and multiple transaction support

Stian Thorgersen stian at redhat.com
Mon Jul 14 05:19:12 EDT 2014


Committed the final changes to UserProvider, including working Mem, JPA and Mongo implementations.

Also, added the JPA and Mongo Connection Providers. With the connection providers we can now have a single EntityManager instance shared between ModelProvider (and UserProvider when ready), UserSessionProvider and Audit.

Had to change the multiple-transaction stuff that was added to master because with the connection providers the model (and others) do not actually start a transaction themselves. Transactional providers are now required to enlist a transaction if they want to, this won't be common to do as they should use the connection providers which will do it for them.

----- Original Message -----
> From: "Stian Thorgersen" <stian at redhat.com>
> To: "Bill Burke" <bburke at redhat.com>
> Cc: keycloak-dev at lists.jboss.org
> Sent: Monday, 14 July, 2014 9:13:44 AM
> Subject: Re: [keycloak-dev] JPA connections provider and multiple transaction support
> 
> I had this working, including sharing Jpa/Mongo connection providers. Which I
> sent out an email to get feedback for......
> 
> ----- Original Message -----
> > From: "Bill Burke" <bburke at redhat.com>
> > To: keycloak-dev at lists.jboss.org
> > Sent: Saturday, 12 July, 2014 12:42:07 AM
> > Subject: Re: [keycloak-dev] JPA connections provider and multiple
> > transaction support
> > 
> > Ok, I committed something.
> > 
> > * KeycloakSession keeps track of enlisted provider KeycloakTransactions.
> > * KeycloakSession.getTransaction().commit() and rollback() will iterate
> > these enlisted transactions
> > * getProvider() just returns a provider
> > * model() and sessions() creates a ModelProvider or UserSessionProvider
> > and enlists their transactions.
> > * model() and sessions() throw IllegalStateException if
> > KeycloakSession.transaction hasn't started yet.
> > * KeycloakSession has an enlist() method.
> > 
> > 
> > 
> > 
> > 
> > On 7/11/2014 6:11 PM, Bill Burke wrote:
> > > Actually I think there is a better way.
> > >
> > > public interface TransactionManaged {
> > >
> > >      KeycloakTransaction getTransaction();
> > > }
> > >
> > > public interface KeycloakSession implements TransactionManaged {}
> > > public interface UserProvider implements TransactionManaged{}
> > >
> > > etc.
> > >
> > >
> > > KeycloakSession.getProvider() will check to see if the provider is
> > > transaction managed.  If KeycloakSession has an active transaction, then
> > > a transaction will be created for that provider and registered with an
> > > internal TM.
> > >
> > >
> > >
> > >
> > > On 7/11/2014 3:52 PM, Bill Burke wrote:
> > >> Please get this in.  I can't finish with UserProvider split until you
> > >> do.
> > >>
> > >> On 7/11/2014 8:29 AM, Stian Thorgersen wrote:
> > >>> To prevent creating multiple EntityManager's for a single request I've
> > >>> added a JPAConnectionProvider that is used to share an EntityManager
> > >>> instance between multiple providers.
> > >>>
> > >>>      https://github.com/stianst/keycloak/blob/master/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java
> > >>>      https://github.com/stianst/keycloak/blob/master/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProvider.java
> > >>>
> > >>> In the future we could consider adding support for multiple
> > >>> persistence-units, but for now I think we should have a limitation that
> > >>> all JPA providers use the same database/persistence-unit.
> > >>>
> > >>> I've also added some very basic support to KeycloakSession so providers
> > >>> can enlist their transactions with the session:
> > >>>
> > >>>      https://github.com/stianst/keycloak/blob/master/model/api/src/main/java/org/keycloak/models/KeycloakSession.java
> > >>>      https://github.com/stianst/keycloak/blob/master/model/api/src/main/java/org/keycloak/models/KeycloakTransactionManager.java
> > >>>
> > >>> The idea being that a provider when used can enlist its transaction
> > >>> with
> > >>> the session.
> > >>>
> > >>> I've not committed any of this to master as I wanted to have everyone's
> > >>> opinion on it first.
> > >>> _______________________________________________
> > >>> keycloak-dev mailing list
> > >>> keycloak-dev at lists.jboss.org
> > >>> https://lists.jboss.org/mailman/listinfo/keycloak-dev
> > >>>
> > >>
> > >
> > 
> > --
> > Bill Burke
> > JBoss, a division of Red Hat
> > http://bill.burkecentral.com
> > _______________________________________________
> > keycloak-dev mailing list
> > keycloak-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/keycloak-dev
> > 
> _______________________________________________
> keycloak-dev mailing list
> keycloak-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/keycloak-dev
> 


More information about the keycloak-dev mailing list