/* * Copyright 2006-2012 Amazon Technologies, Inc. or its affiliates. * Amazon, Amazon.com and Carbonado are trademarks or registered trademarks * of Amazon Technologies, Inc. or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.amazon.carbonado.repo.jdbc; import java.sql.Connection; import java.sql.SQLException; import com.amazon.carbonado.FetchException; import com.amazon.carbonado.PersistException; import com.amazon.carbonado.capability.Capability; /** * Capability to directly access the JDBC connection being used by the current * transaction, which is thread-local. If no transaction is in progress, then * the connection is in auto-commit mode. * *
All connections retrieved from this capability must be properly * yielded. Do not close the connection directly, as this interferes with the * transaction's ability to properly manage it. * *
It is perfectly okay for other Carbonado calls to be made while the * connection is in use. Also, it is okay to request more connections, * although they will usually be the same instance. Failing to yield a * connection has an undefined behavior. * *
* JDBCConnectionCapability cap = repo.getCapability(JDBCConnectionCapability.class); * Transaction txn = repo.enterTransaction(); * try { * Connection con = cap.getConnection(); * try { * ... * } finally { * cap.yieldConnection(con); * } * ... * txn.commit(); * } finally { * txn.exit(); * } ** * @author Brian S O'Neill */ public interface JDBCConnectionCapability extends Capability { /** * Any connection returned by this method must be closed by calling * yieldConnection. */ Connection getConnection() throws FetchException; /** * Gives up a connection returned from getConnection. Connection must be * yielded in same thread that retrieved it. */ void yieldConnection(Connection con) throws FetchException; /** * Transforms the given throwable into an appropriate fetch exception. If * it already is a fetch exception, it is simply casted. * * @param e required exception to transform * @return FetchException, never null * @since 1.2 */ FetchException toFetchException(Throwable e); /** * Transforms the given throwable into an appropriate persist exception. If * it already is a persist exception, it is simply casted. * * @param e required exception to transform * @return PersistException, never null * @since 1.2 */ PersistException toPersistException(Throwable e); /** * Examines the SQLSTATE code of the given SQL exception and determines if * it is a unique constaint violation. * * @since 1.2 */ boolean isUniqueConstraintError(SQLException e); /** * Returns true if a transaction is in progress and it is for update. * * @since 1.2 */ boolean isTransactionForUpdate(); /** * Returns the name of the database product connected to. */ String getDatabaseProductName(); }