diff options
author | Eike Stepper | 2013-03-03 18:41:03 +0000 |
---|---|---|
committer | Eike Stepper | 2013-03-07 13:44:07 +0000 |
commit | 2174001afb162668a7ccaca8aaae293ff7f9eb24 (patch) | |
tree | 37c79030f18c897e4b61ac1b9ef66b4f71fc1997 /plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBTransaction.java | |
parent | c6e79fb5a2912ff61377afeda3235c6a5ff6084f (diff) | |
download | cdo-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.java | 122 |
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; + } +} |