You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2009/09/11 00:44:08 UTC

svn commit: r813625 - in /cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization: BaseSerializer.java xstream/PersistentMarshalConverter.java xstream/XStreamSerializer.java

Author: aadamchik
Date: Thu Sep 10 22:44:07 2009
New Revision: 813625

URL: http://svn.apache.org/viewvc?rev=813625&view=rev
Log:
prototyping (de)serializer based on XStream

parameterizing fetch size

Added:
    cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/BaseSerializer.java
Modified:
    cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/PersistentMarshalConverter.java
    cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/XStreamSerializer.java

Added: cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/BaseSerializer.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/BaseSerializer.java?rev=813625&view=auto
==============================================================================
--- cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/BaseSerializer.java (added)
+++ cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/BaseSerializer.java Thu Sep 10 22:44:07 2009
@@ -0,0 +1,28 @@
+package org.apache.cayenne.serialization;
+
+import java.io.OutputStream;
+
+public abstract class BaseSerializer implements SubgraphSerializer {
+
+	protected int statementFetchSize;
+
+	public abstract <T> void serialize(T object, Subgraph<T> subgraph,
+			OutputStream out);
+
+	public int getStatementFetchSize() {
+		return statementFetchSize;
+	}
+
+	/**
+	 * Sets a JDBC Statement "fetch size", which is a critical hint for
+	 * serializing large datasets.
+	 * <p>
+	 * MySQL Note: per <a href="http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-implementation-notes.html"
+	 * >MySQL docs</a> to enable streaming fetch size must be equal to
+	 * Integer.MIN_VALUE. For other databases it should be a non-negative number
+	 * per JDBC standard.
+	 */
+	public void setStatementFetchSize(int statementFetchSize) {
+		this.statementFetchSize = statementFetchSize;
+	}
+}

Modified: cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/PersistentMarshalConverter.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/PersistentMarshalConverter.java?rev=813625&r1=813624&r2=813625&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/PersistentMarshalConverter.java (original)
+++ cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/PersistentMarshalConverter.java Thu Sep 10 22:44:07 2009
@@ -44,9 +44,12 @@
 			+ "_TRAVERSAL_CONTEXT";
 
 	private Subgraph<T> subgraph;
+	private int statementFetchSize;
 
-	public PersistentMarshalConverter(Subgraph<T> subgraph) {
+	public PersistentMarshalConverter(Subgraph<T> subgraph,
+			int statementFetchSize) {
 		this.subgraph = subgraph;
+		this.statementFetchSize = statementFetchSize;
 	}
 
 	public void marshal(Object object, HierarchicalStreamWriter writer,
@@ -142,14 +145,9 @@
 		RelationshipQuery query = new RelationshipQuery(persistent
 				.getObjectId(), arc.getName());
 
-		// "fetchSize" is absolutely critical on MySQL and probably other DB's
-		// to avoid storing the entire ResultSet in memory.
-
-		// TODO: caveat: a negative number is for MySQL per
-		// http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-implementation-notes.html
-		// For other DB's this hint may also be needed, but it should be a non
-		// negative number
-		query.setStatementFetchSize(Integer.MIN_VALUE);
+		// "fetchSize" is absolutely critical to avoid storing the entire
+		// ResultSet in memory.
+		query.setStatementFetchSize(statementFetchSize);
 
 		DataContext dataContext = (DataContext) persistent.getObjectContext();
 

Modified: cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/XStreamSerializer.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/XStreamSerializer.java?rev=813625&r1=813624&r2=813625&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/XStreamSerializer.java (original)
+++ cayenne/sandbox/cayenne-xstream/src/main/java/org/apache/cayenne/serialization/xstream/XStreamSerializer.java Thu Sep 10 22:44:07 2009
@@ -20,13 +20,14 @@
 
 import java.io.OutputStream;
 
+import org.apache.cayenne.serialization.BaseSerializer;
 import org.apache.cayenne.serialization.Subgraph;
-import org.apache.cayenne.serialization.SubgraphSerializer;
 
 import com.thoughtworks.xstream.XStream;
 
-public class XStreamSerializer implements SubgraphSerializer {
+public class XStreamSerializer extends BaseSerializer {
 
+	@Override
 	public <T> void serialize(T object, Subgraph<T> subgraph, OutputStream out) {
 
 		// TODO: make sure all the converters are stateless... then we can cache
@@ -34,7 +35,8 @@
 		XStream xstream = XStreamUtil.defaultXStream(subgraph.getRootNode()
 				.getClassDescriptor());
 
-		xstream.registerConverter(new PersistentMarshalConverter<T>(subgraph));
+		xstream.registerConverter(new PersistentMarshalConverter<T>(subgraph,
+				statementFetchSize));
 		xstream.registerConverter(new ObjectIdMarshalConverter());
 
 		xstream.toXML(object, out);