blob: fd26f689eeaa4fe0a7a309f8fc00d66a641d24e5 [file] [log] [blame]
/*
* Copyright (c) 2011, 2019 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:
// James Sutherland (Oracle) - initial API and implementation
package org.eclipse.persistence.descriptors.partitioning;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.persistence.internal.databaseaccess.Accessor;
import org.eclipse.persistence.internal.sessions.AbstractRecord;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.queries.DatabaseQuery;
import org.eclipse.persistence.sessions.server.ServerSession;
/**
* PUBLIC:
* ReplicationPartitioningPolicy sends requests to a set of connection pools.
* It is for replicating data across a cluster of database machines.
* Only modification queries are replicated.
* @author James Sutherland
* @since EclipseLink 2.2
*/
public class ReplicationPartitioningPolicy extends PartitioningPolicy {
protected List<String> connectionPools;
public ReplicationPartitioningPolicy() {
this.connectionPools = new ArrayList<>();
}
public ReplicationPartitioningPolicy(String... pools) {
this();
this.connectionPools.addAll(Arrays.asList(pools));
}
public ReplicationPartitioningPolicy(List<String> pools) {
this.connectionPools = pools;
}
/**
* INTERNAL:
* Default the connection pools to all pools if unset.
*/
@Override
public void initialize(AbstractSession session) {
super.initialize(session);
if (getConnectionPools().isEmpty() && session.isServerSession()) {
getConnectionPools().addAll(((ServerSession)session).getConnectionPools().keySet());
}
}
/**
* PUBLIC:
* Return the list of connection pool names to replicate queries to.
*/
public List<String> getConnectionPools() {
return connectionPools;
}
/**
* PUBLIC:
* Set the list of connection pool names to replicate queries to.
* A connection pool with the same name must be defined on the ServerSession.
*/
public void setConnectionPools(List<String> connectionPools) {
this.connectionPools = connectionPools;
}
/**
* PUBLIC:
* Add the connection pool name to the list of pools to rotate queries through.
*/
public void addConnectionPool(String connectionPool) {
getConnectionPools().add(connectionPool);
}
/**
* INTERNAL:
* Get a connection from each pool.
*/
@Override
public List<Accessor> getConnectionsForQuery(AbstractSession session, DatabaseQuery query, AbstractRecord arguments) {
if (!query.isModifyQuery()) {
return null;
}
List<Accessor> accessors = new ArrayList<>(this.connectionPools.size());
for (String poolName : this.connectionPools) {
Accessor accessor = getAccessor(poolName, session, query, true);
// Do not replicate to dead connection pools.
if (accessor != null) {
accessors.add(accessor);
}
}
return accessors;
}
}