You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by bob <sa...@gmail.com> on 2007/06/04 10:46:14 UTC

Re: Serialization of datacontext

Hi

I debugged this a bit and notice the following:

on DataContext serialization the following code is executed in 
writeObject(ObjectOutputStream)

         ...
         // Serialize local snapshots cache
         if (!isUsingSharedSnapshotCache()) {
             out.writeObject(objectStore.getDataRowCache());
         }
         ...

So if useSharedCache is false, the ObjectStore's DataRowStore is also 
serialized.

DataRowStore's reference to EventManager is transient and not 
serialized. So upon deserialization, when DataRowStore is read back 
in, the EventManager is null and this caused the exception below.

What is the best way to fix this? EventManager should not be 
transient? Or a new EventManager should be created in 
DataRowStore.readObject(ObjectInputStream)?

regards

bob

bob wrote:
> Hi all
> 
> Using cayenne 1.2.3 and jdk 1.5 on Windows XP.
> 
> Sometimes while developing with Tomcat I get the following exception. 
> Seems to happen on serialization of DataContext along with the session. 
> Below the exception is a little test class to reproduce this. Note that 
> if useSharedCache = true, then there is no exception. Should I open a 
> JIRA issue or is this expected behavior?
> 
> 
> Exception in thread "main" 
> org.objectstyle.cayenne.CayenneRuntimeException: [v.1.2.3 May 6 2007] 
> Commit Exception
> org.objectstyle.cayenne.access.DataContext.flushToParent(DataContext.java:1290) 
> 
> org.objectstyle.cayenne.access.DataContext.commitChanges(DataContext.java:1166) 
> 
> test.SerializeDCTest.main(SerializeDCTest.java:29)
> 
> Caused by: java.lang.NullPointerException
> org.objectstyle.cayenne.access.DataRowStore.sendUpdateNotification(DataRowStore.java:709) 
> 
> org.objectstyle.cayenne.access.DataRowStore.processSnapshotChanges(DataRowStore.java:574) 
> 
> org.objectstyle.cayenne.access.DataDomainFlushAction.postprocess(DataDomainFlushAction.java:278) 
> 
> org.objectstyle.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:178) 
> 
> org.objectstyle.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:846)
> org.objectstyle.cayenne.access.DataDomain$2.transform(DataDomain.java:817)
> org.objectstyle.cayenne.access.DataDomain.runInTransaction(DataDomain.java:872) 
> 
> org.objectstyle.cayenne.access.DataDomain.onSync(DataDomain.java:814)
> org.objectstyle.cayenne.access.DataContext.flushToParent(DataContext.java:1262) 
> 
> 
> 
> package test;
> 
> public class SerializeDCTest {
> 
>     public SerializeDCTest() {
>     }
> 
>     public static void main(String[] args) {
>         //boolean useSharedCache = true; //works
>         boolean useSharedCache = false;
>         DataContext context = 
> DataContext.createDataContext(useSharedCache);
>         context = serializeDC(context);
>         Employee emp = (Employee) DataObjectUtils.objectForPK(context, 
> Employee.class, 740);
>         emp.setFirstname("test" + Math.random());
>         context.commitChanges();
>     }
> 
>     public static DataContext serializeDC(DataContext dc) {
>         try {
>             ByteArrayOutputStream bos = new ByteArrayOutputStream();
>             ObjectOutputStream oos = new ObjectOutputStream(bos);
>             oos.writeObject(dc);
> 
>             ByteArrayInputStream is = new 
> ByteArrayInputStream(bos.toByteArray());
>             ObjectInputStream ois = new ObjectInputStream(is);
>             DataContext result = (DataContext) ois.readObject();
>             return result;
> 
>         } catch (Exception ex) {
>             throw new RuntimeException("DataContext serialization 
> failed", ex);
>         }
>     }
> }
> 
> 
> kind regards
> 
> bob
> 
> 


Re: Serialization of datacontext

Posted by Andrus Adamchik <an...@objectstyle.org>.
Could you please open a bug report? We'll need to do some testing to  
settle on the best strategy (I am leaning towards not serializing the  
local DataRowStore at all, and rebuilding it on deserialization  
instead).

Thanks
Andrus

On Jun 4, 2007, at 11:46 AM, bob wrote:

> Hi
>
> I debugged this a bit and notice the following:
>
> on DataContext serialization the following code is executed in  
> writeObject(ObjectOutputStream)
>
>         ...
>         // Serialize local snapshots cache
>         if (!isUsingSharedSnapshotCache()) {
>             out.writeObject(objectStore.getDataRowCache());
>         }
>         ...
>
> So if useSharedCache is false, the ObjectStore's DataRowStore is  
> also serialized.
>
> DataRowStore's reference to EventManager is transient and not  
> serialized. So upon deserialization, when DataRowStore is read back  
> in, the EventManager is null and this caused the exception below.
>
> What is the best way to fix this? EventManager should not be  
> transient? Or a new EventManager should be created in  
> DataRowStore.readObject(ObjectInputStream)?
>
> regards
>
> bob
>
> bob wrote:
>> Hi all
>> Using cayenne 1.2.3 and jdk 1.5 on Windows XP.
>> Sometimes while developing with Tomcat I get the following  
>> exception. Seems to happen on serialization of DataContext along  
>> with the session. Below the exception is a little test class to  
>> reproduce this. Note that if useSharedCache = true, then there is  
>> no exception. Should I open a JIRA issue or is this expected  
>> behavior?
>> Exception in thread "main"  
>> org.objectstyle.cayenne.CayenneRuntimeException: [v.1.2.3 May 6  
>> 2007] Commit Exception
>> org.objectstyle.cayenne.access.DataContext.flushToParent 
>> (DataContext.java:1290)  
>> org.objectstyle.cayenne.access.DataContext.commitChanges 
>> (DataContext.java:1166) test.SerializeDCTest.main 
>> (SerializeDCTest.java:29)
>> Caused by: java.lang.NullPointerException
>> org.objectstyle.cayenne.access.DataRowStore.sendUpdateNotification 
>> (DataRowStore.java:709)  
>> org.objectstyle.cayenne.access.DataRowStore.processSnapshotChanges 
>> (DataRowStore.java:574)  
>> org.objectstyle.cayenne.access.DataDomainFlushAction.postprocess 
>> (DataDomainFlushAction.java:278)  
>> org.objectstyle.cayenne.access.DataDomainFlushAction.flush 
>> (DataDomainFlushAction.java:178)  
>> org.objectstyle.cayenne.access.DataDomain.onSyncFlush 
>> (DataDomain.java:846)
>> org.objectstyle.cayenne.access.DataDomain$2.transform 
>> (DataDomain.java:817)
>> org.objectstyle.cayenne.access.DataDomain.runInTransaction 
>> (DataDomain.java:872)  
>> org.objectstyle.cayenne.access.DataDomain.onSync(DataDomain.java:814)
>> org.objectstyle.cayenne.access.DataContext.flushToParent 
>> (DataContext.java:1262) package test;
>> public class SerializeDCTest {
>>     public SerializeDCTest() {
>>     }
>>     public static void main(String[] args) {
>>         //boolean useSharedCache = true; //works
>>         boolean useSharedCache = false;
>>         DataContext context = DataContext.createDataContext 
>> (useSharedCache);
>>         context = serializeDC(context);
>>         Employee emp = (Employee) DataObjectUtils.objectForPK 
>> (context, Employee.class, 740);
>>         emp.setFirstname("test" + Math.random());
>>         context.commitChanges();
>>     }
>>     public static DataContext serializeDC(DataContext dc) {
>>         try {
>>             ByteArrayOutputStream bos = new ByteArrayOutputStream();
>>             ObjectOutputStream oos = new ObjectOutputStream(bos);
>>             oos.writeObject(dc);
>>             ByteArrayInputStream is = new ByteArrayInputStream 
>> (bos.toByteArray());
>>             ObjectInputStream ois = new ObjectInputStream(is);
>>             DataContext result = (DataContext) ois.readObject();
>>             return result;
>>         } catch (Exception ex) {
>>             throw new RuntimeException("DataContext serialization  
>> failed", ex);
>>         }
>>     }
>> }
>> kind regards
>> bob
>
>