+++ title = “Java Configuration” weight = 1 +++

Configuration Instance

Data Sharding

     DataSource getShardingDataSource() throws SQLException {
         ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
         shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
         shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());
         shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");
         shardingRuleConfig.getBroadcastTables().add("t_config");
         shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}"));
         shardingRuleConfig.setDefaultTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new ModuloShardingTableAlgorithm()));
         return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, new Properties());
     }
     
     private static KeyGeneratorConfiguration getKeyGeneratorConfiguration() {
         KeyGeneratorConfiguration result = new KeyGeneratorConfiguration("SNOWFLAKE", "order_id");
         return result;
     }
     
     TableRuleConfiguration getOrderTableRuleConfiguration() {
         TableRuleConfiguration result = new TableRuleConfiguration("t_order", "ds${0..1}.t_order${0..1}");
         result.setKeyGeneratorConfig(getKeyGeneratorConfiguration());
         return result;
     }
     
     TableRuleConfiguration getOrderItemTableRuleConfiguration() {
         TableRuleConfiguration result = new TableRuleConfiguration("t_order_item", "ds${0..1}.t_order_item${0..1}");
         return result;
     }
     
     Map<String, DataSource> createDataSourceMap() {
         Map<String, DataSource> result = new HashMap<>();
         result.put("ds0", DataSourceUtil.createDataSource("ds0"));
         result.put("ds1", DataSourceUtil.createDataSource("ds1"));
         return result;
     }

Read-Write Split

     DataSource getMasterSlaveDataSource() throws SQLException {
         MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration("ds_master_slave", "ds_master", Arrays.asList("ds_slave0", "ds_slave1"));
         return MasterSlaveDataSourceFactory.createDataSource(createDataSourceMap(), masterSlaveRuleConfig, new Properties());
     }
     
     Map<String, DataSource> createDataSourceMap() {
         Map<String, DataSource> result = new HashMap<>();
         result.put("ds_master", DataSourceUtil.createDataSource("ds_master"));
         result.put("ds_slave0", DataSourceUtil.createDataSource("ds_slave0"));
         result.put("ds_slave1", DataSourceUtil.createDataSource("ds_slave1"));
         return result;
     }

data encryption

    DataSource getEncryptDataSource() throws SQLException {
        return EncryptDataSourceFactory.createDataSource(DataSourceUtil.createDataSource("demo_ds"), getEncryptRuleConfiguration(), new Properties());
    }

    private static EncryptRuleConfiguration getEncryptRuleConfiguration() {
        Properties props = new Properties();
        props.setProperty("aes.key.value", "123456");
        EncryptorRuleConfiguration encryptorConfig = new EncryptorRuleConfiguration("AES", props);
        EncryptColumnRuleConfiguration columnConfig = new EncryptColumnRuleConfiguration("plain_pwd", "cipher_pwd", "", "aes");
        EncryptTableRuleConfiguration tableConfig = new EncryptTableRuleConfiguration(Collections.singletonMap("pwd", columnConfig));
        EncryptRuleConfiguration encryptRuleConfig = new EncryptRuleConfiguration();
        encryptRuleConfig.getEncryptors().put("aes", encryptorConfig);
        encryptRuleConfig.getTables().put("t_encrypt", tableConfig);
		return encryptRuleConfig;
    }

