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 2144c7e support sql hint comment doc (#13874)
2144c7e is described below
commit 2144c7ea0003fca3f122b843a560fb397af011e1
Author: tuichenchuxin <[email protected]>
AuthorDate: Thu Dec 2 12:35:13 2021 +0800
support sql hint comment doc (#13874)
* support sql hint comment doc
* support sql hint comment doc
* support sql hint comment doc
* support sql hint comment doc
* support sql hint comment doc
---
.../content/features/sharding/concept/hint.cn.md | 2 +-
.../content/features/sharding/concept/hint.en.md | 2 +-
.../special-api/sharding/hint.cn.md | 45 +++++++++++++++++++++-
.../special-api/sharding/hint.en.md | 45 +++++++++++++++++++++-
.../sql/common/extractor/SQLHintExtractor.java | 2 +-
.../sql/common/extractor/SQLHintExtractorTest.java | 2 +-
6 files changed, 92 insertions(+), 6 deletions(-)
diff --git a/docs/document/content/features/sharding/concept/hint.cn.md
b/docs/document/content/features/sharding/concept/hint.cn.md
index b5e3784..b776c39 100644
--- a/docs/document/content/features/sharding/concept/hint.cn.md
+++ b/docs/document/content/features/sharding/concept/hint.cn.md
@@ -16,6 +16,6 @@ weight = 6
Apache ShardingSphere 使用 `ThreadLocal` 管理分片键值。
可以通过编程的方式向 `HintManager` 中添加分片条件,该分片条件仅在当前线程内生效。
-除了通过编程的方式使用强制分片路由,Apache ShardingSphere 还计划通过 SQL 中的特殊注释的方式引用
Hint,使开发者可以采用更加透明的方式使用该功能。
+除了通过编程的方式使用强制分片路由,Apache ShardingSphere 还可以通过 SQL 中的特殊注释的方式引用
Hint,使开发者可以采用更加透明的方式使用该功能。
指定了强制分片路由的 SQL 将会无视原有的分片逻辑,直接路由至指定的真实数据节点。
diff --git a/docs/document/content/features/sharding/concept/hint.en.md
b/docs/document/content/features/sharding/concept/hint.en.md
index 2a3e0f3..653ed0d 100644
--- a/docs/document/content/features/sharding/concept/hint.en.md
+++ b/docs/document/content/features/sharding/concept/hint.en.md
@@ -16,6 +16,6 @@ So it requires to designate sharding result externally, which
is referred to as
Apache ShardingSphere uses `ThreadLocal` to manage sharding key values.
Users can program to add sharding conditions to `HintManager`, but the
condition is only effective within the current thread.
-In addition to the programming method, Apache ShardingSphere also plans to
cite Hint through special notation in SQL, so that users can use that function
in a more transparent way.
+In addition to the programming method, Apache ShardingSphere is able to cite
Hint through special notation in SQL, so that users can use that function in a
more transparent way.
The SQL designated with sharding hint will ignore the former sharding logic
but directly route to the designated node.
diff --git
a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/sharding/hint.cn.md
b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/sharding/hint.cn.md
index 38ab5e7..4991363 100644
---
a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/sharding/hint.cn.md
+++
b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/sharding/hint.cn.md
@@ -6,12 +6,14 @@ weight = 1
## 简介
Apache ShardingSphere 使用 ThreadLocal 管理分片键值进行强制路由。
-可以通过编程的方式向 HintManager 中添加分片值,该分片值仅在当前线程内生效。
+可以通过编程的方式向 HintManager 中添加分片值,该分片值仅在当前线程内生效。
+Apache ShardingSphere 还可以通过 SQL 中增加注释的方式进行强制路由。
Hint 的主要使用场景:
* 分片字段不存在 SQL 和数据库表结构中,而存在于外部业务逻辑。
* 强制在主库进行某些数据操作。
+* 强制在指定数据库进行某些数据操作。
## 使用方法
@@ -125,3 +127,44 @@ try (HintManager hintManager = HintManager.getInstance();
}
}
```
+
+### 使用 Hint 路由至指定数据库
+
+#### 使用手动编程的方式
+
+##### 获取 HintManager
+
+与基于 Hint 的数据分片相同。
+
+##### 设置路由至指定数据库
+
+- 使用 `hintManager.setDataSourceName` 设置数据库名称。
+
+##### 完整代码示例
+
+```java
+String sql = "SELECT * FROM t_order";
+try (HintManager hintManager = HintManager.getInstance();
+ Connection conn = dataSource.getConnection();
+ PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
+ hintManager.setDataSourceName("ds_0");
+ try (ResultSet rs = preparedStatement.executeQuery()) {
+ while (rs.next()) {
+ // ...
+ }
+ }
+}
+```
+
+#### 使用 SQL 注释的方式
+
+##### 使用规范
+
+SQL Hint 功能需要用户提前开启解析注释的配置,设置 `sql-comment-parse-enabled` 为
`true`,目前只支持路由至一个数据源。
+注释格式暂时只支持`/* */`,内容需要以`sql hint:`开始,属性名为 `dataSourceName`。
+
+##### 完整示例
+```sql
+/* sql hint: dataSourceName=ds_0 */
+SELECT * FROM t_order;
+```
\ No newline at end of file
diff --git
a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/sharding/hint.en.md
b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/sharding/hint.en.md
index fe61093..1441d9c 100644
---
a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/sharding/hint.en.md
+++
b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/sharding/hint.en.md
@@ -6,12 +6,14 @@ weight = 1
## Introduction
Apache ShardingSphere uses ThreadLocal to manage sharding key value or hint
route.
-Users can add sharding values to HintManager, and those values only take
effect within the current thread.
+Users can add sharding values to HintManager, and those values only take
effect within the current thread.
+Apache ShardingSphere is able to add special comments in SQL to hint route too.
Usage of hint:
* Sharding columns are not in SQL and table definition, but in external
business logic.
* Some operations forced to do in the primary database.
+* Some operations forced to do in the database chosen by yourself.
## Usage
@@ -125,3 +127,44 @@ try (HintManager hintManager = HintManager.getInstance();
}
}
```
+
+### Route to the specified database with Hint
+
+#### Use manual programming
+
+##### Get HintManager
+
+Be the same as sharding based on hint.
+
+##### Configure Database Route
+
+- Use `hintManager.setDataSourceName` to configure database route.
+
+##### Codes:
+
+```java
+String sql = "SELECT * FROM t_order";
+try (HintManager hintManager = HintManager.getInstance();
+ Connection conn = dataSource.getConnection();
+ PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
+ hintManager.setDataSourceName("ds_0");
+ try (ResultSet rs = preparedStatement.executeQuery()) {
+ while (rs.next()) {
+ // ...
+ }
+ }
+}
+```
+
+#### Use special SQL comments
+
+##### Terms of Use
+
+To use SQL Hint function, users need to set `sql-comment-parse-enabled` to
`true`. Currently, only support routing to one data source.
+The comment format only supports `/* */` for now. The content needs to start
with `sql hint:`, and the attribute name needs to be `dataSourceName`.
+
+##### Codes:
+```sql
+/* sql hint: dataSourceName=ds_0 */
+SELECT * FROM t_order;
+```
\ No newline at end of file
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/SQLHintExtractor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/SQLHintExtractor.java
index 7acda03..7388cb3 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/SQLHintExtractor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/SQLHintExtractor.java
@@ -32,7 +32,7 @@ public final class SQLHintExtractor {
private static final String SQL_COMMENT_SUFFIX = "*/";
- private static final String SQL_HINT_TOKEN = "shardingsphere hint:";
+ private static final String SQL_HINT_TOKEN = "sql hint:";
private static final String SQL_HINT_SPLIT = "=";
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/SQLHintExtractorTest.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/SQLHintExtractorTest.java
index d2a3172..3c9fb35 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/SQLHintExtractorTest.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/SQLHintExtractorTest.java
@@ -36,7 +36,7 @@ public final class SQLHintExtractorTest {
@Test
public void assertFindHintDataSourceNameExist() {
AbstractSQLStatement statement = mock(AbstractSQLStatement.class);
-
when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new
CommentSegment("/* shardingsphere hint: datasourceName=ds_1 */", 0, 0)));
+
when(statement.getCommentSegments()).thenReturn(Collections.singletonList(new
CommentSegment("/* sql hint: datasourceName=ds_1 */", 0, 0)));
Optional<String> dataSourceName =
SQLHintExtractor.findHintDataSourceName(statement);
assertTrue(dataSourceName.isPresent());
assertThat(dataSourceName.get(), is("ds_1"));