iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用shardingsphere对SQLServer坑的解决
  • 150
分享到

使用shardingsphere对SQLServer坑的解决

2024-04-02 19:04:59 150人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

背景:最近一个使用sqlServer的项目,业务量太大,开始对业务有影响了,因此用户要求升级改造,技术上采用shardingsphere进行分库分表。 经过一系列调研,设计。。。哐哐

背景:最近一个使用sqlServer的项目,业务量太大,开始对业务有影响了,因此用户要求升级改造,技术上采用shardingsphere进行分库分表。

经过一系列调研,设计。。。哐哐一顿操作之后开始动刀改造。pom依赖如下:

        <!--sharding-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>

改造后查询和写入都各种报错:

Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType NVARCHAR . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLFeatureNotSupportedException: setNString
    at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:75)
    at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:87)
    ... 47 common frames omitted
Caused by: java.sql.SQLFeatureNotSupportedException: setNString
    at org.apache.shardingsphere.shardingjdbc.jdbc.unsupported.AbstractUnsupportedOperationPreparedStatement.setNString(AbstractUnsupportedOperationPreparedStatement.java:57)
    at org.apache.ibatis.type.NStringTypeHandler.setNonNullParameter(NStringTypeHandler.java:31)
    at org.apache.ibatis.type.NStringTypeHandler.setNonNullParameter(NStringTypeHandler.java:26)
    at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:73)
    ... 48 common frames omitted

核心错误:Caused by: java.sql.SQLFeatureNotSupportedException: setNString

问题分析:

网上寻了千百度,蓦然回首,还是没有找到问题,(┭┮﹏┭┮)  最后debug断点跟了源码发现:

操作数据库的PreparedStatement 是ShardingPreparedStatement

 然后setNString支持SQLServerPreparedStatement 不支持ShardingPreparedStatement(改造前没问题,改造后出问题的原因)

问题解决:

找到问题了,下面就是解决问题了,既然没有setNString的实现,那就实现一个呗;

第一步 实现NVarcharTypeHandler:

package cn.preserve.config.mybatis;
 
 
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.TypeException;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 

@MappedJdbcTypes(JdbcType.NVARCHAR)
public class NVarcharTypeHandler extends BaseTypeHandler<String> {
 
    @Override
    public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        if(parameter == null) {
            if(jdbcType == null) {
                throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters.");
            }
 
            try {
                ps.setNull(i, jdbcType.TYPE_CODE);
            } catch (SQLException var7) {
                throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . " + "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. " + "Cause: " + var7, var7);
            }
        } else {
            try {
                this.setNonNullParameter(ps, i, parameter, jdbcType);
            } catch (Exception var6) {
                throw new TypeException("Error setting non null for parameter #" + i + " with JdbcType " + jdbcType + " . " + "Try setting a different JdbcType for this parameter or a different configuration property. " + "Cause: " + var6, var6);
            }
        }
    }
 
    
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter);
    }
    
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return rs.getString(columnName);
    }
 
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return rs.getString(columnIndex);
    }
 
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return cs.getString(columnIndex);
    }
 
 
}

第二步 实现加入数据库配置:

由于我是代理实现的数据库,所有在代码中加入即可

@Configuration
public class DataSourceConfig {
 
    @Bean(name = "sqlSessionFactory")
    @Primary
    public SqlSessionFactory memberDb1SqlSessionFactory(DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = getSqlSessionFactoryBean(dataSource);
        bean.setTypeHandlers(new TypeHandler[] {new NVarcharTypeHandler()});
        return bean.getObject();
    }
 
   // ******* 其他实现
}

PS:如果是配置只修要在mybatis-config.xml中配置一下

<typeHandlers>
	<typeHandler handler="cn.preserve.config.mybatis.NVarcharTypeHandler"/>
</typeHandlers>

