This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new c38ed6a8e3a Support opengauss route strategy on read write split
(#17747)
c38ed6a8e3a is described below
commit c38ed6a8e3aa35761f31930960ee60ad19ade711
Author: JingShang Lu <[email protected]>
AuthorDate: Wed May 25 20:03:43 2022 +0800
Support opengauss route strategy on read write split (#17747)
* read write for opengauss
* support opengauss route strategy on read write split
* fix
* fix
* fix
* fix
* fix
* fix
* fix
* fix
* fix
* fix
* fix
* fix
* fix
* fix
* add UT
* fix
---
.../ReplicaLoadBalanceAlgorithmFactory.java | 14 +++---
...thm.java => ReadQueryLoadBalanceAlgorithm.java} | 2 +-
...rovidedReadwriteSplittingRuleConfiguration.java | 4 +-
....java => FixedPrimaryLoadBalanceAlgorithm.java} | 15 +++---
...=> FixedReplicaRandomLoadBalanceAlgorithm.java} | 14 ++++--
...ixedReplicaRoundRobinLoadBalanceAlgorithm.java} | 19 ++++----
...=> FixedReplicaWeightLoadBalanceAlgorithm.java} | 14 ++++--
.../RandomReplicaLoadBalanceAlgorithm.java | 8 +++-
.../RoundRobinReplicaLoadBalanceAlgorithm.java | 8 +++-
...nsactionRandomReplicaLoadBalanceAlgorithm.java} | 8 ++--
...tionRoundRobinReplicaLoadBalanceAlgorithm.java} | 13 ++---
...nsactionWeightReplicaLoadBalanceAlgorithm.java} | 8 ++--
.../WeightReplicaLoadBalanceAlgorithm.java | 8 +++-
.../impl/ReadwriteSplittingDataSourceRouter.java | 8 +---
.../rule/ReadwriteSplittingDataSourceRule.java | 6 +--
.../rule/ReadwriteSplittingRule.java | 8 ++--
...itesplitting.spi.ReadQueryLoadBalanceAlgorithm} | 7 +++
...a => FixedPrimaryLoadBalanceAlgorithmTest.java} | 11 ++---
...ixedReplicaRandomLoadBalanceAlgorithmTest.java} | 16 +++++--
...ReplicaRoundRobinLoadBalanceAlgorithmTest.java} | 17 +++++--
...ixedReplicaWeightLoadBalanceAlgorithmTest.java} | 33 ++++++++-----
.../RandomReplicaLoadBalanceAlgorithmTest.java | 14 +++++-
.../RoundRobinReplicaLoadBalanceAlgorithmTest.java | 13 +++++
...tionRandomReplicaLoadBalanceAlgorithmTest.java} | 15 +++---
...nRoundRobinReplicaLoadBalanceAlgorithmTest.java | 56 ++++++++++++++++++++++
...tionWeightReplicaLoadBalanceAlgorithmTest.java} | 29 ++++++-----
.../WeightReplicaLoadBalanceAlgorithmTest.java | 13 +++++
...dwriteSplittingRuleSpringbootConfiguration.java | 6 +--
...riteSplittingAlgorithmProvidedBeanRegistry.java | 6 +--
.../ReplicaLoadBalanceAlgorithmFactoryBean.java | 8 ++--
.../ReadwriteSplittingSpringNamespaceTest.java | 6 +--
.../transaction/TransactionHolder.java | 21 ++++++++
.../resources/conf/config-readwrite-splitting.yaml | 8 ++++
33 files changed, 302 insertions(+), 134 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/factory/ReplicaLoadBalanceAlgorithmFactory.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/factory/ReplicaLoadBalanceAlgorithmFactory.java
index 188d6c0c7e0..ffc61df1bed 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/factory/ReplicaLoadBalanceAlgorithmFactory.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/factory/ReplicaLoadBalanceAlgorithmFactory.java
@@ -21,7 +21,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmFactory;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.spi.type.required.RequiredSPIRegistry;
import org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry;
@@ -33,7 +33,7 @@ import
org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry;
public final class ReplicaLoadBalanceAlgorithmFactory {
static {
-
ShardingSphereServiceLoader.register(ReplicaLoadBalanceAlgorithm.class);
+
ShardingSphereServiceLoader.register(ReadQueryLoadBalanceAlgorithm.class);
}
/**
@@ -41,8 +41,8 @@ public final class ReplicaLoadBalanceAlgorithmFactory {
*
* @return created instance
*/
- public static ReplicaLoadBalanceAlgorithm newInstance() {
- return
RequiredSPIRegistry.getRegisteredService(ReplicaLoadBalanceAlgorithm.class);
+ public static ReadQueryLoadBalanceAlgorithm newInstance() {
+ return
RequiredSPIRegistry.getRegisteredService(ReadQueryLoadBalanceAlgorithm.class);
}
/**
@@ -51,8 +51,8 @@ public final class ReplicaLoadBalanceAlgorithmFactory {
* @param replicaLoadBalanceAlgorithmConfig replica load-balance algorithm
configuration
* @return created instance
*/
- public static ReplicaLoadBalanceAlgorithm newInstance(final
ShardingSphereAlgorithmConfiguration replicaLoadBalanceAlgorithmConfig) {
- return
ShardingSphereAlgorithmFactory.createAlgorithm(replicaLoadBalanceAlgorithmConfig,
ReplicaLoadBalanceAlgorithm.class);
+ public static ReadQueryLoadBalanceAlgorithm newInstance(final
ShardingSphereAlgorithmConfiguration replicaLoadBalanceAlgorithmConfig) {
+ return
ShardingSphereAlgorithmFactory.createAlgorithm(replicaLoadBalanceAlgorithmConfig,
ReadQueryLoadBalanceAlgorithm.class);
}
/**
@@ -62,6 +62,6 @@ public final class ReplicaLoadBalanceAlgorithmFactory {
* @return contains replica load-balance algorithm or not
*/
public static boolean contains(final String
replicaLoadBalanceAlgorithmType) {
- return
TypedSPIRegistry.findRegisteredService(ReplicaLoadBalanceAlgorithm.class,
replicaLoadBalanceAlgorithmType).isPresent();
+ return
TypedSPIRegistry.findRegisteredService(ReadQueryLoadBalanceAlgorithm.class,
replicaLoadBalanceAlgorithmType).isPresent();
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReadQueryLoadBalanceAlgorithm.java
similarity index 93%
rename from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
rename to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReadQueryLoadBalanceAlgorithm.java
index caaaef346fe..8c3d5d1d7e9 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReadQueryLoadBalanceAlgorithm.java
@@ -25,7 +25,7 @@ import java.util.List;
/**
* Replica load-balance algorithm.
*/
-public interface ReplicaLoadBalanceAlgorithm extends ShardingSphereAlgorithm,
RequiredSPI {
+public interface ReadQueryLoadBalanceAlgorithm extends
ShardingSphereAlgorithm, RequiredSPI {
/**
* Get data source.
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/config/AlgorithmProvidedReadwriteSplittingRuleConfiguration.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/config/AlgorithmProvidedReadwriteSplittingRuleConfiguration.java
index fe03ce5794d..a842797f7f4 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/config/AlgorithmProvidedReadwriteSplittingRuleConfiguration.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/config/AlgorithmProvidedReadwriteSplittingRuleConfiguration.java
@@ -24,7 +24,7 @@ import lombok.Setter;
import
org.apache.shardingsphere.infra.config.function.DistributedRuleConfiguration;
import org.apache.shardingsphere.infra.config.scope.SchemaRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import java.util.Collection;
import java.util.LinkedHashMap;
@@ -42,5 +42,5 @@ public final class
AlgorithmProvidedReadwriteSplittingRuleConfiguration implemen
private Collection<ReadwriteSplittingDataSourceRuleConfiguration>
dataSources = new LinkedList<>();
- private Map<String, ReplicaLoadBalanceAlgorithm> loadBalanceAlgorithms =
new LinkedHashMap<>();
+ private Map<String, ReadQueryLoadBalanceAlgorithm> loadBalanceAlgorithms =
new LinkedHashMap<>();
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithm.java
similarity index 73%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithm.java
index 14c53b1a190..d8460d87e14 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithm.java
@@ -18,19 +18,18 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import java.util.List;
import java.util.Properties;
-import java.util.concurrent.ThreadLocalRandom;
/**
- * Random replica load-balance algorithm.
+ * Fixed primary load-balance algorithm.
*/
-@Getter
-public final class RandomReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class FixedPrimaryLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
- private Properties props = new Properties();
+ @Getter
+ private Properties props;
@Override
public void init(final Properties props) {
@@ -39,11 +38,11 @@ public final class RandomReplicaLoadBalanceAlgorithm
implements ReplicaLoadBalan
@Override
public String getDataSource(final String name, final String
writeDataSourceName, final List<String> readDataSourceNames) {
- return
readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size()));
+ return writeDataSourceName;
}
@Override
public String getType() {
- return "RANDOM";
+ return "FIXED_PRIMARY";
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
similarity index 68%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
index 14c53b1a190..d3c2e856f9b 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithm.java
@@ -18,17 +18,18 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ThreadLocalRandom;
/**
- * Random replica load-balance algorithm.
+ * Fixed replica random load-balance algorithm.
*/
@Getter
-public final class RandomReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class FixedReplicaRandomLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private Properties props = new Properties();
@@ -39,11 +40,14 @@ public final class RandomReplicaLoadBalanceAlgorithm
implements ReplicaLoadBalan
@Override
public String getDataSource(final String name, final String
writeDataSourceName, final List<String> readDataSourceNames) {
- return
readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size()));
+ if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+
TransactionHolder.setReadWriteSplitRoutedReplica(readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size())));
+ }
+ return TransactionHolder.getReadWriteSplitRoutedReplica();
}
@Override
public String getType() {
- return "RANDOM";
+ return "FIXED_REPLICA_RANDOM";
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
similarity index 68%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
index 69a40a18c99..b2ca75b5a57 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithm.java
@@ -18,16 +18,17 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;
/**
- * Round-robin replica load-balance algorithm.
+ * Fixed replica round-robin load-balance algorithm.
*/
-public final class RoundRobinReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class FixedReplicaRoundRobinLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private final AtomicInteger count = new AtomicInteger(0);
@@ -41,16 +42,14 @@ public final class RoundRobinReplicaLoadBalanceAlgorithm
implements ReplicaLoadB
@Override
public String getDataSource(final String name, final String
writeDataSourceName, final List<String> readDataSourceNames) {
- return readDataSourceNames.get(Math.abs(count.getAndIncrement()) %
readDataSourceNames.size());
+ if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+
TransactionHolder.setReadWriteSplitRoutedReplica(readDataSourceNames.get(Math.abs(count.getAndIncrement())
% readDataSourceNames.size()));
+ }
+ return TransactionHolder.getReadWriteSplitRoutedReplica();
}
@Override
public String getType() {
- return "ROUND_ROBIN";
- }
-
- @Override
- public boolean isDefault() {
- return true;
+ return "FIXED_REPLICA_ROUND_ROBIN";
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
similarity index 88%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
index db95e3c9cad..e77bd7b4452 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithm.java
@@ -18,7 +18,8 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import java.util.Arrays;
import java.util.List;
@@ -27,10 +28,10 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
/**
- * Weight replica load-balance algorithm.
+ * Fixed replica weight load-balance algorithm.
*/
@Getter
-public final class WeightReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class FixedReplicaWeightLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private static final double ACCURACY_THRESHOLD = 0.0001;
@@ -47,7 +48,10 @@ public final class WeightReplicaLoadBalanceAlgorithm
implements ReplicaLoadBalan
public String getDataSource(final String name, final String
writeDataSourceName, final List<String> readDataSourceNames) {
double[] weight = WEIGHT_MAP.containsKey(name) ? WEIGHT_MAP.get(name)
: initWeight(readDataSourceNames);
WEIGHT_MAP.putIfAbsent(name, weight);
- return getDataSourceName(readDataSourceNames, weight);
+ if (null == TransactionHolder.getReadWriteSplitRoutedReplica()) {
+
TransactionHolder.setReadWriteSplitRoutedReplica(getDataSourceName(readDataSourceNames,
weight));
+ }
+ return TransactionHolder.getReadWriteSplitRoutedReplica();
}
private String getDataSourceName(final List<String> readDataSourceNames,
final double[] weight) {
@@ -118,6 +122,6 @@ public final class WeightReplicaLoadBalanceAlgorithm
implements ReplicaLoadBalan
@Override
public String getType() {
- return "WEIGHT";
+ return "FIXED_REPLICA_WEIGHT";
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
index 14c53b1a190..4542892c3f1 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
@@ -18,7 +18,8 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import java.util.List;
import java.util.Properties;
@@ -28,7 +29,7 @@ import java.util.concurrent.ThreadLocalRandom;
* Random replica load-balance algorithm.
*/
@Getter
-public final class RandomReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class RandomReplicaLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private Properties props = new Properties();
@@ -39,6 +40,9 @@ public final class RandomReplicaLoadBalanceAlgorithm
implements ReplicaLoadBalan
@Override
public String getDataSource(final String name, final String
writeDataSourceName, final List<String> readDataSourceNames) {
+ if (TransactionHolder.isTransaction()) {
+ return writeDataSourceName;
+ }
return
readDataSourceNames.get(ThreadLocalRandom.current().nextInt(readDataSourceNames.size()));
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
index 69a40a18c99..e67517ca4e2 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
@@ -18,7 +18,8 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import java.util.List;
import java.util.Properties;
@@ -27,7 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger;
/**
* Round-robin replica load-balance algorithm.
*/
-public final class RoundRobinReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class RoundRobinReplicaLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private final AtomicInteger count = new AtomicInteger(0);
@@ -41,6 +42,9 @@ public final class RoundRobinReplicaLoadBalanceAlgorithm
implements ReplicaLoadB
@Override
public String getDataSource(final String name, final String
writeDataSourceName, final List<String> readDataSourceNames) {
+ if (TransactionHolder.isTransaction()) {
+ return writeDataSourceName;
+ }
return readDataSourceNames.get(Math.abs(count.getAndIncrement()) %
readDataSourceNames.size());
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithm.java
similarity index 83%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithm.java
index 14c53b1a190..a11b17e5a80 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithm.java
@@ -18,17 +18,17 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ThreadLocalRandom;
/**
- * Random replica load-balance algorithm.
+ * Transaction random replica load-balance algorithm.
*/
@Getter
-public final class RandomReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class TransactionRandomReplicaLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private Properties props = new Properties();
@@ -44,6 +44,6 @@ public final class RandomReplicaLoadBalanceAlgorithm
implements ReplicaLoadBalan
@Override
public String getType() {
- return "RANDOM";
+ return "TRANSACTION_RANDOM";
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithm.java
similarity index 81%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithm.java
index 69a40a18c99..54849c67f29 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithm.java
@@ -18,16 +18,16 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;
/**
- * Round-robin replica load-balance algorithm.
+ * Transaction round-robin replica load-balance algorithm.
*/
-public final class RoundRobinReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class TransactionRoundRobinReplicaLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private final AtomicInteger count = new AtomicInteger(0);
@@ -46,11 +46,6 @@ public final class RoundRobinReplicaLoadBalanceAlgorithm
implements ReplicaLoadB
@Override
public String getType() {
- return "ROUND_ROBIN";
- }
-
- @Override
- public boolean isDefault() {
- return true;
+ return "TRANSACTION_ROUND_ROBIN";
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithm.java
similarity index 94%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithm.java
index db95e3c9cad..e0756962019 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithm.java
@@ -18,7 +18,7 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import java.util.Arrays;
import java.util.List;
@@ -27,10 +27,10 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
/**
- * Weight replica load-balance algorithm.
+ * Transaction weight replica load-balance algorithm.
*/
@Getter
-public final class WeightReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class TransactionWeightReplicaLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private static final double ACCURACY_THRESHOLD = 0.0001;
@@ -118,6 +118,6 @@ public final class WeightReplicaLoadBalanceAlgorithm
implements ReplicaLoadBalan
@Override
public String getType() {
- return "WEIGHT";
+ return "TRANSACTION_WEIGHT";
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
index db95e3c9cad..9e8f8f79825 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithm.java
@@ -18,7 +18,8 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import lombok.Getter;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import java.util.Arrays;
import java.util.List;
@@ -30,7 +31,7 @@ import java.util.concurrent.ThreadLocalRandom;
* Weight replica load-balance algorithm.
*/
@Getter
-public final class WeightReplicaLoadBalanceAlgorithm implements
ReplicaLoadBalanceAlgorithm {
+public final class WeightReplicaLoadBalanceAlgorithm implements
ReadQueryLoadBalanceAlgorithm {
private static final double ACCURACY_THRESHOLD = 0.0001;
@@ -45,6 +46,9 @@ public final class WeightReplicaLoadBalanceAlgorithm
implements ReplicaLoadBalan
@Override
public String getDataSource(final String name, final String
writeDataSourceName, final List<String> readDataSourceNames) {
+ if (TransactionHolder.isTransaction()) {
+ return writeDataSourceName;
+ }
double[] weight = WEIGHT_MAP.containsKey(name) ? WEIGHT_MAP.get(name)
: initWeight(readDataSourceNames);
WEIGHT_MAP.putIfAbsent(name, weight);
return getDataSourceName(readDataSourceNames, weight);
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
index 61f95f070b9..2521da11bfa 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
@@ -26,7 +26,6 @@ import
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataS
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
-import org.apache.shardingsphere.transaction.TransactionHolder;
/**
* Data source router for readwrite-splitting.
@@ -44,16 +43,13 @@ public final class ReadwriteSplittingDataSourceRouter {
*/
public String route(final SQLStatementContext<?> sqlStatementContext) {
if (isPrimaryRoute(sqlStatementContext)) {
- return rule.getReadwriteSplittingStrategy().getWriteDataSource();
- }
- if (1 == rule.getReadDataSourceNames().size()) {
- return rule.getReadDataSourceNames().get(0);
+ return rule.getWriteDataSource();
}
return rule.getLoadBalancer().getDataSource(rule.getName(),
rule.getWriteDataSource(), rule.getReadDataSourceNames());
}
private boolean isPrimaryRoute(final SQLStatementContext<?>
sqlStatementContext) {
- return isWriteRouteStatement(sqlStatementContext) ||
isHintWriteRouteOnly(sqlStatementContext) || TransactionHolder.isTransaction();
+ return isWriteRouteStatement(sqlStatementContext) ||
isHintWriteRouteOnly(sqlStatementContext);
}
private boolean isWriteRouteStatement(final SQLStatementContext<?>
sqlStatementContext) {
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
index 8e6e8d55114..92cf32b66a0 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
@@ -23,7 +23,7 @@ import lombok.AccessLevel;
import lombok.Getter;
import org.apache.shardingsphere.infra.distsql.constant.ExportableConstants;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import
org.apache.shardingsphere.readwritesplitting.strategy.ReadwriteSplittingStrategy;
import
org.apache.shardingsphere.readwritesplitting.strategy.ReadwriteSplittingStrategyFactory;
@@ -43,14 +43,14 @@ public final class ReadwriteSplittingDataSourceRule {
private final String name;
- private final ReplicaLoadBalanceAlgorithm loadBalancer;
+ private final ReadQueryLoadBalanceAlgorithm loadBalancer;
private final ReadwriteSplittingStrategy readwriteSplittingStrategy;
@Getter(AccessLevel.NONE)
private final Collection<String> disabledDataSourceNames = new HashSet<>();
- public ReadwriteSplittingDataSourceRule(final
ReadwriteSplittingDataSourceRuleConfiguration config, final
ReplicaLoadBalanceAlgorithm loadBalancer) {
+ public ReadwriteSplittingDataSourceRule(final
ReadwriteSplittingDataSourceRuleConfiguration config, final
ReadQueryLoadBalanceAlgorithm loadBalancer) {
Preconditions.checkArgument(!Strings.isNullOrEmpty(config.getName()),
"Name is required.");
name = config.getName();
this.loadBalancer = loadBalancer;
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index 1329a48eb13..e243c969499 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -30,7 +30,7 @@ import
org.apache.shardingsphere.readwritesplitting.algorithm.config.AlgorithmPr
import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import
org.apache.shardingsphere.readwritesplitting.strategy.type.DynamicReadwriteSplittingStrategy;
import
org.apache.shardingsphere.readwritesplitting.strategy.type.StaticReadwriteSplittingStrategy;
@@ -48,7 +48,7 @@ import java.util.stream.Collectors;
*/
public final class ReadwriteSplittingRule implements SchemaRule,
DataSourceContainedRule, StatusContainedRule, ExportableRule {
- private final Map<String, ReplicaLoadBalanceAlgorithm> loadBalancers = new
LinkedHashMap<>();
+ private final Map<String, ReadQueryLoadBalanceAlgorithm> loadBalancers =
new LinkedHashMap<>();
private final Map<String, ReadwriteSplittingDataSourceRule>
dataSourceRules;
@@ -58,7 +58,7 @@ public final class ReadwriteSplittingRule implements
SchemaRule, DataSourceConta
dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
for (ReadwriteSplittingDataSourceRuleConfiguration each :
ruleConfig.getDataSources()) {
// TODO check if can not find load balancer should throw exception.
- ReplicaLoadBalanceAlgorithm loadBalanceAlgorithm =
Strings.isNullOrEmpty(each.getLoadBalancerName()) ||
!loadBalancers.containsKey(each.getLoadBalancerName())
+ ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm =
Strings.isNullOrEmpty(each.getLoadBalancerName()) ||
!loadBalancers.containsKey(each.getLoadBalancerName())
? ReplicaLoadBalanceAlgorithmFactory.newInstance()
: loadBalancers.get(each.getLoadBalancerName());
dataSourceRules.put(each.getName(), new
ReadwriteSplittingDataSourceRule(each, loadBalanceAlgorithm));
@@ -71,7 +71,7 @@ public final class ReadwriteSplittingRule implements
SchemaRule, DataSourceConta
dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
for (ReadwriteSplittingDataSourceRuleConfiguration each :
ruleConfig.getDataSources()) {
// TODO check if can not find load balancer should throw exception.
- ReplicaLoadBalanceAlgorithm loadBalanceAlgorithm =
Strings.isNullOrEmpty(each.getLoadBalancerName()) ||
!loadBalancers.containsKey(each.getLoadBalancerName())
+ ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm =
Strings.isNullOrEmpty(each.getLoadBalancerName()) ||
!loadBalancers.containsKey(each.getLoadBalancerName())
? ReplicaLoadBalanceAlgorithmFactory.newInstance()
: loadBalancers.get(each.getLoadBalancerName());
dataSourceRules.put(each.getName(), new
ReadwriteSplittingDataSourceRule(each, loadBalanceAlgorithm));
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm
similarity index 58%
rename from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm
rename to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm
index 568ee150ab8..ebcc94ee806 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm
@@ -18,3 +18,10 @@
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RoundRobinReplicaLoadBalanceAlgorithm
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RandomReplicaLoadBalanceAlgorithm
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.WeightReplicaLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.FixedPrimaryLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.FixedReplicaRandomLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.FixedReplicaRoundRobinLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.FixedReplicaWeightLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionRandomReplicaLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionRoundRobinReplicaLoadBalanceAlgorithm
+org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionWeightReplicaLoadBalanceAlgorithm
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithmTest.java
similarity index 65%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithmTest.java
index 261312fd595..529cc0ca3a0 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedPrimaryLoadBalanceAlgorithmTest.java
@@ -22,11 +22,12 @@ import org.junit.Test;
import java.util.Arrays;
import java.util.List;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.is;
-public final class RandomReplicaLoadBalanceAlgorithmTest {
+public final class FixedPrimaryLoadBalanceAlgorithmTest {
- private final RandomReplicaLoadBalanceAlgorithm
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
+ private final FixedPrimaryLoadBalanceAlgorithm
fixedPrimaryLoadBalanceAlgorithm = new FixedPrimaryLoadBalanceAlgorithm();
@Test
public void assertGetDataSource() {
@@ -34,8 +35,6 @@ public final class RandomReplicaLoadBalanceAlgorithmTest {
String readDataSourceName1 = "test_replica_ds_1";
String readDataSourceName2 = "test_replica_ds_2";
List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+ assertThat(fixedPrimaryLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(writeDataSourceName));
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
similarity index 56%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
index 261312fd595..7c26fb4848e 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRandomLoadBalanceAlgorithmTest.java
@@ -17,16 +17,19 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.is;
-public final class RandomReplicaLoadBalanceAlgorithmTest {
+public final class FixedReplicaRandomLoadBalanceAlgorithmTest {
- private final RandomReplicaLoadBalanceAlgorithm
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
+ private final FixedReplicaRandomLoadBalanceAlgorithm
fixedReplicaRandomLoadBalanceAlgorithm = new
FixedReplicaRandomLoadBalanceAlgorithm();
@Test
public void assertGetDataSource() {
@@ -34,8 +37,11 @@ public final class RandomReplicaLoadBalanceAlgorithmTest {
String readDataSourceName1 = "test_replica_ds_1";
String readDataSourceName2 = "test_replica_ds_2";
List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+ TransactionHolder.setInTransaction();
+ String routeDatasource =
fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds", writeDataSourceName,
readDataSourceNames);
+
assertTrue(readDataSourceNames.contains(fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+ assertThat(fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+ assertThat(fixedReplicaRandomLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+ TransactionHolder.clear();
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
similarity index 52%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
index 261312fd595..fa651d6ca71 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaRoundRobinLoadBalanceAlgorithmTest.java
@@ -17,16 +17,19 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-public final class RandomReplicaLoadBalanceAlgorithmTest {
+public final class FixedReplicaRoundRobinLoadBalanceAlgorithmTest {
- private final RandomReplicaLoadBalanceAlgorithm
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
+ private final FixedReplicaRoundRobinLoadBalanceAlgorithm
fixedReplicaRoundRobinLoadBalanceAlgorithm = new
FixedReplicaRoundRobinLoadBalanceAlgorithm();
@Test
public void assertGetDataSource() {
@@ -34,8 +37,12 @@ public final class RandomReplicaLoadBalanceAlgorithmTest {
String readDataSourceName1 = "test_replica_ds_1";
String readDataSourceName2 = "test_replica_ds_2";
List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+ TransactionHolder.setInTransaction();
+ String routeDatasource =
fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames);
+
assertTrue(readDataSourceNames.contains(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+
assertThat(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+
assertThat(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+
assertThat(fixedReplicaRoundRobinLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+ TransactionHolder.clear();
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
similarity index 54%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
index ba811bd6cc1..581efae1970 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightLoadBalanceAlgorithmTest.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -30,25 +31,28 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.is;
-public final class WeightReplicaLoadBalanceAlgorithmTest {
+public final class FixedReplicaWeightLoadBalanceAlgorithmTest {
@SuppressWarnings("rawtypes")
@Before
@After
public void reset() throws NoSuchFieldException, IllegalAccessException {
- Field accuracyThresholdField =
WeightReplicaLoadBalanceAlgorithm.class.getDeclaredField("WEIGHT_MAP");
+ Field accuracyThresholdField =
FixedReplicaWeightLoadBalanceAlgorithm.class.getDeclaredField("WEIGHT_MAP");
accuracyThresholdField.setAccessible(true);
- ((Map)
accuracyThresholdField.get(WeightReplicaLoadBalanceAlgorithm.class)).clear();
+ ((Map)
accuracyThresholdField.get(FixedReplicaWeightLoadBalanceAlgorithm.class)).clear();
}
@Test
public void assertGetSingleReadDataSource() {
- WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
- assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
"test_write_ds", Collections.singletonList("test_read_ds_1")),
is("test_read_ds_1"));
+ FixedReplicaWeightLoadBalanceAlgorithm
fixedReplicaWeightLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
+ TransactionHolder.isTransaction();
+ String routeDatasource =
fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", "test_write_ds",
Collections.singletonList("test_read_ds_1"));
+ assertThat(routeDatasource, is("test_read_ds_1"));
+ assertThat(fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds",
"test_write_ds", Collections.singletonList("test_read_ds_1")),
is(routeDatasource));
+ TransactionHolder.clear();
}
private Properties createSingleDataSourceProperties() {
@@ -59,14 +63,17 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
@Test
public void assertGetMultipleReadDataSources() {
- WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
+ FixedReplicaWeightLoadBalanceAlgorithm
fixedReplicaWeightLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
String writeDataSourceName = "test_write_ds";
String readDataSourceName1 = "test_read_ds_1";
String readDataSourceName2 = "test_read_ds_2";
List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
- assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
- assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
- assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
+ TransactionHolder.setInTransaction();
+ String routeDatasource =
fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds", "test_write_ds",
readDataSourceNames);
+ assertThat(fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+ assertThat(fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+ assertThat(fixedReplicaWeightLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(routeDatasource));
+ TransactionHolder.clear();
}
private Properties createMultipleDataSourcesProperties() {
@@ -76,7 +83,7 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
return result;
}
- private WeightReplicaLoadBalanceAlgorithm
createReplicaLoadBalanceAlgorithm(final Properties props) {
- return (WeightReplicaLoadBalanceAlgorithm)
ReplicaLoadBalanceAlgorithmFactory.newInstance(new
ShardingSphereAlgorithmConfiguration("WEIGHT", props));
+ private FixedReplicaWeightLoadBalanceAlgorithm
createReplicaLoadBalanceAlgorithm(final Properties props) {
+ return (FixedReplicaWeightLoadBalanceAlgorithm)
ReplicaLoadBalanceAlgorithmFactory.newInstance(new
ShardingSphereAlgorithmConfiguration("FIXED_REPLICA_WEIGHT", props));
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
index 261312fd595..60d6be76e7a 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.Test;
import java.util.Arrays;
@@ -29,7 +30,18 @@ public final class RandomReplicaLoadBalanceAlgorithmTest {
private final RandomReplicaLoadBalanceAlgorithm
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
@Test
- public void assertGetDataSource() {
+ public void assertGetDataSourceInTransaction() {
+ String writeDataSourceName = "test_write_ds";
+ String readDataSourceName1 = "test_replica_ds_1";
+ String readDataSourceName2 = "test_replica_ds_2";
+ List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
+ TransactionHolder.setInTransaction();
+
assertTrue(writeDataSourceName.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+ TransactionHolder.clear();
+ }
+
+ @Test
+ public void assertGetDataSourceNotInTransaction() {
String writeDataSourceName = "test_write_ds";
String readDataSourceName1 = "test_replica_ds_1";
String readDataSourceName2 = "test_replica_ds_2";
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithmTest.java
index 71a54b23e44..63445693b90 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RoundRobinReplicaLoadBalanceAlgorithmTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.Test;
import java.util.Arrays;
@@ -38,4 +39,16 @@ public final class RoundRobinReplicaLoadBalanceAlgorithmTest
{
assertThat(roundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(readDataSourceName2));
assertThat(roundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
}
+
+ @Test
+ public void assertGetDataSourceInTransaction() {
+ String writeDataSourceName = "test_write_ds";
+ String readDataSourceName1 = "test_read_ds_1";
+ String readDataSourceName2 = "test_read_ds_2";
+ RoundRobinReplicaLoadBalanceAlgorithm
roundRobinReplicaLoadBalanceAlgorithm = new
RoundRobinReplicaLoadBalanceAlgorithm();
+ List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
+ TransactionHolder.setInTransaction();
+ assertThat(roundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(writeDataSourceName));
+ TransactionHolder.clear();
+ }
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithmTest.java
similarity index 58%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithmTest.java
index 261312fd595..2e398c4b620 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/RandomReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRandomReplicaLoadBalanceAlgorithmTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.Test;
import java.util.Arrays;
@@ -24,18 +25,20 @@ import java.util.List;
import static org.junit.Assert.assertTrue;
-public final class RandomReplicaLoadBalanceAlgorithmTest {
+public final class TransactionRandomReplicaLoadBalanceAlgorithmTest {
- private final RandomReplicaLoadBalanceAlgorithm
randomReplicaLoadBalanceAlgorithm = new RandomReplicaLoadBalanceAlgorithm();
+ private final TransactionRandomReplicaLoadBalanceAlgorithm
transactionRandomReplicaLoadBalanceAlgorithm = new
TransactionRandomReplicaLoadBalanceAlgorithm();
@Test
- public void assertGetDataSource() {
+ public void assertGetDataSourceInTransaction() {
String writeDataSourceName = "test_write_ds";
String readDataSourceName1 = "test_replica_ds_1";
String readDataSourceName2 = "test_replica_ds_2";
List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
-
assertTrue(readDataSourceNames.contains(randomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+ TransactionHolder.setInTransaction();
+
assertTrue(readDataSourceNames.contains(transactionRandomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+
assertTrue(readDataSourceNames.contains(transactionRandomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+
assertTrue(readDataSourceNames.contains(transactionRandomReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+ TransactionHolder.clear();
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithmTest.java
new file mode 100644
index 00000000000..8f0ed0299b8
--- /dev/null
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionRoundRobinReplicaLoadBalanceAlgorithmTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
+
+import org.apache.shardingsphere.transaction.TransactionHolder;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public final class TransactionRoundRobinReplicaLoadBalanceAlgorithmTest {
+
+ @Test
+ public void assertGetDataSource() {
+ String writeDataSourceName = "test_write_ds";
+ String readDataSourceName1 = "test_read_ds_1";
+ String readDataSourceName2 = "test_read_ds_2";
+ TransactionRoundRobinReplicaLoadBalanceAlgorithm
transactionRoundRobinReplicaLoadBalanceAlgorithm = new
TransactionRoundRobinReplicaLoadBalanceAlgorithm();
+ List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
+
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
+
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(readDataSourceName2));
+
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
+ }
+
+ @Test
+ public void assertGetDataSourceInTransaction() {
+ String writeDataSourceName = "test_write_ds";
+ String readDataSourceName1 = "test_read_ds_1";
+ String readDataSourceName2 = "test_read_ds_2";
+ TransactionRoundRobinReplicaLoadBalanceAlgorithm
transactionRoundRobinReplicaLoadBalanceAlgorithm = new
TransactionRoundRobinReplicaLoadBalanceAlgorithm();
+ List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
+ TransactionHolder.setInTransaction();
+
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
+
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(readDataSourceName2));
+
assertThat(transactionRoundRobinReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(readDataSourceName1));
+ TransactionHolder.clear();
+ }
+}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithmTest.java
similarity index 55%
copy from
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
copy to
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithmTest.java
index ba811bd6cc1..ddad750e81a 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReplicaLoadBalanceAlgorithmTest.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -33,22 +34,25 @@ import java.util.Properties;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
-public final class WeightReplicaLoadBalanceAlgorithmTest {
+public final class TransactionWeightReplicaLoadBalanceAlgorithmTest {
@SuppressWarnings("rawtypes")
@Before
@After
public void reset() throws NoSuchFieldException, IllegalAccessException {
- Field accuracyThresholdField =
WeightReplicaLoadBalanceAlgorithm.class.getDeclaredField("WEIGHT_MAP");
+ Field accuracyThresholdField =
TransactionWeightReplicaLoadBalanceAlgorithm.class.getDeclaredField("WEIGHT_MAP");
accuracyThresholdField.setAccessible(true);
- ((Map)
accuracyThresholdField.get(WeightReplicaLoadBalanceAlgorithm.class)).clear();
+ ((Map)
accuracyThresholdField.get(TransactionWeightReplicaLoadBalanceAlgorithm.class)).clear();
}
@Test
public void assertGetSingleReadDataSource() {
- WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
- assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
"test_write_ds", Collections.singletonList("test_read_ds_1")),
is("test_read_ds_1"));
+ TransactionWeightReplicaLoadBalanceAlgorithm
transactionWeightReplicaLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createSingleDataSourceProperties());
+ TransactionHolder.setInTransaction();
+
assertThat(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds",
"test_write_ds", Collections.singletonList("test_read_ds_1")),
is("test_read_ds_1"));
+ TransactionHolder.clear();
}
private Properties createSingleDataSourceProperties() {
@@ -59,14 +63,17 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
@Test
public void assertGetMultipleReadDataSources() {
- WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
+ TransactionWeightReplicaLoadBalanceAlgorithm
transactionWeightReplicaLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
String writeDataSourceName = "test_write_ds";
String readDataSourceName1 = "test_read_ds_1";
String readDataSourceName2 = "test_read_ds_2";
List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
- assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
- assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
- assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
+ TransactionHolder.setInTransaction();
+
assertTrue(readDataSourceNames.contains(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames)));
+
assertThat(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
+
assertThat(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
+
assertThat(transactionWeightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), notNullValue());
+ TransactionHolder.clear();
}
private Properties createMultipleDataSourcesProperties() {
@@ -76,7 +83,7 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
return result;
}
- private WeightReplicaLoadBalanceAlgorithm
createReplicaLoadBalanceAlgorithm(final Properties props) {
- return (WeightReplicaLoadBalanceAlgorithm)
ReplicaLoadBalanceAlgorithmFactory.newInstance(new
ShardingSphereAlgorithmConfiguration("WEIGHT", props));
+ private TransactionWeightReplicaLoadBalanceAlgorithm
createReplicaLoadBalanceAlgorithm(final Properties props) {
+ return (TransactionWeightReplicaLoadBalanceAlgorithm)
ReplicaLoadBalanceAlgorithmFactory.newInstance(new
ShardingSphereAlgorithmConfiguration("TRANSACTION_WEIGHT", props));
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
index ba811bd6cc1..d6d8094da91 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReplicaLoadBalanceAlgorithmTest.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
+import org.apache.shardingsphere.transaction.TransactionHolder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -79,4 +80,16 @@ public final class WeightReplicaLoadBalanceAlgorithmTest {
private WeightReplicaLoadBalanceAlgorithm
createReplicaLoadBalanceAlgorithm(final Properties props) {
return (WeightReplicaLoadBalanceAlgorithm)
ReplicaLoadBalanceAlgorithmFactory.newInstance(new
ShardingSphereAlgorithmConfiguration("WEIGHT", props));
}
+
+ @Test
+ public void assertGetReadDataSourceInTransaction() {
+ WeightReplicaLoadBalanceAlgorithm weightReplicaLoadBalanceAlgorithm =
createReplicaLoadBalanceAlgorithm(createMultipleDataSourcesProperties());
+ String writeDataSourceName = "test_write_ds";
+ String readDataSourceName1 = "test_read_ds_1";
+ String readDataSourceName2 = "test_read_ds_2";
+ List<String> readDataSourceNames = Arrays.asList(readDataSourceName1,
readDataSourceName2);
+ TransactionHolder.setInTransaction();
+ assertThat(weightReplicaLoadBalanceAlgorithm.getDataSource("ds",
writeDataSourceName, readDataSourceNames), is(writeDataSourceName));
+ TransactionHolder.clear();
+ }
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/ReadwriteSplittingRuleSpringbootConfiguration.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/read
[...]
index 85cfb7007fa..65cc6ab9998 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/ReadwriteSplittingRuleSpringbootConfiguration.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/ReadwriteSplittingRuleSpringbootConfiguration.java
@@ -20,7 +20,7 @@ package
org.apache.shardingsphere.readwritesplitting.spring.boot;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.config.RuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.algorithm.config.AlgorithmProvidedReadwriteSplittingRuleConfiguration;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import
org.apache.shardingsphere.readwritesplitting.spring.boot.algorithm.ReadwriteSplittingAlgorithmProvidedBeanRegistry;
import
org.apache.shardingsphere.readwritesplitting.spring.boot.condition.ReadwriteSplittingSpringBootCondition;
import
org.apache.shardingsphere.readwritesplitting.spring.boot.rule.YamlReadwriteSplittingRuleSpringBootConfiguration;
@@ -59,9 +59,9 @@ public class ReadwriteSplittingRuleSpringbootConfiguration {
* @return readwrite-splitting rule configuration
*/
@Bean
- public RuleConfiguration readWriteSplittingRuleConfiguration(final
ObjectProvider<Map<String, ReplicaLoadBalanceAlgorithm>> loadBalanceAlgorithms)
{
+ public RuleConfiguration readWriteSplittingRuleConfiguration(final
ObjectProvider<Map<String, ReadQueryLoadBalanceAlgorithm>>
loadBalanceAlgorithms) {
AlgorithmProvidedReadwriteSplittingRuleConfiguration result =
swapper.swapToObject(yamlConfig.getReadwriteSplitting());
- Map<String, ReplicaLoadBalanceAlgorithm> balanceAlgorithmMap =
Optional.ofNullable(loadBalanceAlgorithms.getIfAvailable()).orElse(Collections.emptyMap());
+ Map<String, ReadQueryLoadBalanceAlgorithm> balanceAlgorithmMap =
Optional.ofNullable(loadBalanceAlgorithms.getIfAvailable()).orElse(Collections.emptyMap());
result.setLoadBalanceAlgorithms(balanceAlgorithmMap);
return result;
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/algorithm/ReadwriteSplittingAlgorithmProvidedBeanRegistry.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardin
[...]
index e42c10bb1ab..d7a6244dc19 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/algorithm/ReadwriteSplittingAlgorithmProvidedBeanRegistry.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-boot-starter/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/boot/algorithm/ReadwriteSplittingAlgorithmProvidedBeanRegistry.java
@@ -17,7 +17,7 @@
package org.apache.shardingsphere.readwritesplitting.spring.boot.algorithm;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import
org.apache.shardingsphere.spring.boot.registry.AbstractAlgorithmProvidedBeanRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.core.env.Environment;
@@ -25,7 +25,7 @@ import org.springframework.core.env.Environment;
/**
* Readwrite-splitting algorithm provided bean registry.
*/
-public final class ReadwriteSplittingAlgorithmProvidedBeanRegistry extends
AbstractAlgorithmProvidedBeanRegistry<ReplicaLoadBalanceAlgorithm> {
+public final class ReadwriteSplittingAlgorithmProvidedBeanRegistry extends
AbstractAlgorithmProvidedBeanRegistry<ReadQueryLoadBalanceAlgorithm> {
private static final String ALGORITHMS =
"spring.shardingsphere.rules.readwrite-splitting.load-balancers.";
@@ -40,6 +40,6 @@ public final class
ReadwriteSplittingAlgorithmProvidedBeanRegistry extends Abstr
@Override
public void postProcessBeanDefinitionRegistry(final BeanDefinitionRegistry
registry) {
- registerBean(ALGORITHMS, ReplicaLoadBalanceAlgorithm.class, registry);
+ registerBean(ALGORITHMS, ReadQueryLoadBalanceAlgorithm.class,
registry);
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/factorybean/ReplicaLoadBalanceAlgorithmFactoryBean.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/main/java/org/apache/shardingsphere/
[...]
index 95a29e054dc..9578570c158 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/factorybean/ReplicaLoadBalanceAlgorithmFactoryBean.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/main/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/factorybean/ReplicaLoadBalanceAlgorithmFactoryBean.java
@@ -19,7 +19,7 @@ package
org.apache.shardingsphere.readwritesplitting.spring.namespace.factorybea
import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import
org.apache.shardingsphere.readwritesplitting.factory.ReplicaLoadBalanceAlgorithmFactory;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import
org.apache.shardingsphere.spring.namespace.factorybean.ShardingSphereAlgorithmFactoryBean;
import java.util.Properties;
@@ -27,14 +27,14 @@ import java.util.Properties;
/**
* Replica load balance algorithm factory bean.
*/
-public final class ReplicaLoadBalanceAlgorithmFactoryBean extends
ShardingSphereAlgorithmFactoryBean<ReplicaLoadBalanceAlgorithm> {
+public final class ReplicaLoadBalanceAlgorithmFactoryBean extends
ShardingSphereAlgorithmFactoryBean<ReadQueryLoadBalanceAlgorithm> {
public ReplicaLoadBalanceAlgorithmFactoryBean(final String type, final
Properties props) {
- super(type, props, ReplicaLoadBalanceAlgorithm.class);
+ super(type, props, ReadQueryLoadBalanceAlgorithm.class);
}
@Override
- public ReplicaLoadBalanceAlgorithm getObject() {
+ public ReadQueryLoadBalanceAlgorithm getObject() {
return ReplicaLoadBalanceAlgorithmFactory.newInstance(new
ShardingSphereAlgorithmConfiguration(getType(), getProps()));
}
}
diff --git
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/test/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/ReadwriteSplittingSpringNamespaceTest.java
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/test/java/org/apache/shardingsphere/readwritespli
[...]
index 199159bea92..fbd01f1b127 100644
---
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/test/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/ReadwriteSplittingSpringNamespaceTest.java
+++
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-spring/shardingsphere-readwrite-splitting-spring-namespace/src/test/java/org/apache/shardingsphere/readwritesplitting/spring/namespace/ReadwriteSplittingSpringNamespaceTest.java
@@ -20,7 +20,7 @@ package
org.apache.shardingsphere.readwritesplitting.spring.namespace;
import
org.apache.shardingsphere.readwritesplitting.algorithm.config.AlgorithmProvidedReadwriteSplittingRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RandomReplicaLoadBalanceAlgorithm;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import
org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
+import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import
org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
@@ -36,7 +36,7 @@ import static org.junit.Assert.assertThat;
public final class ReadwriteSplittingSpringNamespaceTest extends
AbstractJUnit4SpringContextTests {
@Resource
- private ReplicaLoadBalanceAlgorithm randomLoadbalancer;
+ private ReadQueryLoadBalanceAlgorithm randomLoadbalancer;
@Resource
private AlgorithmProvidedReadwriteSplittingRuleConfiguration defaultRule;
@@ -56,7 +56,7 @@ public final class ReadwriteSplittingSpringNamespaceTest
extends AbstractJUnit4S
assertDefaultDataSourceRule(defaultRule.getDataSources().iterator().next());
}
- private void assertLoadBalancers(final Map<String,
ReplicaLoadBalanceAlgorithm> loadBalances) {
+ private void assertLoadBalancers(final Map<String,
ReadQueryLoadBalanceAlgorithm> loadBalances) {
assertThat(loadBalances.size(), is(1));
assertThat(loadBalances.get("randomLoadbalancer"),
instanceOf(RandomReplicaLoadBalanceAlgorithm.class));
}
diff --git
a/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/TransactionHolder.java
b/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/TransactionHolder.java
index 81e358079e8..8f72e52cf44 100644
---
a/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/TransactionHolder.java
+++
b/shardingsphere-kernel/shardingsphere-transaction/shardingsphere-transaction-core/src/main/java/org/apache/shardingsphere/transaction/TransactionHolder.java
@@ -30,6 +30,8 @@ public final class TransactionHolder {
private static final ThreadLocal<Boolean> TRANSACTION =
ThreadLocal.withInitial(() -> false);
+ private static final ThreadLocal<String>
READ_WRITE_SPLIT_REPLICA_ROUTE_HOLDER = new ThreadLocal<>();
+
/**
* Judge is transaction in current thread.
*
@@ -46,10 +48,29 @@ public final class TransactionHolder {
TRANSACTION.set(true);
}
+ /**
+ * Get read write split routed replica.
+ *
+ * @return routed replica.
+ */
+ public static String getReadWriteSplitRoutedReplica() {
+ return READ_WRITE_SPLIT_REPLICA_ROUTE_HOLDER.get();
+ }
+
+ /**
+ * Set read write split routed replica.
+ *
+ * @param replica routed replica.
+ */
+ public static void setReadWriteSplitRoutedReplica(final String replica) {
+ READ_WRITE_SPLIT_REPLICA_ROUTE_HOLDER.set(replica);
+ }
+
/**
* Clear transaction.
*/
public static void clear() {
TRANSACTION.remove();
+ READ_WRITE_SPLIT_REPLICA_ROUTE_HOLDER.remove();
}
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-readwrite-splitting.yaml
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-readwrite-splitting.yaml
index 4e5b4a7ebdf..2f0e2b7ec03 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-readwrite-splitting.yaml
+++
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/resources/conf/config-readwrite-splitting.yaml
@@ -61,6 +61,10 @@
# props:
# write-data-source-name: primary_ds
# read-data-source-names: replica_ds_0,replica_ds_1
+# loadBalancerName: random
+# loadBalancers:
+# random:
+# type: RANDOM
######################################################################################################
#
@@ -107,3 +111,7 @@
# props:
# write-data-source-name: write_ds
# read-data-source-names: read_ds_0,read_ds_1
+# loadBalancerName: random
+# loadBalancers:
+# random:
+# type: RANDOM