weixin_48324439 2024-08-16 11:39 采纳率: 33.3%
浏览 452

shardingsphere数据源不生效问题

请教各位:
项目使用springboot3.3.2+shardingsphere5.4.1,pom.xml配置应该是没问题的,在启动的时候,也可以注册数据源,但在执行sql的时候,无法找到数据源,是怎么回事呢??
pom.xml如下:

  <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.2</version>
 <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core</artifactId>
            <version>5.4.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>shardingsphere-infra-util</artifactId>
                    <groupId>org.apache.shardingsphere</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-infra-spi</artifactId>
            <version>5.4.1</version>
        </dependency>
  <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc10</artifactId>
            <version>19.9.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.6</version>
        </dependency>

数据源的配置如下:

spring.shardingsphere.mode.type=Memory
spring.shardingsphere.mode.repository.type=Memory
spring.shardingsphere.mode.overwrite=true

spring.shardingsphere.datasource.names=ds0,ds1
spring.shardingsphere.props.sql.show=true
spring.shardingsphere.sharding.default-data-source-name=ds0

spring.shardingsphere.datasource.ds0.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.shardingsphere.datasource.ds0.url=jdbc:oracle:thin:@XXXX:1521/FREE
spring.shardingsphere.datasource.ds0.password=XXXX
spring.shardingsphere.datasource.ds0.username=XXXX
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource

#
spring.shardingsphere.datasource.ds1.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.shardingsphere.datasource.ds1.jdbc.url=jdbc:oracle:thin:@XXX:1521/FREE
spring.shardingsphere.datasource.ds1.password=XXX
spring.shardingsphere.datasource.ds1.username=XXX
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource

#
spring.shardingsphere.sharding.tables.user.database-strategy.standard.sharding-column=id
spring.shardingsphere.sharding.tables.user.database-strategy.standard.precise-algorithm-class-name=com.calvin.sharding.strategy.CustomDBPreciseShardingAlgorithm


在运行的时候,是可以找到数据源的,但在执行SQL的时候,找不到,并且自定义分片的类CustomDBPreciseShardingAlgorithm断点也走不进去

2024-08-16 11:31:53.978 [main   ] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2024-08-16 11:31:54.280 [main   ] INFO  com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:4f056d9f-a1f2-4b00-a3b7-02463e65c108 user=SA
2024-08-16 11:31:54.283 [main   ] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.

org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "TEST_USER_0" not found (**this database is empty**); SQL statement:
INSERT INTO TEST_USER_0  ( id, username, password )  VALUES (  ?, ?, ?  ) [42104-224]
### The error may exist in com/calvin/sharding/mapper/UserMapper.java (best guess)
### The error may involve com.calvin.sharding.mapper.UserMapper.insert
### The error occurred while executing an update
### SQL: INSERT INTO TEST_USER_0  ( id, username, password )  VALUES (  ?, ?, ?  )
### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "TEST_USER_0" not found (this database is empty); SQL statement:
INSERT INTO TEST_USER_0  ( id, username, password )  VALUES (  ?, ?, ?  ) [42104-224]


  • 写回答

2条回答 默认 最新

  • 一直免费一直爽 2024-08-16 11:39
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的信息来看,问题可能出在以下几个方面:

    1. 数据源配置问题:请确保你的数据源配置是正确的。在你的配置文件中,你为ds0ds1分别配置了不同的数据库连接信息,但是在spring.shardingsphere.sharding.tables.user.database-strategy.standard.precise-algorithm-class-name中,你使用了com.calvin.sharding.strategy.CustomDBPreciseShardingAlgorithm作为精确分片算法类。请确保这个类存在并且正确实现了分片策略。

    2. 分片策略问题:在你的分片策略配置中,你使用了id作为分片列,但是没有指定具体的分片算法。你需要提供一个实现了PreciseShardingAlgorithm接口的类,用于根据id的值来确定数据应该存储在哪个数据源中。例如:

    public class CustomDBPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
    
        @Override
        public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
            // 根据id的值选择数据源
            for (String targetName : availableTargetNames) {
                if (targetName.endsWith(shardingValue.getValue() % 2 + "")) {
                    return targetName;
                }
            }
            throw new UnsupportedOperationException();
        }
    }
    
    1. SQL语句问题:从你的错误日志来看,你在执行插入操作时,表名是TEST_USER_0。但是在你的分片策略配置中,你没有指定表名。你需要在配置中添加表名,例如:
    spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds${0..1}.user_${0..1}
    

    这将使得实际的数据节点名称为ds0.user_0, ds0.user_1, ds1.user_0, ds1.user_1等。同时,你需要确保这些表在对应的数据源中已经创建。

    1. 自定义分片算法类加载问题:如果你的自定义分片算法类不在项目的类路径下,可能会导致无法找到该类。请确保你的自定义分片算法类已经被正确编译并放置在正确的位置。

    综上所述,你需要检查你的数据源配置、分片策略配置以及自定义分片算法类是否正确。如果问题仍然存在,请尝试提供更多关于你的项目配置和代码的信息,以便更好地帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月16日