Data Sharding + Read-Write Split

    DataSource getDataSource() throws SQLException {
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
        shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
        shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());
        shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");
        shardingRuleConfig.getBroadcastTables().add("t_config");
        shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new PreciseModuloShardingDatabaseAlgorithm()));
        shardingRuleConfig.setDefaultTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new PreciseModuloShardingTableAlgorithm()));
        shardingRuleConfig.setMasterSlaveRuleConfigs(getMasterSlaveRuleConfigurations());
        return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, new Properties());
    }
    
    private static KeyGeneratorConfiguration getKeyGeneratorConfiguration() {
        KeyGeneratorConfiguration result = new KeyGeneratorConfiguration("SNOWFLAKE", "order_id");
        return result;
    }
    
    TableRuleConfiguration getOrderTableRuleConfiguration() {
        TableRuleConfiguration result = new TableRuleConfiguration("t_order", "ds_${0..1}.t_order_${[0, 1]}");
        result.setKeyGeneratorConfig(getKeyGeneratorConfiguration());
        return result;
    }
    
    TableRuleConfiguration getOrderItemTableRuleConfiguration() {
        TableRuleConfiguration result = new TableRuleConfiguration("t_order_item", "ds_${0..1}.t_order_item_${[0, 1]}");
        return result;
    }
    
    List<MasterSlaveRuleConfiguration> getMasterSlaveRuleConfigurations() {
        MasterSlaveRuleConfiguration masterSlaveRuleConfig1 = new MasterSlaveRuleConfiguration("ds_0", "demo_ds_master_0", Arrays.asList("demo_ds_master_0_slave_0", "demo_ds_master_0_slave_1"));
        MasterSlaveRuleConfiguration masterSlaveRuleConfig2 = new MasterSlaveRuleConfiguration("ds_1", "demo_ds_master_1", Arrays.asList("demo_ds_master_1_slave_0", "demo_ds_master_1_slave_1"));
        return Lists.newArrayList(masterSlaveRuleConfig1, masterSlaveRuleConfig2);
    }
    
    Map<String, DataSource> createDataSourceMap() {
        final Map<String, DataSource> result = new HashMap<>();
        result.put("demo_ds_master_0", DataSourceUtil.createDataSource("demo_ds_master_0"));
        result.put("demo_ds_master_0_slave_0", DataSourceUtil.createDataSource("demo_ds_master_0_slave_0"));
        result.put("demo_ds_master_0_slave_1", DataSourceUtil.createDataSource("demo_ds_master_0_slave_1"));
        result.put("demo_ds_master_1", DataSourceUtil.createDataSource("demo_ds_master_1"));
        result.put("demo_ds_master_1_slave_0", DataSourceUtil.createDataSource("demo_ds_master_1_slave_0"));
        result.put("demo_ds_master_1_slave_1", DataSourceUtil.createDataSource("demo_ds_master_1_slave_1"));
        return result;
    }

Data Sharding + data encryption

    public DataSource getDataSource() throws SQLException {
            ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
            shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
            shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());
            shardingRuleConfig.getTableRuleConfigs().add(getOrderEncryptTableRuleConfiguration());
            shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");
            shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "demo_ds_${user_id % 2}"));
            shardingRuleConfig.setDefaultTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new PreciseModuloShardingTableAlgorithm()));
            shardingRuleConfig.setEncryptRuleConfig(getEncryptRuleConfiguration());
            return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, new Properties());
        }
        
        private static TableRuleConfiguration getOrderTableRuleConfiguration() {
            TableRuleConfiguration result = new TableRuleConfiguration("t_order", "demo_ds_${0..1}.t_order_${[0, 1]}");
            result.setKeyGeneratorConfig(getKeyGeneratorConfiguration());
            return result;
        }
        
        private static TableRuleConfiguration getOrderItemTableRuleConfiguration() {
            TableRuleConfiguration result = new TableRuleConfiguration("t_order_item", "demo_ds_${0..1}.t_order_item_${[0, 1]}");
            result.setEncryptorConfig(new EncryptorConfiguration("MD5", "status", new Properties()));
            return result;
        }
        
        private static EncryptRuleConfiguration getEncryptRuleConfiguration() {
            Properties props = new Properties();
            props.setProperty("aes.key.value", "123456");
            EncryptorRuleConfiguration encryptorConfig = new EncryptorRuleConfiguration("AES", props);
            EncryptColumnRuleConfiguration columnConfig = new EncryptColumnRuleConfiguration("plain_order", "cipher_order", "", "aes");
            EncryptTableRuleConfiguration tableConfig = new EncryptTableRuleConfiguration(Collections.singletonMap("order_id", columnConfig));
            EncryptRuleConfiguration encryptRuleConfig = new EncryptRuleConfiguration();
            encryptRuleConfig.getEncryptors().put("aes", encryptorConfig);
            encryptRuleConfig.getTables().put("t_order", tableConfig);
			return encryptRuleConfig;
        }
        
        private static Map<String, DataSource> createDataSourceMap() {
            Map<String, DataSource> result = new HashMap<>();
            result.put("demo_ds_0", DataSourceUtil.createDataSource("demo_ds_0"));
            result.put("demo_ds_1", DataSourceUtil.createDataSource("demo_ds_1"));
            return result;
        }
        
        private static KeyGeneratorConfiguration getKeyGeneratorConfiguration() {
            return new KeyGeneratorConfiguration("SNOWFLAKE", "order_id", new Properties());
        }

