blob: b1f5ce14224c1b0009ea431fd47647f13e70feb1 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.databaseaccess;
import java.io.Serializable;
import org.eclipse.persistence.descriptors.DescriptorQueryManager;
import org.eclipse.persistence.internal.sessions.AbstractSession;
/**
* INTERNAL:
* <p>BatchWritingMechanism is a private interface, used by the DatabaseAccessor. it provides the required
* behavior for batching statements, for write.<p>
* There are currently two types of the Mechanism implemented, one to handle the tradition dynamic SQL
* batching and another to handle Parameterized SQL. Depending on what is passed to these mechanisms
* they may decide to switch the current one out to the alternative type.</p>
* <p>In bug# 214910 this interface was switched to an abstract class</p>
*
* @since OracleAS TopLink 10<i>g</i> (9.0.4)
*/
public abstract class BatchWritingMechanism implements Cloneable, Serializable {
/**
* This member variable stores the reference to the DatabaseAccessor that is
* using this Mechanism to handle the batch writing
*/
protected DatabaseAccessor databaseAccessor;
/**
* INTERNAL:
* This variable is used to temporarily cache the largest queryTimeout among
* a batch of queries for a particular mechanism.
* The default is NoTimeout.
*/
protected int queryTimeoutCache = DescriptorQueryManager.NoTimeout;
//bug 4241441: used to keep track of the values returned from the driver via addBatch and executeStatment
protected int executionCount;
//bug 4241441: increments with each addBatch call. Used to compare against value returned from driver for
// optimistic locking
protected int statementCount;
/** Allow for the batch size to be set as many database have strict limits. **/
protected int maxBatchSize;
public int getMaxBatchSize() {
return maxBatchSize;
}
public void setMaxBatchSize(int maxBatchSize) {
this.maxBatchSize = maxBatchSize;
}
/**
* INTERNAL:
* This function caches the largest query timeout encountered within all the calls in this batch,
* or uses the parent timeout if one of the calls references the parent.
*/
protected void cacheQueryTimeout(AbstractSession session, DatabaseCall dbCall) {
int callTimeout = dbCall.getQueryTimeout();
/*
* Object queries that reference their parent will already be resolved .
* Data queries with a parent reference will be ignored.
* NoTimeout values will be ignored
*/
if(callTimeout == DescriptorQueryManager.DefaultTimeout || callTimeout == DescriptorQueryManager.NoTimeout) {
return;
} else {
// Cache the highest individual query timeout
if(callTimeout > queryTimeoutCache) {
queryTimeoutCache = callTimeout;
}
}
}
/**
* INTERNAL:
* Clear the cached timeout after the statement has been executed.
*/
protected void clearCacheQueryTimeout() {
queryTimeoutCache = DescriptorQueryManager.NoTimeout;
}
/**
* INTERNAL:
* Sets the accessor that this mechanism will use
*/
public void setAccessor(DatabaseAccessor accessor, AbstractSession session) {
databaseAccessor = accessor;
}
/**
* INTERNAL:
* This method is called by the DatabaseAccessor to add this statement to the list of statements
* being batched. This call may result in the Mechanism executing the batched statements and
* possibly, switching out the mechanisms
*/
public abstract void appendCall(AbstractSession session, DatabaseCall call);
/**
* INTERNAL:
* This method is used to clear the batched statements without the need to execute the statements first
* This is used in the case of rollback.
*/
public abstract void clear();
/**
* INTERNAL:
* This method is used by the DatabaseAccessor to clear the batched statements in the
* case that a non batchable statement is being execute
*/
public abstract void executeBatchedStatements(AbstractSession session);
/**
* INTERNAL:
* The mechanism will be cloned to be set into each accessor.
*/
@Override
public BatchWritingMechanism clone() {
try {
return (BatchWritingMechanism)super.clone();
} catch (CloneNotSupportedException notPossible) {
throw new InternalError(notPossible.toString());
}
}
/**
* INTERNAL:
* Allow initialization with the session after login.
*/
public void initialize(AbstractSession session) {
}
}