Just for the record I found an answer (untested) to this over at the ZK list:
From: henrichen 1. ZK by default spawn a new event thread for each "event" handling unless you tell it not to. That is, unless you specify following in WEB-INF/zk.xml <system-config> <disable-event-thread/> </system-config> 2. I "guess" Cayanne "hold" something in its ThreadLocal variables for each request in servlet thread. 3. As said on 1, when a ZK event is going to be handled, a new event thread is spawn and run the event handling codes in the spawned event thread. 4. Therefore the ThreadLocal variables prepared by Cayanne does not exist in the event thread (though they exist in servlet thread) and cause issues. 5. ZK event thread mechanism is the base of the ZK modal window such as Messagebox. That is, if you disable the event thread mechanism as said in 1., you cannot use ZK modal window, either. If you don't need the ZK modal window, disable the ZK event thread mechanism shall solve your issue per your experiment. 6. OK. If you do need ZK's modal window support, here is an alternative. ZK provides a way that will "copy" thread local variables from servlet thread to event thread and vice versa automatically for you. However, you have to tell it what ThreadLocal variables to copy. e.g. To make ZK works well with Spring Security, you will have to specify in WEB-INF/zk.xml following codes. <listener> <description>ThreadLocal Synchronization Listener</description> <listener-class>org.zkoss.zkplus.util.ThreadLocalListener</listener-class> </listener> <preference> <name>ThreadLocal</name> <value> org.springframework.security.context.ThreadLocalSecurityContextHolderSt rategy=contextHolder </value> </preference> For Cayanne, you have to find out the associated ThreadLocal variables and specify it in the <preference> in the form of <value> class=variable </value> Please check the Javadoc of ThreadLocalListener for details 2008/8/26 Mike Kienenberger <[EMAIL PROTECTED]> > Mambo, you might also take a look at Steve's other thread on ZK and > thread-safety issues. > > http://osdir.com/ml/java.cayenne.user/2007-05/msg00067.html > > On 8/24/08, Steve Wells <[EMAIL PROTECTED]> wrote: > > The way I seem (seem as I am yet to *fully* test this) to have solved > that > > is to use Spring to create the ObjectContext and then you inject that in > to > > whatever else you want. This will not be Thread bound but Singleton, I > > guess in Spring you could write (or copy) a Thread bound scope if > required. > > eg: > > <bean id="myObjectContext" > class="org.apache.cayenne.access.DataContext" > > factory-method="createDataContext" scope="singleton"> > > <constructor-arg value="MyDomain"/> > > </bean> > > <!-- A data layer controller/convenience function layer --> > > <bean id="dataServices" class="com.mypackage.dataservices.DataServices"> > > <property name="objectContext"> > > <ref local="myObjectContext"/> > > </property> > > </bean> > > public class DataServices { > > private ObjectContext objectContext; > > > > public ObjectContext getObjectContext() { > > return objectContext; > > } > > > > public void setObjectContext(ObjectContext objectContext) { > > this.objectContext = objectContext; > > } > > > > > > HTH > > Steve > > 2008/8/23 mambo <[EMAIL PROTECTED]> > > > > > > > I've been looking through the mailing list and I can't find a definite > > > answer. I'm using ZK, I have added: > > > <filter> > > > <filter-name>CayenneFilter</filter-name> > > > > > > > <filter-class>org.apache.cayenne.conf.WebApplicationContextFilter</filter-class> > > > </filter> > > > <filter-mapping> > > > <filter-name>CayenneFilter</filter-name> > > > <url-pattern>/*</url-pattern> > > > </filter-mapping> > > > > > > to my web.xml. When I try "DataContext context = > > > DataContext.getThreadDataContext();" I get an exception that says > "Current > > > thread has no bound DataContext". I'm figuring this is because ZK is > multi > > > threaded. I'm pretty new to Java so I'm not really comfortable trying > to > > > hack the cayanne source to get things to run. Is there a solution for > this? > > > If i created a new Datacontext with each Database request, how badly > would > > > that affect performance of my web app? > > > > > >
