I am wondering if it makes sense to create the scoped EntityManager as a 
singleton service to be then @Referenced by the various repositories.   I have 
various repository classes that need the EntityManager, all would need to have 
some code like this:

        @Reference(target = "(osgi.unit.name=myPersistenUnit)")
        private JPAEntityManagerProvider provider;

        private EntityManager em;

        @Activate
        void init() {
          em = provider.getResource(txControl);
        }


So each Repository component creates its own Scoped EntityManager. Does it make 
sense to have one component in the application that creates a single EM and 
have the various repositories use that one from the Service Registry?

Best regards,
Alex soto




> On Feb 6, 2019, at 4:40 PM, Tim Ward <tim.w...@paremus.com> wrote:
> 
> The relevant specification for learning about scoped resources (which is what 
> the ResourceProvider gives you) is the Transaction Control Specification. In 
> this case your question is covered by Section 147.2.5 Multi Threading 
> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.transaction.control.html#d0e127038>.
>  
> 
> Scoped resources are always thread safe and designed to be singleton objects 
> used across multiple scopes. The underlying scoped resource implementation 
> then delegates to a real resource instance that is bound to the current 
> scope. The result is that the real resource never sees multi-threaded access 
> (a scope is bound to a single thread) and that you never need to worry about 
> creating/closing the resource because the “real resource” is automatically 
> created (or retrieved from a pool) on first use within a scope and then 
> closed (or returned to the pool) when the scope finishes. 
> 
> Best Regards,
> 
> Tim
> 
>> On 6 Feb 2019, at 22:14, Alex Soto <alex.s...@envieta.com 
>> <mailto:alex.s...@envieta.com>> wrote:
>> 
>> Actually, I took a stab at this again since I had some spare time now.  I am 
>> almost done. It looks promising.
>> 
>> The only question I have is about the entity manager.  In the examples, I 
>> see an entity manager is obtained in the activate method, and used for the 
>> rest of the life of the component:
>> 
>>      private EntityManager em;
>> 
>>      @Activate
>>      void init() {
>>              em = provider.getResource(txControl);
>>      }
>> 
>> 
>> Is this safe in a multi threaded environment? I expect the component to be 
>> called concurrently. 
>> Section 127.3.3 of OSGi Companion states that "An Entity Manager is intended 
>> to be used by a single session, it is not thread safe.” So I am confused 
>> since all examples seem to be ignoring this.
>> 
>> 
>> Best regards,
>> Alex soto
>> 
>> 
>> 
>> 
>>> On Feb 6, 2019, at 3:16 PM, Tim Jones <t...@mccarthy.co.nz 
>>> <mailto:t...@mccarthy.co.nz>> wrote:
>>> 
>>> Hi Alex,
>>> 
>>> yes it is possible to use tx-control with Karaf, we have been using it on
>>> v4.0.5 in our production system for about 18 months with no issues. One of
>>> the main reasons we use tx-control is that is it 'backed' by a standard.
>>> Rightly or wrongly we also didn't have confidence in Aries JPA Template at
>>> the time we were considering transaction managment solutions to manage our
>>> transactions in a production environment (perhaps this was misguided) but we
>>> were concerned that there were few integrated tests for that project where
>>> as there are over 2000 lines of test code for tx-control which demonstrate
>>> sucess and failure cases for JPA, JDBC, non-XA, XA, last gambit wins,
>>> commit, rollback depending upon exception type and much more.
>>> 
>>> I think the enRoute project has some examples
>>> https://enroute.osgi.org/examples/023-examples-microservice-jdbc.html 
>>> <https://enroute.osgi.org/examples/023-examples-microservice-jdbc.html> and
>>> the tx-control test code is worth looking at.
>>> 
>>> Tim
>>> 
>>> 
>>> 
>>> --
>>> Sent from: http://karaf.922171.n3.nabble.com/Karaf-User-f930749.html 
>>> <http://karaf.922171.n3.nabble.com/Karaf-User-f930749.html>
>> 
> 

Reply via email to