欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用shardingsphere對(duì)SQLServer坑的解決

 更新時(shí)間:2022年03月30日 11:34:43   作者:idto315  
本文主要介紹了使用shardingsphere對(duì)SQLServer坑的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景:最近一個(gè)使用SQLServer的項(xiàng)目,業(yè)務(wù)量太大,開(kāi)始對(duì)業(yè)務(wù)有影響了,因此用戶要求升級(jí)改造,技術(shù)上采用shardingsphere進(jìn)行分庫(kù)分表。

經(jīng)過(guò)一系列調(diào)研,設(shè)計(jì)。。。哐哐一頓操作之后開(kāi)始動(dòng)刀改造。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>

改造后查詢和寫入都各種報(bào)錯(cuò):

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

核心錯(cuò)誤:Caused by: java.sql.SQLFeatureNotSupportedException: setNString

問(wèn)題分析:

網(wǎng)上尋了千百度,驀然回首,還是沒(méi)有找到問(wèn)題,(┭┮﹏┭┮)  最后debug斷點(diǎn)跟了源碼發(fā)現(xiàn):

操作數(shù)據(jù)庫(kù)的PreparedStatement 是ShardingPreparedStatement

 然后setNString支持SQLServerPreparedStatement 不支持ShardingPreparedStatement(改造前沒(méi)問(wèn)題,改造后出問(wèn)題的原因)

問(wèn)題解決:

找到問(wèn)題了,下面就是解決問(wèn)題了,既然沒(méi)有setNString的實(shí)現(xiàn),那就實(shí)現(xiàn)一個(gè)唄;

第一步 實(shí)現(xiàn)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;
 
/**
 *  將 nvarchar 轉(zhuǎn)成 varchar  sharingJDBC不支持nvarchar
 *  主要是NStringTypeHandler中,沒(méi)有setNString()
 */
@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);
            }
        }
    }
 
    /**
     * 這里使用setNString而不是setString
     * @param ps
     * @param i
     * @param parameter
     * @param jdbcType
     * @throws SQLException
     */
    @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);
    }
 
 
}

第二步 實(shí)現(xiàn)加入數(shù)據(jù)庫(kù)配置:

由于我是代理實(shí)現(xiàn)的數(shù)據(jù)庫(kù),所有在代碼中加入即可

@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();
    }
 
   // ******* 其他實(shí)現(xiàn)
}

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

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

配置完成后,測(cè)試以前功能全部正常(#^.^#)

如果嫌麻煩,有另外一種解決方案:將mapper.xml中的NVARCHAR替換從VARCHAR也可以哦

到此這篇關(guān)于使用shardingsphere對(duì)SQLServer坑的解決的文章就介紹到這了,更多相關(guān)shardingsphere SQLServer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java線程間通訊的一些方法總結(jié)

    java線程間通訊的一些方法總結(jié)

    這篇文章主要介紹了java線程間通訊的一些方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • SpringBoot整合Docker實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行的操作方法

    SpringBoot整合Docker實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行的操作方法

    本文講解的是 SpringBoot 引入容器化技術(shù) Docker 實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行,包括鏡像構(gòu)建、Docker倉(cāng)庫(kù)搭建使用、Docker倉(cāng)庫(kù)可視化UI等內(nèi)容,需要的朋友可以參考下
    2022-10-10
  • 如何讓W(xué)in10實(shí)現(xiàn)Java文件的開(kāi)機(jī)自啟動(dòng)

    如何讓W(xué)in10實(shí)現(xiàn)Java文件的開(kāi)機(jī)自啟動(dòng)

    這篇文章主要介紹了如何讓W(xué)in10實(shí)現(xiàn)Java文件的開(kāi)機(jī)自啟動(dòng),對(duì)于一些想要一直運(yùn)行的Java文件,就會(huì)造成每次系統(tǒng)更新之后的重啟導(dǎo)致Java文件無(wú)法繼續(xù)運(yùn)行。,需要的朋友可以參考下
    2019-06-06
  • 詳解在spring boot中消息推送系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    詳解在spring boot中消息推送系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    這篇文章主要介紹了詳解在spring boot中消息推送系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • Java去掉字符串最后一個(gè)逗號(hào)的方法

    Java去掉字符串最后一個(gè)逗號(hào)的方法

    Java中去掉字符串的最后一個(gè)逗號(hào)有多種實(shí)現(xiàn)方法,不同的方法適用于不同的場(chǎng)景,本文通過(guò)實(shí)例代碼介紹Java去掉字符串最后一個(gè)逗號(hào)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2023-12-12
  • springboot整合JPA訪問(wèn)Mysql的實(shí)現(xiàn)方法

    springboot整合JPA訪問(wèn)Mysql的實(shí)現(xiàn)方法

    本文主要介紹了springboot整合JPA訪問(wèn)Mysql的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SpringBoot的java -jar命令啟動(dòng)原理解讀

    SpringBoot的java -jar命令啟動(dòng)原理解讀

    這篇文章主要介紹了SpringBoot的java -jar命令啟動(dòng)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 在java中實(shí)現(xiàn)C#語(yǔ)法里的按引用傳遞參數(shù)的方法

    在java中實(shí)現(xiàn)C#語(yǔ)法里的按引用傳遞參數(shù)的方法

    下面小編就為大家?guī)?lái)一篇在java中實(shí)現(xiàn)C#語(yǔ)法里的按引用傳遞參數(shù)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • Java如何實(shí)現(xiàn)判斷并輸出文件大小

    Java如何實(shí)現(xiàn)判斷并輸出文件大小

    這篇文章主要介紹了Java如何實(shí)現(xiàn)判斷并輸出文件大小問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Mybatis-Plus打印sql日志兩種方式

    Mybatis-Plus打印sql日志兩種方式

    這篇文章主要給大家介紹了關(guān)于Mybatis-Plus打印sql日志兩種方式,Mybatis-plus是MyBatis增強(qiáng)工具包,用于簡(jiǎn)化CRUD操作,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評(píng)論