Mandatory Routing #
Introduction #
DBPlusEngine uses ThreadLocal to manage sharding values for mandatory routing. A sharding value can be added to HintManager through programming, and the value is only valid in the current thread. Additionally, DBPlusEngine can also perform mandatory routing by adding annotations to SQL.
Hint can be used in the following scenarios:
- Fields used for sharding exist in external business logic rather than in SQL, database, and table structures.
- Some data operations are forcibly carried out in the primary database.
Procedure #
Call
HintManager.getInstance()to obtain HintManager instance.Call
HintManager.addDatabaseShardingValue,HintManager.addTableShardingValuemethod to set the sharding key value.Execute SQL statements to complete routing and execution.
Call
HintManager.closeto clear the content of ThreadLocal.
Sample #
Sharding with Hint #
Rules Configuration #
Hint sharding algorithm requires users to implement org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingAlgorithm interface.
DBPlusEngine will obtain sharding values from HintManager for routing.
Configuration sample:
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: demo_ds_${0..1}.t_order_${0..1}
databaseStrategy:
hint:
algorithmClassName: xxx.xxx.xxx.HintXXXAlgorithm
tableStrategy:
hint:
algorithmClassName: xxx.xxx.xxx.HintXXXAlgorithm
defaultTableStrategy:
none:
defaultKeyGenerateStrategy:
type: SNOWFLAKE
column: order_id
props:
sql-show: true
Obtain HintManager #
HintManager hintManager = HintManager.getInstance();
Add Sharding Key Value #
- Use
hintManager.addDatabaseShardingValueto add data source sharding key value. - Use
hintManager.addTableShardingValueto add table sharding key value.
When database sharding is required and table sharding is not, while mandatory routing is carried out to a sub-database, you can use
hintManager.setDatabaseShardingValueto set sharding values.
Clear Sharding Key Value #
The sharding key value is stored in ThreadLocal, so you need to call hintManager.close() at the end of the operation to clear the content of ThreadLocal.
__hintManager has implemented the AutoCloseable interface, and you are advised to use try with resource to close it automatically.
Complete Code Example #
// Sharding database and table using HintManager
String sql = "SELECT * FROM t_order";
try (HintManager hintManager = HintManager.getInstance();
Connection conn = dataSource.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
hintManager.addDatabaseShardingValue("t_order", 1);
hintManager.addTableShardingValue("t_order", 2);
try (ResultSet rs = preparedStatement.executeQuery()) {
while (rs.next()) {
// ...
}
}
}
// Sharding database without sharding table and routing to only one database using HintManager
String sql = "SELECT * FROM t_order";
try (HintManager hintManager = HintManager.getInstance();
Connection conn = dataSource.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
hintManager.setDatabaseShardingValue(3);
try (ResultSet rs = preparedStatement.executeQuery()) {
while (rs.next()) {
// ...
}
}
}
Use SQL Annotations #
Terms of Use #
Before using the SQL Hint, users should enable configurations of parsing annotations in advance and set sqlCommentParseEnabled to true.
The annotation format only supports /* */ and content has to start with ShardingSphere hint:.
Optional properties include:
{table}.SHARDING_DATABASE_VALUE: used to add data source sharding key value corresponding to{table}. Multiple properties are separated by a comma.{table}.SHARDING_TABLE_VALUE: used to add table sharding key value corresponding to{table}. Multiple properties are separated by a comma.
When database sharding is required and table sharding is not, while mandatory routing is carried out to a sub-database, you can use
SHARDING_DATABASE_VALUEto add shards without specifying{table}.
Complete Sample #
/* SHARDINGSPHERE_HINT: t_order.SHARDING_DATABASE_VALUE=1, t_order.SHARDING_TABLE_VALUE=1 */
SELECT * FROM t_order;