Orchestration

    DataSource getDataSource() throws SQLException {
        // OrchestrationShardingDataSourceFactory 可替换成 OrchestrationMasterSlaveDataSourceFactory 或 OrchestrationEncryptDataSourceFactory
        return OrchestrationShardingDataSourceFactory.createDataSource(
                createDataSourceMap(), createShardingRuleConfig(), new HashMap<String, Object>(), new Properties(), 
                new OrchestrationConfiguration(createCenterConfigurationMap()));
    }
    private Map<String, CenterConfiguration> createCenterConfigurationMap() {
        Map<String, CenterConfiguration> instanceConfigurationMap = new HashMap<String, CenterConfiguration>();
        CenterConfiguration config = createCenterConfiguration();
        instanceConfigurationMap.put("orchestration-shardingsphere-data-source", config);
        return instanceConfigurationMap;
    }
    private CenterConfiguration createCenterConfiguration() {
        Properties properties = new Properties();
        properties.setProperty("overwrite", overwrite);
        CenterConfiguration result = new CenterConfiguration("zookeeper", properties);
        result.setServerLists("localhost:2181");
        result.setNamespace("shardingsphere-orchestration");
        result.setOrchestrationType("registry_center,config_center,metadata_center");
        return result;
    }

Configuration Item Explanation

Data Sharding

ShardingDataSourceFactory

NameDataTypeExplanation
dataSourceMapMap<String, DataSource>Data sources configuration
shardingRuleConfigShardingRuleConfigurationData sharding configuration rule
props (?)PropertiesProperty configuration

ShardingRuleConfiguration

NameDataTypeExplanation
tableRuleConfigsCollection<TableRuleConfiguration>Sharding rule list
bindingTableGroups (?)Collection<String>Binding table rule list
broadcastTables (?)Collection<String>Broadcast table rule list
defaultDataSourceName (?)StringTables not configured with sharding rules will locate according to default data sources
defaultDatabaseShardingStrategyConfig (?)ShardingStrategyConfigurationDefault database sharding strategy
defaultTableShardingStrategyConfig (?)ShardingStrategyConfigurationDefault table sharding strategy
defaultKeyGeneratorConfig (?)KeyGeneratorConfigurationDefault key generator configuration, use user-defined ones or built-in ones, e.g. SNOWFLAKE/UUID. Default key generator is org.apache.shardingsphere.core.keygen.generator.impl.SnowflakeKeyGenerator
masterSlaveRuleConfigs (?)Collection<MasterSlaveRuleConfiguration>Read-write split rules, default indicates not using read-write split

TableRuleConfiguration

NameDataTypeDescription
logicTableStringName of logic table
actualDataNodes (?)StringDescribe data source names and actual tables, delimiter as point, multiple data nodes split by comma, support inline expression. Absent means sharding databases only. Example: ds${0..7}.tbl${0..7}
databaseShardingStrategyConfig (?)ShardingStrategyConfigurationDatabases sharding strategy, use default databases sharding strategy if absent
tableShardingStrategyConfig (?)ShardingStrategyConfigurationTables sharding strategy, use default databases sharding strategy if absent
keyGeneratorConfig (?)KeyGeneratorConfigurationKey generator configuration, use default key generator if absent
encryptorConfiguration (?)EncryptorConfigurationEncrypt generator configuration

StandardShardingStrategyConfiguration

Subclass of ShardingStrategyConfiguration.

NameDataTypeExplanation
shardingColumnStringSharding column name
preciseShardingAlgorithmPreciseShardingAlgorithmPrecise sharding algorithm used in = and IN
rangeShardingAlgorithm (?)RangeShardingAlgorithmRange sharding algorithm used in BETWEEN

ComplexShardingStrategyConfiguration

The implementation class of ShardingStrategyConfiguration, used in complex sharding situations with multiple sharding keys.

NameDataTypeExplanation
shardingColumnsStringSharding column name, separated by commas
shardingAlgorithmComplexKeysShardingAlgorithmComplex sharding algorithm

InlineShardingStrategyConfiguration

The implementation class of ShardingStrategyConfiguration, used in sharding strategy of inline expression.

