You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by mambo <ik...@gmail.com> on 2008/08/22 18:01:00 UTC

Current thread has no bound DataContext (zk integration)

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?

Re: Current thread has no bound DataContext (zk integration)

Posted by Steve Wells <we...@gmail.com>.
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 <mk...@gmail.com>

> 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 <we...@gmail.com> 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 <ik...@gmail.com>
> >
> >
> >  > 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?
> >  >
> >
>

Re: Current thread has no bound DataContext (zk integration)

Posted by Mike Kienenberger <mk...@gmail.com>.
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 <we...@gmail.com> 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 <ik...@gmail.com>
>
>
>  > 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?
>  >
>

Re: Current thread has no bound DataContext (zk integration)

Posted by Steve Wells <we...@gmail.com>.
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 <ik...@gmail.com>

> 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?
>