记录一下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 但是在查询的时候就会报类型转换错误,,, 后续解决掉会补充
**