NameDataTypeExplanation
shardingColumnStringSharding column name
algorithmExpressionStringInline expression of sharding strategies, should conform to groovy syntax; refer to Inline expression for more details

HintShardingStrategyConfiguration

The implementation class of ShardingStrategyConfiguration, used to configure hint sharding strategies.

NameDataTypeDescription
shardingAlgorithmHintShardingAlgorithmHint sharding algorithm

NoneShardingStrategyConfiguration

The implementation class of ShardingStrategyConfiguration, used to configure none-sharding strategies.

KeyGeneratorConfiguration

NameDataTypeDescription
columnStringColumn name of key generator
typeStringType of key generator, use user-defined ones or built-in ones, e.g. SNOWFLAKE, UUID
propsPropertiesThe Property configuration of key generators

Properties

Property configuration that can include these properties of these key generators.

SNOWFLAKE
NameDataTypeExplanation
worker.id (?)longThe unique id for working machine, the default value is 0
max.tolerate.time.difference.milliseconds (?)longThe max tolerate time for different server's time difference in milliseconds, the default value is 10
max.vibration.offset (?)intThe max upper limit value of vibrate number, range [0, 4096), the default value is 1. Notice: To use the generated value of this algorithm as sharding value, it is recommended to configure this property. The algorithm generates key mod 2^n (2^n is usually the sharding amount of tables or databases) in different milliseconds and the result is always 0 or 1. To prevent the above sharding problem, it is recommended to configure this property, its value is (2^n)-1

EncryptRuleConfiguration

NameDataTypeExplanation
encryptorsMap<String, EncryptorRuleConfiguration>Encryptor names and encryptors
tablesMap<String, EncryptTableRuleConfiguration>Encrypt table names and encrypt tables

EncryptorRuleConfiguration

NameDataTypeExplanation
typeStringType of encryptor,use user-defined ones or built-in ones, e.g. MD5/AES
propertiesPropertiesProperties, Notice: when use AES encryptor, aes.key.value for AES encryptor need to be set

EncryptTableRuleConfiguration

NameDataTypeExplanation
tablesMap<String, EncryptColumnRuleConfiguration>Encrypt column names and encrypt column

EncryptColumnRuleConfiguration

NameDataTypeExplanation
plainColumnStringPlain column name
cipherColumnStringCipher column name
assistedQueryColumnStringAssistedColumns for query,when use ShardingQueryAssistedEncryptor, it can help query encrypted data
encryptorStringEncryptor name

Properties

Property configuration items, can be of the following properties.

NameDataTypeExplanation
sql.show (?)booleanShow SQL or not, default value: false
executor.size (?)intWork thread number, default value: CPU core number
max.connections.size.per.query (?)intThe maximum connection number allocated by each query of each physical database. default value: 1
check.table.metadata.enabled (?)booleanCheck meta-data consistency or not in initialization, default value: false
query.with.cipher.column (?)booleanWhen there is a plainColumn, use cipherColumn or not to query, default value: true
allow.range.query.with.inline.sharding (?)booleanAllow or not execute range query with inline sharding strategy, default value: false

Read-Write Split

MasterSlaveDataSourceFactory

NameDataTypeExplanation
dataSourceMapMap<String, DataSource>Mapping of data source and its name
masterSlaveRuleConfigMasterSlaveRuleConfigurationMaster slave rule configuration
props (?)PropertiesProperty configurations

MasterSlaveRuleConfiguration

NameDataTypeExplanation
nameStringRead-write split data source name
masterDataSourceNameStringMaster database source name
slaveDataSourceNamesCollection<String>Slave database source name list
loadBalanceAlgorithm (?)MasterSlaveLoadBalanceAlgorithmSlave database load balance

Properties

Property configuration items, can be of the following properties.

NameData TypeExplanation
sql.show (?)booleanPrint SQL parse and rewrite log or not, default value: false
executor.size (?)intBe used in work thread number implemented by SQL; no limits if it is 0. default value: 0
max.connections.size.per.query (?)intThe maximum connection number allocated by each query of each physical database, default value: 1
check.table.metadata.enabled (?)booleanCheck meta-data consistency or not in initialization, default value: false

data encryption

EncryptDataSourceFactory

NameDataTypeExplanation
dataSourceDataSourceData source
encryptRuleConfigEncryptRuleConfigurationencrypt rule configuration
props (?)PropertiesProperty configurations

EncryptRuleConfiguration

