use DsStrUtils
This commit is contained in:
parent
7994897b25
commit
d54f06fa98
@ -22,6 +22,10 @@ package com.baomidou.dynamic.datasource.toolkit;
|
|||||||
*/
|
*/
|
||||||
public abstract class DsStrUtils {
|
public abstract class DsStrUtils {
|
||||||
|
|
||||||
|
public static boolean isEmpty(String str) {
|
||||||
|
return str == null || str.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断字符串是否为空
|
* 判断字符串是否为空
|
||||||
*
|
*
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>17</java.version>
|
<java.version>17</java.version>
|
||||||
<spring-boot-dependencies.version>3.1.3</spring-boot-dependencies.version>
|
<spring-boot-dependencies.version>3.1.5</spring-boot-dependencies.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@ -66,6 +66,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<version>${spring-boot-dependencies.version}</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.graalvm.buildtools</groupId>
|
<groupId>org.graalvm.buildtools</groupId>
|
||||||
|
@ -24,6 +24,7 @@ import com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException;
|
|||||||
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
|
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
|
||||||
import com.baomidou.dynamic.datasource.strategy.DynamicDataSourceStrategy;
|
import com.baomidou.dynamic.datasource.strategy.DynamicDataSourceStrategy;
|
||||||
import com.baomidou.dynamic.datasource.strategy.LoadBalanceDynamicDataSourceStrategy;
|
import com.baomidou.dynamic.datasource.strategy.LoadBalanceDynamicDataSourceStrategy;
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
|
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
|
||||||
import com.p6spy.engine.spy.P6DataSource;
|
import com.p6spy.engine.spy.P6DataSource;
|
||||||
import io.seata.rm.datasource.DataSourceProxy;
|
import io.seata.rm.datasource.DataSourceProxy;
|
||||||
@ -32,7 +33,6 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.beans.factory.DisposableBean;
|
import org.springframework.beans.factory.DisposableBean;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@ -128,7 +128,7 @@ public class DynamicRoutingDataSource extends AbstractRoutingDataSource implemen
|
|||||||
* @return 数据源
|
* @return 数据源
|
||||||
*/
|
*/
|
||||||
public DataSource getDataSource(String ds) {
|
public DataSource getDataSource(String ds) {
|
||||||
if (StringUtils.isEmpty(ds)) {
|
if (DsStrUtils.isEmpty(ds)) {
|
||||||
return determinePrimaryDataSource();
|
return determinePrimaryDataSource();
|
||||||
} else if (!groupDataSources.isEmpty() && groupDataSources.containsKey(ds)) {
|
} else if (!groupDataSources.isEmpty() && groupDataSources.containsKey(ds)) {
|
||||||
log.debug("dynamic-datasource switch to the datasource named [{}]", ds);
|
log.debug("dynamic-datasource switch to the datasource named [{}]", ds);
|
||||||
@ -188,7 +188,7 @@ public class DynamicRoutingDataSource extends AbstractRoutingDataSource implemen
|
|||||||
* @param ds 数据源名称
|
* @param ds 数据源名称
|
||||||
*/
|
*/
|
||||||
public synchronized void removeDataSource(String ds) {
|
public synchronized void removeDataSource(String ds) {
|
||||||
if (!StringUtils.hasText(ds)) {
|
if (!DsStrUtils.hasText(ds)) {
|
||||||
throw new RuntimeException("remove parameter could not be empty");
|
throw new RuntimeException("remove parameter could not be empty");
|
||||||
}
|
}
|
||||||
if (primary.equals(ds)) {
|
if (primary.equals(ds)) {
|
||||||
|
@ -20,12 +20,12 @@ import com.baomidou.dynamic.datasource.enums.SeataMode;
|
|||||||
import com.baomidou.dynamic.datasource.event.DataSourceInitEvent;
|
import com.baomidou.dynamic.datasource.event.DataSourceInitEvent;
|
||||||
import com.baomidou.dynamic.datasource.support.ScriptRunner;
|
import com.baomidou.dynamic.datasource.support.ScriptRunner;
|
||||||
import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
|
import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import com.p6spy.engine.spy.P6DataSource;
|
import com.p6spy.engine.spy.P6DataSource;
|
||||||
import io.seata.rm.datasource.DataSourceProxy;
|
import io.seata.rm.datasource.DataSourceProxy;
|
||||||
import io.seata.rm.datasource.xa.DataSourceProxyXA;
|
import io.seata.rm.datasource.xa.DataSourceProxyXA;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -84,7 +84,7 @@ public class DefaultDataSourceCreator {
|
|||||||
throw new IllegalStateException("creator must not be null,please check the DataSourceCreator");
|
throw new IllegalStateException("creator must not be null,please check the DataSourceCreator");
|
||||||
}
|
}
|
||||||
String propertyPublicKey = dataSourceProperty.getPublicKey();
|
String propertyPublicKey = dataSourceProperty.getPublicKey();
|
||||||
if (StringUtils.isEmpty(propertyPublicKey)) {
|
if (DsStrUtils.isEmpty(propertyPublicKey)) {
|
||||||
dataSourceProperty.setPublicKey(publicKey);
|
dataSourceProperty.setPublicKey(publicKey);
|
||||||
}
|
}
|
||||||
Boolean propertyLazy = dataSourceProperty.getLazy();
|
Boolean propertyLazy = dataSourceProperty.getLazy();
|
||||||
@ -112,12 +112,12 @@ public class DefaultDataSourceCreator {
|
|||||||
DatasourceInitProperties initProperty = dataSourceProperty.getInit();
|
DatasourceInitProperties initProperty = dataSourceProperty.getInit();
|
||||||
String schema = initProperty.getSchema();
|
String schema = initProperty.getSchema();
|
||||||
String data = initProperty.getData();
|
String data = initProperty.getData();
|
||||||
if (StringUtils.hasText(schema) || StringUtils.hasText(data)) {
|
if (DsStrUtils.hasText(schema) || DsStrUtils.hasText(data)) {
|
||||||
ScriptRunner scriptRunner = new ScriptRunner(initProperty.isContinueOnError(), initProperty.getSeparator());
|
ScriptRunner scriptRunner = new ScriptRunner(initProperty.isContinueOnError(), initProperty.getSeparator());
|
||||||
if (StringUtils.hasText(schema)) {
|
if (DsStrUtils.hasText(schema)) {
|
||||||
scriptRunner.runScript(dataSource, schema);
|
scriptRunner.runScript(dataSource, schema);
|
||||||
}
|
}
|
||||||
if (StringUtils.hasText(data)) {
|
if (DsStrUtils.hasText(data)) {
|
||||||
scriptRunner.runScript(dataSource, data);
|
scriptRunner.runScript(dataSource, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,11 +15,11 @@
|
|||||||
*/
|
*/
|
||||||
package com.baomidou.dynamic.datasource.ds;
|
package com.baomidou.dynamic.datasource.ds;
|
||||||
|
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
|
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
|
||||||
import com.baomidou.dynamic.datasource.tx.ConnectionFactory;
|
import com.baomidou.dynamic.datasource.tx.ConnectionFactory;
|
||||||
import com.baomidou.dynamic.datasource.tx.ConnectionProxy;
|
import com.baomidou.dynamic.datasource.tx.ConnectionProxy;
|
||||||
import com.baomidou.dynamic.datasource.tx.TransactionContext;
|
import com.baomidou.dynamic.datasource.tx.TransactionContext;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@ -50,11 +50,11 @@ public abstract class AbstractRoutingDataSource extends AbstractDataSource {
|
|||||||
@Override
|
@Override
|
||||||
public Connection getConnection() throws SQLException {
|
public Connection getConnection() throws SQLException {
|
||||||
String xid = TransactionContext.getXID();
|
String xid = TransactionContext.getXID();
|
||||||
if (StringUtils.isEmpty(xid)) {
|
if (DsStrUtils.isEmpty(xid)) {
|
||||||
return determineDataSource().getConnection();
|
return determineDataSource().getConnection();
|
||||||
} else {
|
} else {
|
||||||
String ds = DynamicDataSourceContextHolder.peek();
|
String ds = DynamicDataSourceContextHolder.peek();
|
||||||
ds = StringUtils.isEmpty(ds) ? getPrimary() : ds;
|
ds = DsStrUtils.isEmpty(ds) ? getPrimary() : ds;
|
||||||
ConnectionProxy connection = ConnectionFactory.getConnection(xid, ds);
|
ConnectionProxy connection = ConnectionFactory.getConnection(xid, ds);
|
||||||
return connection == null ? getConnectionProxy(xid, ds, determineDataSource().getConnection()) : connection;
|
return connection == null ? getConnectionProxy(xid, ds, determineDataSource().getConnection()) : connection;
|
||||||
}
|
}
|
||||||
@ -63,11 +63,11 @@ public abstract class AbstractRoutingDataSource extends AbstractDataSource {
|
|||||||
@Override
|
@Override
|
||||||
public Connection getConnection(String username, String password) throws SQLException {
|
public Connection getConnection(String username, String password) throws SQLException {
|
||||||
String xid = TransactionContext.getXID();
|
String xid = TransactionContext.getXID();
|
||||||
if (StringUtils.isEmpty(xid)) {
|
if (DsStrUtils.isEmpty(xid)) {
|
||||||
return determineDataSource().getConnection(username, password);
|
return determineDataSource().getConnection(username, password);
|
||||||
} else {
|
} else {
|
||||||
String ds = DynamicDataSourceContextHolder.peek();
|
String ds = DynamicDataSourceContextHolder.peek();
|
||||||
ds = StringUtils.isEmpty(ds) ? getPrimary() : ds;
|
ds = DsStrUtils.isEmpty(ds) ? getPrimary() : ds;
|
||||||
ConnectionProxy connection = ConnectionFactory.getConnection(xid, ds);
|
ConnectionProxy connection = ConnectionFactory.getConnection(xid, ds);
|
||||||
return connection == null ? getConnectionProxy(xid, ds, determineDataSource().getConnection(username, password))
|
return connection == null ? getConnectionProxy(xid, ds, determineDataSource().getConnection(username, password))
|
||||||
: connection;
|
: connection;
|
||||||
|
@ -17,8 +17,8 @@ package com.baomidou.dynamic.datasource.event;
|
|||||||
|
|
||||||
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
|
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
|
||||||
import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
|
import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
@ -40,7 +40,7 @@ public class EncDataSourceInitEvent implements DataSourceInitEvent {
|
|||||||
@Override
|
@Override
|
||||||
public void beforeCreate(DataSourceProperty dataSourceProperty) {
|
public void beforeCreate(DataSourceProperty dataSourceProperty) {
|
||||||
String publicKey = dataSourceProperty.getPublicKey();
|
String publicKey = dataSourceProperty.getPublicKey();
|
||||||
if (StringUtils.hasText(publicKey)) {
|
if (DsStrUtils.hasText(publicKey)) {
|
||||||
dataSourceProperty.setUrl(decrypt(publicKey, dataSourceProperty.getUrl()));
|
dataSourceProperty.setUrl(decrypt(publicKey, dataSourceProperty.getUrl()));
|
||||||
dataSourceProperty.setUsername(decrypt(publicKey, dataSourceProperty.getUsername()));
|
dataSourceProperty.setUsername(decrypt(publicKey, dataSourceProperty.getUsername()));
|
||||||
dataSourceProperty.setPassword(decrypt(publicKey, dataSourceProperty.getPassword()));
|
dataSourceProperty.setPassword(decrypt(publicKey, dataSourceProperty.getPassword()));
|
||||||
@ -56,7 +56,7 @@ public class EncDataSourceInitEvent implements DataSourceInitEvent {
|
|||||||
* 字符串解密
|
* 字符串解密
|
||||||
*/
|
*/
|
||||||
private String decrypt(String publicKey, String cipherText) {
|
private String decrypt(String publicKey, String cipherText) {
|
||||||
if (StringUtils.hasText(cipherText)) {
|
if (DsStrUtils.hasText(cipherText)) {
|
||||||
Matcher matcher = ENC_PATTERN.matcher(cipherText);
|
Matcher matcher = ENC_PATTERN.matcher(cipherText);
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
try {
|
try {
|
||||||
|
@ -17,8 +17,8 @@ package com.baomidou.dynamic.datasource.provider;
|
|||||||
|
|
||||||
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
|
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
|
||||||
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
|
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@ -106,7 +106,7 @@ public abstract class AbstractJdbcDataSourceProvider extends AbstractDataSourceP
|
|||||||
try {
|
try {
|
||||||
// 由于 SPI 的支持,现在已无需显示加载驱动了
|
// 由于 SPI 的支持,现在已无需显示加载驱动了
|
||||||
// 但在用户显示配置的情况下,进行主动加载
|
// 但在用户显示配置的情况下,进行主动加载
|
||||||
if (!StringUtils.isEmpty(driverClassName)) {
|
if (!DsStrUtils.isEmpty(driverClassName)) {
|
||||||
Class.forName(driverClassName);
|
Class.forName(driverClassName);
|
||||||
log.info("成功加载数据库驱动程序");
|
log.info("成功加载数据库驱动程序");
|
||||||
}
|
}
|
||||||
@ -116,7 +116,7 @@ public abstract class AbstractJdbcDataSourceProvider extends AbstractDataSourceP
|
|||||||
Map<String, DataSourceProperty> dataSourcePropertiesMap = executeStmt(stmt);
|
Map<String, DataSourceProperty> dataSourcePropertiesMap = executeStmt(stmt);
|
||||||
return createDataSourceMap(dataSourcePropertiesMap);
|
return createDataSourceMap(dataSourcePropertiesMap);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
log.error("loadDataSources error", e);
|
||||||
} finally {
|
} finally {
|
||||||
closeResource(conn);
|
closeResource(conn);
|
||||||
closeResource(stmt);
|
closeResource(stmt);
|
||||||
|
@ -274,7 +274,7 @@ public class DataSourceClassResolver {
|
|||||||
//AnnotatedElementUtils.findMergedAnnotation()会委托给findMergedAnnotationAttributes()
|
//AnnotatedElementUtils.findMergedAnnotation()会委托给findMergedAnnotationAttributes()
|
||||||
DS ds = AnnotatedElementUtils.findMergedAnnotation(ae, DS.class);
|
DS ds = AnnotatedElementUtils.findMergedAnnotation(ae, DS.class);
|
||||||
if (ds != null) {
|
if (ds != null) {
|
||||||
return (BasicAttribute<T>) new BasicAttribute<>(ds.value());
|
return new BasicAttribute(ds.value());
|
||||||
}
|
}
|
||||||
} else if (annotation.isAssignableFrom(DSTransactional.class)) {
|
} else if (annotation.isAssignableFrom(DSTransactional.class)) {
|
||||||
DSTransactional dsTransactional = AnnotatedElementUtils.findMergedAnnotation(ae, DSTransactional.class);
|
DSTransactional dsTransactional = AnnotatedElementUtils.findMergedAnnotation(ae, DSTransactional.class);
|
||||||
@ -283,7 +283,7 @@ public class DataSourceClassResolver {
|
|||||||
transactionalInfo.setPropagation(dsTransactional.propagation());
|
transactionalInfo.setPropagation(dsTransactional.propagation());
|
||||||
transactionalInfo.setRollbackFor(dsTransactional.rollbackFor());
|
transactionalInfo.setRollbackFor(dsTransactional.rollbackFor());
|
||||||
transactionalInfo.setNoRollbackFor(dsTransactional.noRollbackFor());
|
transactionalInfo.setNoRollbackFor(dsTransactional.noRollbackFor());
|
||||||
return (BasicAttribute<T>) new BasicAttribute(transactionalInfo);
|
return new BasicAttribute(transactionalInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.baomidou.dynamic.datasource.support;
|
package com.baomidou.dynamic.datasource.support;
|
||||||
|
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||||
@ -22,7 +23,6 @@ import org.springframework.core.io.support.ResourcePatternResolver;
|
|||||||
import org.springframework.dao.DataAccessException;
|
import org.springframework.dao.DataAccessException;
|
||||||
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
|
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
|
||||||
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
|
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ public class ScriptRunner {
|
|||||||
* @param location 脚本位置
|
* @param location 脚本位置
|
||||||
*/
|
*/
|
||||||
public void runScript(DataSource dataSource, String location) {
|
public void runScript(DataSource dataSource, String location) {
|
||||||
if (StringUtils.hasText(location)) {
|
if (DsStrUtils.hasText(location)) {
|
||||||
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
|
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
|
||||||
populator.setContinueOnError(continueOnError);
|
populator.setContinueOnError(continueOnError);
|
||||||
populator.setSeparator(separator);
|
populator.setSeparator(separator);
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
package com.baomidou.dynamic.datasource.toolkit;
|
package com.baomidou.dynamic.datasource.toolkit;
|
||||||
|
|
||||||
import org.springframework.core.NamedThreadLocal;
|
import org.springframework.core.NamedThreadLocal;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
@ -66,7 +65,7 @@ public final class DynamicDataSourceContextHolder {
|
|||||||
* @return 数据源名称
|
* @return 数据源名称
|
||||||
*/
|
*/
|
||||||
public static String push(String ds) {
|
public static String push(String ds) {
|
||||||
String dataSourceStr = StringUtils.isEmpty(ds) ? "" : ds;
|
String dataSourceStr = DsStrUtils.isEmpty(ds) ? "" : ds;
|
||||||
LOOKUP_KEY_HOLDER.get().push(dataSourceStr);
|
LOOKUP_KEY_HOLDER.get().push(dataSourceStr);
|
||||||
return dataSourceStr;
|
return dataSourceStr;
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.baomidou.dynamic.datasource.tx;
|
package com.baomidou.dynamic.datasource.tx;
|
||||||
|
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -33,12 +33,7 @@ public final class LocalTxUtil {
|
|||||||
/**
|
/**
|
||||||
* SecureRandom instance used to generate UUIDs.
|
* SecureRandom instance used to generate UUIDs.
|
||||||
*/
|
*/
|
||||||
private static final ThreadLocal<SecureRandom> SECURE_RANDOM_HOLDER = new ThreadLocal<SecureRandom>() {
|
private static final ThreadLocal<SecureRandom> SECURE_RANDOM_HOLDER = ThreadLocal.withInitial(SecureRandom::new);
|
||||||
@Override
|
|
||||||
protected SecureRandom initialValue() {
|
|
||||||
return new SecureRandom();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 随机生成UUID
|
* 随机生成UUID
|
||||||
@ -75,7 +70,7 @@ public final class LocalTxUtil {
|
|||||||
*/
|
*/
|
||||||
public static String startTransaction() {
|
public static String startTransaction() {
|
||||||
String xid = TransactionContext.getXID();
|
String xid = TransactionContext.getXID();
|
||||||
if (!StringUtils.isEmpty(xid)) {
|
if (!DsStrUtils.isEmpty(xid)) {
|
||||||
log.debug("dynamic-datasource exist local tx [{}]", xid);
|
log.debug("dynamic-datasource exist local tx [{}]", xid);
|
||||||
} else {
|
} else {
|
||||||
xid = randomUUID().toString();
|
xid = randomUUID().toString();
|
||||||
|
@ -15,9 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package com.baomidou.dynamic.datasource.tx;
|
package com.baomidou.dynamic.datasource.tx;
|
||||||
|
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
|
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
|
||||||
import org.springframework.transaction.support.TransactionSynchronization;
|
import org.springframework.transaction.support.TransactionSynchronization;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ public class TransactionContext {
|
|||||||
|
|
||||||
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
||||||
private static final ThreadLocal<Set<TransactionSynchronization>> SYNCHRONIZATION_HOLDER =
|
private static final ThreadLocal<Set<TransactionSynchronization>> SYNCHRONIZATION_HOLDER =
|
||||||
ThreadLocal.withInitial(() -> new LinkedHashSet<>());
|
ThreadLocal.withInitial(LinkedHashSet::new);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets xid.
|
* Gets xid.
|
||||||
@ -37,7 +37,7 @@ public class TransactionContext {
|
|||||||
*/
|
*/
|
||||||
public static String getXID() {
|
public static String getXID() {
|
||||||
String xid = CONTEXT_HOLDER.get();
|
String xid = CONTEXT_HOLDER.get();
|
||||||
if (!StringUtils.isEmpty(xid)) {
|
if (DsStrUtils.hasText(xid)) {
|
||||||
return xid;
|
return xid;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -16,9 +16,9 @@
|
|||||||
package com.baomidou.dynamic.datasource.tx;
|
package com.baomidou.dynamic.datasource.tx;
|
||||||
|
|
||||||
import com.baomidou.dynamic.datasource.exception.TransactionException;
|
import com.baomidou.dynamic.datasource.exception.TransactionException;
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.transaction.support.TransactionSynchronization;
|
import org.springframework.transaction.support.TransactionSynchronization;
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ public class TransactionalTemplate {
|
|||||||
private Object doExecute(TransactionalExecutor transactionalExecutor) throws Throwable {
|
private Object doExecute(TransactionalExecutor transactionalExecutor) throws Throwable {
|
||||||
TransactionalInfo transactionInfo = transactionalExecutor.getTransactionInfo();
|
TransactionalInfo transactionInfo = transactionalExecutor.getTransactionInfo();
|
||||||
DsPropagation propagation = transactionInfo.propagation;
|
DsPropagation propagation = transactionInfo.propagation;
|
||||||
if (!StringUtils.isEmpty(TransactionContext.getXID()) && !propagation.equals(DsPropagation.NESTED)) {
|
if (!DsStrUtils.isEmpty(TransactionContext.getXID()) && !propagation.equals(DsPropagation.NESTED)) {
|
||||||
return transactionalExecutor.execute();
|
return transactionalExecutor.execute();
|
||||||
}
|
}
|
||||||
boolean state = true;
|
boolean state = true;
|
||||||
@ -215,7 +215,7 @@ public class TransactionalTemplate {
|
|||||||
* @return 是否存在事务
|
* @return 是否存在事务
|
||||||
*/
|
*/
|
||||||
public boolean existingTransaction() {
|
public boolean existingTransaction() {
|
||||||
return !StringUtils.isEmpty(TransactionContext.getXID());
|
return !DsStrUtils.isEmpty(TransactionContext.getXID());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
14
pom.xml
14
pom.xml
@ -54,13 +54,13 @@
|
|||||||
<spring-boot-dependencies.version>2.7.15</spring-boot-dependencies.version>
|
<spring-boot-dependencies.version>2.7.15</spring-boot-dependencies.version>
|
||||||
<mybatis.plus.version>3.5.3.2</mybatis.plus.version>
|
<mybatis.plus.version>3.5.3.2</mybatis.plus.version>
|
||||||
<hikaricp.version>2.4.13</hikaricp.version>
|
<hikaricp.version>2.4.13</hikaricp.version>
|
||||||
<druid.version>1.2.19</druid.version>
|
<druid.version>1.2.20</druid.version>
|
||||||
<beeCp.version>3.4.1</beeCp.version>
|
<beeCp.version>3.4.2</beeCp.version>
|
||||||
<commons-dbcp2.version>2.9.0</commons-dbcp2.version>
|
<commons-dbcp2.version>2.10.0</commons-dbcp2.version>
|
||||||
<p6spy.version>3.9.1</p6spy.version>
|
<p6spy.version>3.9.1</p6spy.version>
|
||||||
<seata.version>1.4.2</seata.version>
|
<seata.version>1.4.2</seata.version>
|
||||||
<lombok.version>1.18.30</lombok.version>
|
<lombok.version>1.18.30</lombok.version>
|
||||||
<h2.version>2.2.222</h2.version>
|
<h2.version>2.2.224</h2.version>
|
||||||
<atomikos.version>4.0.6</atomikos.version>
|
<atomikos.version>4.0.6</atomikos.version>
|
||||||
<junit-jupiter.version>5.10.0</junit-jupiter.version>
|
<junit-jupiter.version>5.10.0</junit-jupiter.version>
|
||||||
|
|
||||||
@ -69,13 +69,13 @@
|
|||||||
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
|
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
|
||||||
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
|
||||||
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
|
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
|
||||||
<maven-javadoc-plugin.version>3.5.0</maven-javadoc-plugin.version>
|
<maven-javadoc-plugin.version>3.6.0</maven-javadoc-plugin.version>
|
||||||
<maven-source-plugin.version>3.3.0</maven-source-plugin.version>
|
<maven-source-plugin.version>3.3.0</maven-source-plugin.version>
|
||||||
|
|
||||||
<license-maven-plugin.version>4.2</license-maven-plugin.version>
|
<license-maven-plugin.version>4.3</license-maven-plugin.version>
|
||||||
<maven-gpg-plugin.version>3.1.0</maven-gpg-plugin.version>
|
<maven-gpg-plugin.version>3.1.0</maven-gpg-plugin.version>
|
||||||
<nexus-staging-maven-plugin.version>1.6.13</nexus-staging-maven-plugin.version>
|
<nexus-staging-maven-plugin.version>1.6.13</nexus-staging-maven-plugin.version>
|
||||||
<native-maven-plugin.version>0.9.27</native-maven-plugin.version>
|
<native-maven-plugin.version>0.9.28</native-maven-plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user