Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2013-03-03 18:41:03 +0000
committerEike Stepper2013-03-07 13:44:07 +0000
commit2174001afb162668a7ccaca8aaae293ff7f9eb24 (patch)
tree37c79030f18c897e4b61ac1b9ef66b4f71fc1997 /plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBTransaction.java
parentc6e79fb5a2912ff61377afeda3235c6a5ff6084f (diff)
downloadcdo-2174001afb162668a7ccaca8aaae293ff7f9eb24.tar.gz
cdo-2174001afb162668a7ccaca8aaae293ff7f9eb24.tar.xz
cdo-2174001afb162668a7ccaca8aaae293ff7f9eb24.zip
[401763] Make CDO Server more robust against data dictionary changes
https://bugs.eclipse.org/bugs/show_bug.cgi?id=401763
Diffstat (limited to 'plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBTransaction.java')
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBTransaction.java122
1 files changed, 122 insertions, 0 deletions
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBTransaction.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBTransaction.java
new file mode 100644
index 0000000000..caa45f135b
--- /dev/null
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBTransaction.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.net4j.internal.db;
+
+import org.eclipse.net4j.db.DBException;
+import org.eclipse.net4j.db.DBUtil;
+import org.eclipse.net4j.db.IDBTransaction;
+import org.eclipse.net4j.db.IDBPreparedStatement;
+import org.eclipse.net4j.db.IDBPreparedStatement.ReuseProbability;
+import org.eclipse.net4j.db.IDBSchemaTransaction;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.NavigableMap;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * @author Eike Stepper
+ */
+public final class DBTransaction extends DBElement implements IDBTransaction
+{
+ private final DBDatabase database;
+
+ private final NavigableMap<String, DBPreparedStatement> cache = new TreeMap<String, DBPreparedStatement>();
+
+ private final Set<DBPreparedStatement> checkOuts = new HashSet<DBPreparedStatement>();
+
+ private int lastTouch;
+
+ private Connection connection;
+
+ public DBTransaction(DBDatabase database)
+ {
+ this.database = database;
+ connection = database.getConnectionProvider().getConnection();
+ }
+
+ public DBDatabase getDatabase()
+ {
+ return database;
+ }
+
+ public void close()
+ {
+ DBUtil.close(connection);
+ connection = null;
+
+ database.closeTransaction(this);
+ }
+
+ public boolean isClosed()
+ {
+ return connection != null;
+ }
+
+ public Connection getConnection()
+ {
+ return connection;
+ }
+
+ public IDBPreparedStatement getPreparedStatement(String sql, ReuseProbability reuseProbability)
+ {
+ DBPreparedStatement preparedStatement = cache.remove(sql);
+ if (preparedStatement == null)
+ {
+ try
+ {
+ PreparedStatement delegate = connection.prepareStatement(sql);
+ preparedStatement = new DBPreparedStatement(this, sql, reuseProbability, delegate);
+ }
+ catch (SQLException ex)
+ {
+ throw new DBException(ex);
+ }
+ }
+
+ checkOuts.add(preparedStatement);
+ return preparedStatement;
+ }
+
+ public void releasePreparedStatement(DBPreparedStatement preparedStatement)
+ {
+ if (preparedStatement == null)
+ {
+ // Bug 276926: Silently accept preparedStatement == null and do nothing.
+ return;
+ }
+
+ checkOuts.remove(preparedStatement);
+ preparedStatement.setTouch(++lastTouch);
+
+ String sql = preparedStatement.getSQL();
+ if (cache.put(sql, preparedStatement) != null)
+ {
+ throw new IllegalStateException(sql + " already in cache"); //$NON-NLS-1$
+ }
+
+ if (cache.size() > database.getStatementCacheCapacity())
+ {
+ DBPreparedStatement old = cache.remove(cache.firstKey());
+ DBUtil.close(old.getDelegate());
+ }
+ }
+
+ public IDBSchemaTransaction openSchemaTransaction()
+ {
+ DBSchemaTransaction schemaTransaction = database.openSchemaTransaction();
+ schemaTransaction.setTransaction(this);
+ return schemaTransaction;
+ }
+}

Back to the top