diff options
author | Eike Stepper | 2012-10-30 12:15:01 +0000 |
---|---|---|
committer | Eike Stepper | 2012-10-30 12:15:01 +0000 |
commit | cd7c758a5c0887ea43c769c4aa276a3157debe6a (patch) | |
tree | c9ed6f8e189a8d7447613d6f4840e3b0bad57334 /plugins/org.eclipse.emf.cdo.server.db/src/org | |
parent | 2f8c489d32d48e9fb686a1e2ed2f092c8cebb823 (diff) | |
download | cdo-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')
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, |