As mentioned previously I have started using a SessionFactory approach when working with session to Domino using Corba/DIIOP. I forgot forever to mention that you should really combine the use of the SessionFactory with a servlet filter to recycle() the session once the thread has completed. The filter could be as simple as this:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import dk.horisontnet.domino.SessionFactory;
public class CloseSessionFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
// do work from other filters
chain.doFilter(req, res);
// close session
SessionFactory.closeSession();
}
}
The above filter uses a new method in the SessionFactory class called closeSession():
public static void closeSession() {
try {
// declarations
Session session = null;
// look for a session in the thread local
session = (Session)pSession.get();
if (null != session) {
session.recycle();
pSession.set(null);
}
} catch (Exception e) {
// do nothing but log it
logger.warn("Exception thrown while closing session to Domino", e);
}
}
Deploy the filter via web.xml as described previously.
Update on 13/Feb/06: Remember to nullify the ThreadLocal (code in bold above) after recycling the Domino session to avoid having a recycled session being reused once the thread is reused from Tomcats thread pool. Failure to do so will result in the dreaded “Object no longer exists on server”-NotesException.