Hi,
first: Yes, when a session handle is closed, the underlying connection
stays alive and is returned to the pool (I'm not a Jackrabbit developer,
but all of my tests show exactly that + there hasn't been any
contradiction on this mailing-list yet :)).
Second: Good questions and I'm, too, struggling with the answers for my
own application. However, what I can say is (again, not a developer, but
tests and no contradictions), that you do not have to call
session.logout if the bindSessionToTransaction-flag is set to true and
all of your methods are executed within a container or bean managed
transaction. So no memory leak there (of course, you have to call
session.logout if there is no transaction around). And if all of your
session bean methods do have a TransactionAttribute of "required" (which
is the default), then bindSessionToTransaction = true is basically the
same as calling session.login and session.logout in every method.
I don't know the best way to take yet, either.
Currently I also added the flag <application-managed-security/> to my
jcr-ds.xml so that the sessions in the pool are distinguished by the
repository.login-credentials (as far as I know, now user x never uses a
session user y has used before). Furthermore I have the
bindSessionToTransaction-flag set to true, so theoretically I shouln't
have to worry much about handling and logging out the sessions. As you
can see in another eMail on this list ("Jackrabbit, JCA, JBoss, EJB and
transactions"), I have a problem with that configuration, though.
You can find some more configurable flags for your jcr-ds.xml e.g. on
[1] (at least those flags seem to work for the JBoss implementation of
the JCA).
Best regards
Dominik
[1] http://community.jboss.org/wiki/ConfigJCACommon
Am 13.08.2010 07:34, schrieb jason wang:
Hi,Thank you very much for your reply.
So when the session handle is closed, the underlying connection is NOT closed,
because the actual session is returned to the pool, is that right? But what
would be the correct way to manage JackRabbit session in a stateless session
bean? For example,
If I set bindSessionToTransaction-flag to false, then when should I call
session.logout() in order to release resource?
If I set bindSessionToTransaction-flag to true, and a session is closed when
the transaction commit, does that mean I don't need to invoke the
session.logout method? No memory leak?
Another approach is to call session login, and session logout in every method
of the bean? but I doubt this is a good design.
Thanks a lot for your help.Jason
Date: Thu, 12 Aug 2010 13:02:14 +0200
From: [email protected]
To: [email protected]
Subject: Re: session.logout throws Exception : Inactive logical session handle
called
Hi,
I think you must pay attention to the fact, that your are connecting to
Jackrabbit via the JCA package. This package realizes a JCA adapter, in
conjunction with this adapter the application server is able to keep a
pool of JCR sessions. This pool keeps the actual JCR sessions. What you
are dealing with in your session beans are not the actual JCR sessions,
but session handles, proxies so to speak, provided by the JCA package.
Due to the bindSessionToTransaction-flag these JCA session handles are
closed whenever a container managed or bean managed transaction commits.
However, the actual JCR sessions associated with these session handles
are not closed, but kept alive in a pool.
So your error probably occurs, because the JCA session handle is already
closed (due to a transaction commit) when you call the session.isLive()
oder session.logout() in the @PreDestroy method.
At least this is how I understand it... :)
Am 12.08.2010 10:36, schrieb jason wang:
Hi,Can someone help me with the following problem.I have a stateless session bean which has the following
methods: @PostConstruct private void initialize(){ try { session =
repository.login(new SimpleCredentials("username", "password".toCharArray()));
}catch (LoginException e) { }catch(RepositoryException e){ } }
@PreDestroy private void cleanup(){ if (session!=null&& session.isLive()){
session.logout(); session=null; } } public
void addCategory(String absPath, JRCategory jrCategory){
try {
Node parentNode = session.getNode(absPath);
Node categoryNode = parentNode.addNode(jrCategory.getCategoryName(),
"nt:unstructured");
session.save();
}
}catch( ItemExistsException e){
}catch (PathNotFoundException e) {
} catch (RepositoryException e) {
}
}The jcr-ds.xml file has the following:<connection-factories> <tx-connection-factory> <jndi-name>jcr/local</jndi-name> <xa-transaction/> <rar-name>jackrabbit-jca-2.1.0.rar</rar-name>
<connection-definition>javax.jcr.Repository</connection-definition> <config-property name="homeDir" type="java.lang.String">D:\repositoryJR</config-property> <config-property name="configFile"
type="java.lang.String">repository.xml</config-property> <config-property name="repositoryURI" type="java.lang.String">jcr-jackrabbit://jackrabbit</config-property> <config-property
name="bindSessionToTransaction" type="java.lang.Boolean">true</config-property> </tx-connection-factory></connection-factories>When the session.logout() is executed, I got the "Inactive logical session handle called" exception.Is
this because the session is already closed when JTA transaction commits? How should I fix this problem?thanks a lot.Jason