lanchengx commented on a change in pull request #12529: URL: https://github.com/apache/shardingsphere/pull/12529#discussion_r713574868
########## File path: docs/document/content/others/faq/_index.cn.md ########## @@ -5,73 +5,176 @@ weight = 1 chapter = true +++ -## 1. 如果SQL在ShardingSphere中执行不正确,该如何调试? +## 1. [JDBC] 为什么配置了某个数据连接池的spring-boot-starter(比如druid)和shardingsphere-jdbc-spring-boot-starter时,系统启动会报错? 回答: -在ShardingSphere-Proxy以及ShardingSphere-JDBC 1.5.0版本之后提供了`sql.show`的配置,可以将解析上下文和改写后的SQL以及最终路由至的数据源的细节信息全部打印至info日志。 -`sql.show`配置默认关闭,如果需要请通过配置开启。 - -> 注意:5.x版本以后,`sql.show`参数调整为`sql-show`。 +1. 因为数据连接池的starter(比如druid)可能会先加载并且其创建一个默认数据源,这将会使得ShardingSphere-JDBC创建数据源时发生冲突。 +2. 解决办法为,去掉数据连接池的starter即可,sharing-jdbc自己会创建数据连接池。 -## 2. 阅读源码时为什么会出现编译错误?IDEA不索引生成的代码? +## 2. [Proxy] Windows环境下,运行ShardingSphere-Proxy,找不到或无法加载主类 org.apache.shardingsphere.proxy.Bootstrap,如何解决? 回答: -ShardingSphere使用lombok实现极简代码。关于更多使用和安装细节,请参考[lombok官网](https://projectlombok.org/download.html)。 +某些解压缩工具在解压ShardingSphere-Proxy二进制包时可能将文件名截断,导致找不到某些类。 -`org.apache.shardingsphere.sql.parser.autogen` 包下的代码由 ANTLR 生成,可以执行以下命令快速生成: +解决方案: -```bash -./mvnw -Dcheckstyle.skip=true -Drat.skip=true -Dmaven.javadoc.skip=true -Djacoco.skip=true -DskipITs -DskipTests install -T1C +打开cmd.exe并执行下面的命令: +``` +tar zxvf apache-shardingsphere-${RELEASE.VERSION}-shardingsphere-proxy-bin.tar.gz ``` -生成的代码例如 `org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser` 等 Java 文件由于较大,默认配置的 IDEA 可能不会索引该文件。 -可以调整 IDEA 的属性:`idea.max.intellisense.filesize=10000` +## 3. [Proxy] 在使用sharing-proxy的时候,如何动态在ShardingSphere-UI上添加新的logic schema? -## 3. 使用Spring命名空间时找不到xsd? +回答: + +1. 4.1.0之前的版本不支持动态添加或删除logic schema的功能,例如一个proxy启动的时候有2个logic schema,就会一直持有这2个schema,只能感知这两个schema内部的表和rule的变更事件。 +2. 4.1.0版本支持在ShardingSphere-UI或直接在zookeeper上增加新的logic schema,删除logic schema的功能计划在5.0.0版本支持。 + +## 4. [Proxy] 在使用ShardingSphere-Proxy时,怎么使用合适的工具连接到ShardingSphere-Proxy? 回答: -Spring命名空间使用规范并未强制要求将xsd文件部署至公网地址,但考虑到部分用户的需求,我们也将相关xsd文件部署至ShardingSphere官网。 +1. ShardingSphere-Proxy可以看做是一个mysql server,所以首选支持mysql命令连接和操作。 +2. 如果使用其他第三方数据库工具,可能由于不同工具的特定实现导致出现异常。 +3. 目前已测试的第三方数据库工具如下: + - Navicat:11.1.13、15.0.20。 + - DataGrip:2020.1、2021.1(使用 IDEA/DataGrip 时打开 `introspect using JDBC metadata` 选项)。 + - WorkBench:8.0.25。 -实际上 shardingsphere-jdbc-spring-namespace 的 jar 包中 META-INF\spring.schemas 配置了 xsd 文件的位置: -META-INF\namespace\sharding.xsd 和 META-INF\namespace\replica-query.xsd,只需确保 jar 包中该文件存在即可。 +## 5. [Proxy] 使用Navicat等第三方数据库工具连接ShardingSphere-Proxy时,如果ShardingSphere-Proxy没有创建Schema或者没有添加Resource,连接失败? + +回答: + +1. 第三方数据库工具在连接 ShardingSphere-Proxy 时会发送一些SQL查询元数据,当 ShardingSphere-Proxy 没有创建 `schema` 或者没有添加 `resource` 时,ShardingSphere-Proxy 无法执行 SQL。 +2. 推荐先创建 `schema` 和 `resource` 之后再使用第三方数据库工具连接。 +3. 有关 `resource` 的详情请参考。[相关介绍](https://shardingsphere.apache.org/document/current/cn/features/dist-sql/syntax/rdl/rdl-resource/) -## 4. Cloud not resolve placeholder ... in string value ...异常的解决方法? +## 6. [分片] Cloud not resolve placeholder ... in string value ...异常的解决方法? 回答: 行表达式标识符可以使用`${...}`或`$->{...}`,但前者与Spring本身的属性文件占位符冲突,因此在Spring环境中使用行表达式标识符建议使用`$->{...}`。 -## 5. inline表达式返回结果为何出现浮点数? +## 7. [分片] inline表达式返回结果为何出现浮点数? 回答: Java的整数相除结果是整数,但是对于inline表达式中的Groovy语法则不同,整数相除结果是浮点数。 想获得除法整数结果需要将A/B改为A.intdiv(B)。 -## 6. 如果只有部分数据库分库分表,是否需要将不分库分表的表也配置在分片规则中? +## 8. [分片] 如果只有部分数据库分库分表,是否需要将不分库分表的表也配置在分片规则中? 回答: 不需要,ShardingSphere会自动识别。 -## 7. ShardingSphere除了支持自带的分布式自增主键之外,还能否支持原生的自增主键? +## 9. [分片] 指定了泛型为Long的`SingleKeyTableShardingAlgorithm`,遇到`ClassCastException: Integer can not cast to Long`? -回答:是的,可以支持。但原生自增主键有使用限制,即不能将原生自增主键同时作为分片键使用。 +回答: -由于ShardingSphere并不知晓数据库的表结构,而原生自增主键是不包含在原始SQL中内的,因此ShardingSphere无法将该字段解析为分片字段。如自增主键非分片键,则无需关注,可正常返回;若自增主键同时作为分片键使用,ShardingSphere无法解析其分片值,导致SQL路由至多张表,从而影响应用的正确性。 +必须确保数据库表中该字段和分片算法该字段类型一致,如:数据库中该字段类型为int(11),泛型所对应的分片类型应为Integer,如果需要配置为Long类型,请确保数据库中该字段类型为bigint。 -而原生自增主键返回的前提条件是INSERT SQL必须最终路由至一张表,因此,面对返回多表的INSERT SQL,自增主键则会返回零。 +## 10. [分片] 使用`Proxool`时分库结果不正确? + +回答: + +使用Proxool配置多个数据源时,应该为每个数据源设置alias,因为Proxool在获取连接时会判断连接池中是否包含已存在的alias,不配置alias会造成每次都只从一个数据源中获取连接。 + +以下是Proxool源码中ProxoolDataSource类getConnection方法的关键代码: + +```java + if(!ConnectionPoolManager.getInstance().isPoolExists(this.alias)) { + this.registerPool(); + } +``` -## 8. 指定了泛型为Long的`SingleKeyTableShardingAlgorithm`,遇到`ClassCastException: Integer can not cast to Long`? +更多关于alias使用方法请参考[Proxool官网](http://proxool.sourceforge.net/configure.html)。 + +PS:sourceforge网站需要翻墙访问。 + Review comment: This is related to the data source, I think the `[other]` tag is better, What do you think? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
