Hi Eric,

comments inside..

2010/5/6 Eric I. <[email protected]>:
> Tim-Christian Mundt <dev <at> tim-erwin.de> writes:
>> > Alfresco's JCR implementation only allows one session per thread.
>> I think Alfresco stores the session stuff in a Thread Local variable (at
>> least using web services), so there can be only one active session at a
>> time per thread. However, what does prevent you from simply creating a
>> new one overriding the old (which is then lost of course)? Does it throw
>> an exception?
>
> Yes, it does throw an exception --
>
> javax.jcr.RepositoryException: Only one active session is allowed per thread.
>        at
> org.apache.james.imap.jcr.JCRMailboxManager.getSession
>        (JCRMailboxManager.java:115)
>        at
> org.apache.james.imap.jcr.JCRMailboxManager.createMailboxMapper
>        (JCRMailboxManager.java:91)
>        at org.apache.james.imap.jcr.JCRMailboxManager.doCreate
>        (JCRMailboxManager.java:123)
>        at
> org.apache.james.imap.store.StoreMailboxManager.createMailbox
>        (StoreMailboxManager.java:198)
> ...
>
>> On the other hand:
>> > 2) And is there a good reason not to change James IMAP's JCR implementation
> to re-use JCR sessions rather
>> than create new ones for a given client?
>> >
>> Sessions contain transactions, so if one mailbox is accessed from
>> several clients simultaneously, we need one session for each client.
>> Using the global mailbox/manager there is definitely a need for creating
>> several sessions, unless I'm mistaken. Each IMAP request needs its own
>> transaction, hence sessions cannot be shared.
>> Within one single request I think we don't need several sessions. The
>> JCR sessions should simply be stored in the James sessions. So
>> "getSession" in Mailbox and MailboxManager would need to be slightly
>> adjusted.
>
> So that makes sense -- a client can make multiple requests, each request gets
> its own JCR session. Quickly scanning the current IMAP code it does not appear
> that threads are spawned to handle various requests from a given client. In
> other words, it appears as though a given client's requests are serialized. Is
> that correct? If so, then I'd think that a session can be made at the start 
> of a
> request's processing, and then .logout() can be called on the JCR session to
> release it. The same thread would get a new JCR session when it processes the
> next request.
>
> Eric

My plan would be to have some kind of request scoped session pattern.
Something like this but just for JCR/JPA etc..:

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.html

So the Session/EntityManager is re-used the whole request.
For this it should get created in teh startProcessingRequest(...)
method and closed in the endProcessingRequest(...) method.

Bye,
Norman

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to