Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2012-10-30 12:15:01 +0000
committerEike Stepper2012-10-30 12:15:01 +0000
commitcd7c758a5c0887ea43c769c4aa276a3157debe6a (patch)
treec9ed6f8e189a8d7447613d6f4840e3b0bad57334 /plugins/org.eclipse.emf.cdo.server.db/src/org
parent2f8c489d32d48e9fb686a1e2ed2f092c8cebb823 (diff)
downloadcdo-cd7c758a5c0887ea43c769c4aa276a3157debe6a.tar.gz
cdo-cd7c758a5c0887ea43c769c4aa276a3157debe6a.tar.xz
cdo-cd7c758a5c0887ea43c769c4aa276a3157debe6a.zip
[370105] [DB] CommitException: SELECT-statement already in cache
https://bugs.eclipse.org/bugs/show_bug.cgi?id=370105
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.db/src/org')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java33
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java42
2 files changed, 41 insertions, 34 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java
index 32320da6d0..3b92ce2c1b 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java
@@ -56,6 +56,7 @@ import org.eclipse.net4j.db.ddl.IDBIndex.Type;
import org.eclipse.net4j.db.ddl.IDBTable;
import org.eclipse.net4j.util.ImplementationError;
import org.eclipse.net4j.util.collection.MoveableList;
+import org.eclipse.net4j.util.collection.Pair;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.ecore.EClass;
@@ -66,6 +67,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
@@ -319,7 +321,8 @@ public class BranchingListTableMappingWithRanges extends BasicAbstractListTableM
PreparedStatement stmt = null;
ResultSet resultSet = null;
- IStoreChunkReader baseReader = null;
+ // list of chunks to be read from base revision
+ ArrayList<Pair<Integer, Integer>> toReadFromBase = null;
try
{
String sql = sqlSelectChunksPrefix + sqlOrderByIndex;
@@ -339,12 +342,12 @@ public class BranchingListTableMappingWithRanges extends BasicAbstractListTableM
int index = resultSet.getInt(1);
if (index > currentIndex)
{
- if (baseReader == null)
+ if (toReadFromBase == null)
{
- baseReader = createBaseChunkReader(accessor, id, branchID);
+ toReadFromBase = new ArrayList<Pair<Integer, Integer>>();
}
+ toReadFromBase.add(new Pair<Integer, Integer>(currentIndex, index));
- baseReader.addRangedChunk(currentIndex, index);
if (TRACER.isEnabled())
{
TRACER.format("Scheduling range {0}-{1} to be read from base revision", currentIndex, index); //$NON-NLS-1$
@@ -366,19 +369,13 @@ public class BranchingListTableMappingWithRanges extends BasicAbstractListTableM
if (valuesToRead > 0)
{
- if (baseReader == null)
+ if (toReadFromBase == null)
{
- baseReader = createBaseChunkReader(accessor, id, branchID);
+ toReadFromBase = new ArrayList<Pair<Integer, Integer>>();
}
-
- baseReader.addRangedChunk(currentIndex, currentIndex + valuesToRead);
- if (TRACER.isEnabled())
- {
- TRACER.format(
- "Scheduling range {0}-{1} to be read from base revision", currentIndex, currentIndex + valuesToRead); //$NON-NLS-1$
+ toReadFromBase.add(new Pair<Integer, Integer>(currentIndex, currentIndex + valuesToRead));
}
}
- }
catch (SQLException ex)
{
throw new DBException(ex);
@@ -389,14 +386,22 @@ public class BranchingListTableMappingWithRanges extends BasicAbstractListTableM
statementCache.releasePreparedStatement(stmt);
}
- if (baseReader != null)
+ // read missing values from base revision ...
+ if (toReadFromBase != null)
{
+ IStoreChunkReader baseReader = createBaseChunkReader(accessor, id, branchID);
+
if (TRACER.isEnabled())
{
TRACER.format("Reading base revision chunks for feature {0}.{1} of {2} from base revision {3}", //$NON-NLS-1$
getContainingClass().getName(), getFeature().getName(), revision, baseReader.getRevision());
}
+ for (Pair<Integer, Integer> range : toReadFromBase)
+ {
+ baseReader.addRangedChunk(range.getElement1(), range.getElement2());
+ }
+
List<Chunk> baseChunks = baseReader.executeRead();
for (Chunk chunk : baseChunks)
{
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java
index 772abfb6a1..944943728a 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java
@@ -425,6 +425,7 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
IIDHandler idHandler = getMappingStrategy().getStore().getIDHandler();
IPreparedStatementCache statementCache = accessor.getStatementCache();
PreparedStatement stmt = null;
+ boolean success;
long timeStamp = revision.getTimeStamp();
int branchID = revision.getBranch().getID();
@@ -445,17 +446,6 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
idHandler.setCDOID(stmt, 1, revision.getID());
stmt.setInt(2, branchID);
}
-
- // Read singleval-attribute table always (even without modeled attributes!)
- boolean success = readValuesFromStatement(stmt, revision, accessor);
-
- // Read multival tables only if revision exists
- if (success && revision.getVersion() >= CDOBranchVersion.FIRST_VERSION)
- {
- readLists(accessor, revision, listChunk);
- }
-
- return success;
}
catch (SQLException ex)
{
@@ -465,6 +455,17 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
{
statementCache.releasePreparedStatement(stmt);
}
+
+ // Read singleval-attribute table always (even without modeled attributes!)
+ success = readValuesFromStatement(stmt, revision, accessor);
+
+ // Read multival tables only if revision exists
+ if (success && revision.getVersion() >= CDOBranchVersion.FIRST_VERSION)
+ {
+ readLists(accessor, revision, listChunk);
+ }
+
+ return success;
}
public boolean readRevisionByVersion(IDBStoreAccessor accessor, InternalCDORevision revision, int listChunk)
@@ -472,6 +473,7 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
IIDHandler idHandler = getMappingStrategy().getStore().getIDHandler();
IPreparedStatementCache statementCache = accessor.getStatementCache();
PreparedStatement stmt = null;
+ boolean success;
try
{
@@ -481,15 +483,7 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
stmt.setInt(3, revision.getVersion());
// Read singleval-attribute table always (even without modeled attributes!)
- boolean success = readValuesFromStatement(stmt, revision, accessor);
-
- // Read multival tables only if revision exists
- if (success)
- {
- readLists(accessor, revision, listChunk);
- }
-
- return success;
+ success = readValuesFromStatement(stmt, revision, accessor);
}
catch (SQLException ex)
{
@@ -499,6 +493,14 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
{
statementCache.releasePreparedStatement(stmt);
}
+
+ // Read multival tables only if revision exists
+ if (success)
+ {
+ readLists(accessor, revision, listChunk);
+ }
+
+ return success;
}
public PreparedStatement createResourceQueryStatement(IDBStoreAccessor accessor, CDOID folderId, String name,

Back to the top