【记录一下shardingjbdc3.1.0 空指针问题】

记录一下shardingjbdc3.1.0 空指针问题

1.先贴pom文件版本

 <dependency>
     <groupId>io.shardingsphere</groupId>
     <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
     <version>3.1.0</version>
  </dependency>
 <dependency>
     <groupId>io.shardingsphere</groupId>
     <artifactId>sharding-jdbc-spring-namespace</artifactId>
     <version>3.1.0</version>
 </dependency>
 ## 2.yml配置文件
 

```java
sharding:
  jdbc:
    datasource:
      names: sysadmin
      sysadmin:
        jdbc-url: jdbc:mysql://127.0.0.1:3306/sys_admin?serverTimezone=Asia/Shanghai
        username: ****
        password: ****
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
    config:
      sharding:
        tables:
          sys_user:
            actual-data-nodes: sysadmin.sys_user_$->{1..2}
            table-strategy:
              standard:
                sharding-column: id
                precise-algorithm-class-name: com.zdd.main.config.MayiKtShardingPreciseConfig
      props:
        sql:
          show: true

3.抛出异常:

在这里插入图片描述
如图所示:sqlRoute(); 会执行到 yml配置文件中的自定义分片类MayiKtShardingPreciseConfig,但是在finally中执行的方法refreshTableMetaData(connection.getShardingContext(), routeResult.getSqlStatement()); 会把 MayiKtShardingPreciseConfig 报错抛出的异常覆盖掉, 导致 在refreshTableMetaData中抛出空指针异常;

错误信息:

Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in com/zdd/main/mapper/SysUserMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT id,dept_id,name,user_name,email,phone_number,sex,avatar,password,salt,birthday,status,del_falg,login_ip,login_date,create_time,update_by,remark FROM sys_user WHERE id=?
### Cause: java.lang.NullPointerException
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in com/zdd/main/mapper/SysUserMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT id,dept_id,name,user_name,email,phone_number,sex,avatar,password,salt,birthday,status,del_falg,login_ip,login_date,create_time,update_by,remark FROM sys_user WHERE id=?
### Cause: java.lang.NullPointerException
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.5.5.jar:3.5.5]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) ~[mybatis-3.5.5.jar:3.5.5]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) ~[mybatis-3.5.5.jar:3.5.5]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76) ~[mybatis-3.5.5.jar:3.5.5]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_381]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_381]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_381]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_381]
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ~[mybatis-spring-2.0.5.jar:2.0.5]
	... 57 common frames omitted
Caused by: java.lang.NullPointerException: null
	at io.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.execute(ShardingPreparedStatement.java:139) ~[sharding-jdbc-core-3.1.0.jar:na]
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64) ~[mybatis-3.5.5.jar:3.5.5]
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) ~[mybatis-3.5.5.jar:3.5.5]
	at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doQuery(MybatisSimpleExecutor.java:69) ~[mybatis-plus-core-3.4.0.jar:3.4.0]
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325) ~[mybatis-3.5.5.jar:3.5.5]
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) ~[mybatis-3.5.5.jar:3.5.5]
	at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.query(MybatisCachingExecutor.java:165) ~[mybatis-plus-core-3.4.0.jar:3.4.0]
	at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.query(MybatisCachingExecutor.java:92) ~[mybatis-plus-core-3.4.0.jar:3.4.0]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.5.jar:3.5.5]
	... 64 common frames omitted

MayiKtShardingPreciseConfig 代码

package com.zdd.main.config;

import io.shardingsphere.api.algorithm.sharding.PreciseShardingValue;
import io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Collection;


@Slf4j
public class MayiKtShardingPreciseConfig implements PreciseShardingAlgorithm<String> {
    private static final Long size = 2L;
    private static final String TABLENAME = "sys_user_";


    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {

//        try {
            String value = shardingValue.getValue();
            log.info("shardingValue.getValue() ---->{}", shardingValue.getValue());
            Long index = Long.valueOf(value) + 1;
            for (String dataSourceName : availableTargetNames) {
                if (dataSourceName.endsWith(index + "")) {
                    log.info("选择的dataSourceName---》{}", dataSourceName);
                    return dataSourceName;

                }
            }
            throw new UnsupportedOperationException();
//        } catch (Exception e) {
//            log.error("e--->{}", e);
//        }
//        return null;
    }

}

4.解决方案:

在这里插入图片描述
在MayiKtShardingPreciseConfig中doSharding方法中 加个catch块, 先把自己代码中的异常捕获,然后去解决,不然一直最后都是抛空指针异常, 卡了我一下午 难受

**

  • ps:还有个问题记录一下, 还没找到解决办法, MayiKtShardingPreciseConfig
    泛型为string的时候,分表可以正常insert 但是在查询的时候就会报类型转换错误,,, 后续解决掉会补充

**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值