NameDataTypeExplanation
encryptorsMap<String, EncryptorRuleConfiguration>Encryptor names and encryptors
tablesMap<String, EncryptTableRuleConfiguration>Encrypt table names and encrypt tables

Properties

Property configuration items, can be of the following properties.

NameDataTypeExplanation
sql.show (?)booleanPrint SQL parse and rewrite log or not, default value: false
query.with.cipher.column (?)booleanWhen there is a plainColumn, use cipherColumn or not to query, default value: true

Orchestration

OrchestrationShardingDataSourceFactory

NameDataTypeExplanation
dataSourceMapMap<String, DataSource>Same as ShardingDataSourceFactory
shardingRuleConfigShardingRuleConfigurationSame as ShardingDataSourceFactory
props (?)PropertiesSame as ShardingDataSourceFactory
orchestrationConfigOrchestrationConfigurationOrchestration rule configurations

OrchestrationMasterSlaveDataSourceFactory

NameData TypeExplanation
dataSourceMapMap<String, DataSource>Same as MasterSlaveDataSourceFactory
masterSlaveRuleConfigMasterSlaveRuleConfigurationSame as MasterSlaveDataSourceFactory
configMap (?)Map<String, Object>Same as MasterSlaveDataSourceFactory
props (?)PropertiesSame as ShardingDataSourceFactory
orchestrationConfigOrchestrationConfigurationOrchestration rule configurations

OrchestrationEncryptDataSourceFactory

NameDataTypeExplanation
dataSourceDataSourceSame as EncryptDataSourceFactory
encryptRuleConfigEncryptRuleConfigurationSame as EncryptDataSourceFactory
props (?)PropertiesSame as EncryptDataSourceFactory
orchestrationConfigOrchestrationConfigurationOrchestration rule configurations

OrchestrationConfiguration

NameData TypeExplanation
instanceConfigurationMapMap<String, CenterConfiguration>config map of config-center&registry-center,the key is center's name,the value is the config-center/registry-center

CenterConfiguration

NameData TypeExplanation
instanceTypeStringThe type of center instance(zookeeper/etcd/apollo/nacos)
propertiesStringProperties for center instance config, such as options of zookeeper
orchestrationTypeStringThe type of orchestration center: config_center or registry_center or metadata_center, if both, use “setOrchestrationType(“registry_center,config_center,metadata_center”);”
serverListsStringConnect to server lists in center, including IP address and port number; addresses are separated by commas, such as host1:2181,host2:2181
namespace (?)StringNamespace of center instance

Common configuration in properties as follow:

NameData TypeExplanation
overwritebooleanLocal configurations overwrite config center configurations or not; if they overwrite, each start takes reference of local configurations

If type of center is zookeeper with config-center&registry-center&metadata-center, properties could be set with the follow options:

NameData TypeExplanation
digest (?)StringConnect to authority tokens in registry center; default indicates no need for authority
operationTimeoutMilliseconds (?)intThe operation timeout millisecond number, default to be 500 milliseconds
maxRetries (?)intThe maximum retry count, default to be 3 times
retryIntervalMilliseconds (?)intThe retry interval millisecond number, default to be 500 milliseconds
timeToLiveSeconds (?)intThe living time for temporary nodes, default to be 60 seconds

If type of center is etcd with config-center&registry-center&metadata-center, properties could be set with the follow options:

NameData TypeExplanation
timeToLiveSeconds (?)longThe etcd TTL in seconds, default to be 30 seconds

If type of center is apollo with config-center, properties could be set with the follow options:

NameData TypeExplanation
appId (?)StringApollo appId, default to be “APOLLO_SHARDINGSPHERE”
env (?)StringApollo env, default to be “DEV”
clusterName (?)StringApollo clusterName, default to be “default”
administrator (?)StringApollo administrator, default to be ""
token (?)StringApollo token, default to be ""
portalUrl (?)StringApollo portalUrl, default to be ""
connectTimeout (?)intApollo connectTimeout, default to be 1000 milliseconds
readTimeout (?)intApollo readTimeout, default to be 5000 milliseconds

If type of center is nacos with config-center&registry-center, properties could be set with the follow options:

NameData TypeExplanation
group (?)StringNacos group, “SHARDING_SPHERE_DEFAULT_GROUP” in default
timeout (?)longNacos timeout, default to be 3000 milliseconds