配置完成后,测试以前功能全部正常(#^.^#)

如果嫌麻烦,有另外一种解决方案:将mapper.xml中的NVARCHAR替换从VARCHAR也可以哦

到此这篇关于使用shardingsphere对SQLServer坑的解决的文章就介绍到这了,更多相关shardingsphere SQLServer内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用shardingsphere对SQLServer坑的解决

本文链接: https://www.lsjlt.com/news/144439.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用shardingsphere对SQLServer坑的解决
    背景:最近一个使用SQLServer的项目,业务量太大,开始对业务有影响了,因此用户要求升级改造,技术上采用shardingsphere进行分库分表。 经过一系列调研,设计。。。哐哐...
    99+
    2024-04-02
  • 怎么使用shardingsphere对SQLServer坑进行解决
    这篇“怎么使用shardingsphere对SQLServer坑进行解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使...
    99+
    2023-06-29
  • vue使用Swiper踩坑解决避坑
    目录我的Swiper定义:报错信息:保留默认名class:swiper-container查看GitHub我的Swiper定义: Failed to execute 'get...
    99+
    2023-05-20
    vue Swiper踩坑解决 vue Swiper避坑
  • NSMutable 对象的坑解决分析
    目录背景测试代码_set +0x10 处是个啥?结论NSMutable 对象共性问题背景 最近处理了两个崩溃,都是在 NSMutableSet 调用 enumerateOb...
    99+
    2023-02-28
    NSMutable 对象坑 NSMutable 对象
  • NSMutable对象的坑如何解决
    本文小编为大家详细介绍“NSMutable对象的坑如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“NSMutable对象的坑如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。背景最近处理了两个崩溃,都...
    99+
    2023-07-05
  • 使用aot的坑怎么解决
    本篇内容主要讲解“使用aot的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用aot的坑怎么解决”吧!启动参数固定化jaotc可以通过加-J参数来指定jvm的启动参数。我们尝试使用c...
    99+
    2023-06-03
  • ParallelStream使用的坑怎么解决
    今天小编给大家分享一下ParallelStream使用的坑怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。比如下面的代...
    99+
    2023-06-17
  • 使用fileReader的一个坑及解决
    目录关于fileReader的一个坑fileReader在ios上面的坑(图片转base64)关于fileReader的一个坑 在用fileReader做图片浏览时, 使用base6...
    99+
    2024-04-02
  • 解决使用openpyxl时遇到的坑
    最近在用python处理Excel表格是遇到了一些问题 1, xlwt最多只能写入65536行数据, 所以在处理大批量数据的时候没法使用 2, openpyxl 这个库, 在使用的时...
    99+
    2024-04-02
  • 解决spring-boot使用logback的大坑
    最近在写一个logback的kafka appender,无意中发现spring-boot在使用logback时的一个坑 用ConsoleAppender.java来举例,假设在lo...
    99+
    2024-04-02
  • 使用@JsonFormat的一个坑及解决
    目录使用@JsonFormat的一个坑及解决解决如下JsonFormat的时间格式踩坑使用@JsonFormat的一个坑及解决 spring boot项目 ,mysql数据库的dat...
    99+
    2024-04-02
  • 解决Golang 中使用WaitGroup的那点坑
    sync.WaitGroup对于Golang开发者来说并不陌生,其经常作为多协程之间同步的一种机制。用好它势必会让你事半功倍,但是一旦错用将引发问题。 关于WaitGroup的使用网...
    99+
    2024-04-02
  • 解决使用pandas聚类时的小坑
    问题背景: 之前运行测试好好的程序,忽然出现了报错,还是merge时候的类型错误,这个bug有点蹊跷。 问题分析: 代码:进行聚类之后计算平均值与方差 tmp_df = df[[...
    99+
    2024-04-02
  • vue使用mui遇到的坑及解决
    目录使用mui遇到的坑记录mui的js冲突了,有2种解决方法方法1方法2使用mui遇到的坑记录 主要用到webpack打包工具与mui,mint ui,其中mui有不少坑,在此记录 ...
    99+
    2024-04-02
  • 使用SpringBoot的CommandLineRunner遇到的坑及解决
    目录使用场景两个接口的不同特殊的场景遇到的坑填坑总结使用场景 再应用程序开发过程中,往往我们需要在容器启动的时候执行一些操作。 Spring Boot中提供了CommandLineR...
    99+
    2023-02-13
    使用SpringBoot CommandLineRunner的坑 SpringBoot CommandLineRunner
  • 使用flutter的showModalBottomSheet遇到的坑及解决
    目录遇到了三个比较坑的地方我们解决完后的效果如下解决问题一解决问题二解决问题三在使用官方的showModalBottomSheet这个组件时到目前为止 遇到了三个比较坑的地方 1. ...
    99+
    2024-04-02
  • 使用k8tz解决pod内的时区问题(坑的解决)
    目录使用k8tz优雅的解决pod内的时区问题1.问题简介2.k8tz3.安装k8t4.注入策略坑和解决办法1.helm安装失败2.查看时间的顺序使用k8tz优雅的解决pod内的时区问...
    99+
    2022-11-13
    k8tz时区问题解决 k8tz pod时区
  • 解决在Unity中使用FairyGUI遇到的坑
    首先!首先!首先! 首先,我们由于历史问题,项目用的UI编辑器不是大众使用的GUI或者NGUI, 而是使用不知道算不算小众的FairyGUI,这个UI系统使用挺方便的,也提供了很多U...
    99+
    2024-04-02
  • golang recover函数使用的坑怎么解决
    这篇文章主要讲解了“golang recover函数使用的坑怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang recover函数使用的坑怎么解决”吧!一...
    99+
    2023-07-05
  • Mybatis Plus使用@TableId之坑及解决
    目录Mybatis Plus使用@TableId之坑1. TableId 可选类型2. @TableId(value = “id”,type= IdType.AUTO)3. @Tab...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作