最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用shardingsphere對SQLServer坑的解決

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

背景:最近一個使用SQLServer的項目,業(yè)務量太大,開始對業(yè)務有影響了,因此用戶要求升級改造,技術上采用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

問題分析:

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

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

 然后setNString支持SQLServerPreparedStatement 不支持ShardingPreparedStatement(改造前沒問題,改造后出問題的原因)

問題解決:

找到問題了,下面就是解決問題了,既然沒有setNString的實現(xiàn),那就實現(xiàn)一個唄;

第一步 實現(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 轉成 varchar  sharingJDBC不支持nvarchar
 *  主要是NStringTypeHandler中,沒有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);
    }
 
 
}

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

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

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

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

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

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

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

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

相關文章

  • Spring整合redis的操作代碼

    Spring整合redis的操作代碼

    這篇文章主要介紹了Spring整合redis的操作代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java的MD5工具類和客戶端測試類

    Java的MD5工具類和客戶端測試類

    這篇文章主要介紹了Java的MD5工具類和客戶端測試類,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • Spring事件監(jiān)聽機制之@EventListener實現(xiàn)方式詳解

    Spring事件監(jiān)聽機制之@EventListener實現(xiàn)方式詳解

    這篇文章主要介紹了Spring事件監(jiān)聽機制之@EventListener實現(xiàn)方式詳解,ApplicationContext的refresh方法還是初始化了SimpleApplicationEventMulticaster,發(fā)送事件式還是先獲取ResolvableType類型,再獲取發(fā)送監(jiān)聽列表,需要的朋友可以參考下
    2023-12-12
  • java實現(xiàn)推箱子小游戲

    java實現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Java使用continue語句的實例詳解

    Java使用continue語句的實例詳解

    這篇文章主要介紹了Java使用continue語句的實例詳解的相關資料,希望通過本文能幫助到大家,讓大家掌握使用方法,需要的朋友可以參考下
    2017-10-10
  • IDEA錯誤:找不到或無法加載主類的完美解決方法

    IDEA錯誤:找不到或無法加載主類的完美解決方法

    使用IDEA開始就一直在搭建java環(huán)境,許久沒有使用過java,剛開始有些生疏,先建了一個最簡單的類可是運行的時候出現(xiàn)錯誤:找不到或無法加載主類,下面這篇文章主要給大家介紹了關于IDEA錯誤:找不到或無法加載主類的完美解決方法,需要的朋友可以參考下
    2022-07-07
  • Java基礎篇之HashMap指定初始值

    Java基礎篇之HashMap指定初始值

    這篇文章主要給大家介紹了關于Java基礎篇之HashMap指定初始值的相關資料,HashMap是Java中常用的數(shù)據(jù)結構,它提供了高效的鍵值對存儲和查詢功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • springboot使用Logback把日志輸出到控制臺或輸出到文件

    springboot使用Logback把日志輸出到控制臺或輸出到文件

    這篇文章給大家介紹springboot項目使用日志工具Logback把日志不僅輸出到控制臺,也可以輸出到文件的操作方法,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-10-10
  • java數(shù)據(jù)結構基礎:順序隊列和循環(huán)隊列

    java數(shù)據(jù)結構基礎:順序隊列和循環(huán)隊列

    下面小編就為大家分享一篇java隊列實現(xiàn)方法(順序隊列,循環(huán)隊列),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-08-08
  • Java elasticsearch安裝以及部署教程

    Java elasticsearch安裝以及部署教程

    這篇文章主要介紹了elasticsearch安裝以及部署教程,內涵詳細的圖文展示與案例介紹,能夠幫助你從0成功部署這個框架,需要的朋友可以參考下
    2021-06-06

最新評論

壤塘县| 铜川市| 深州市| 西吉县| 大厂| 河池市| 青浦区| 文昌市| 孝义市| 大邑县| 西青区| 安国市| 红桥区| 舞钢市| 年辖:市辖区| 苍山县| 靖西县| 上思县| 鄱阳县| 民勤县| 门源| 福贡县| 十堰市| 新民市| 离岛区| 华宁县| 金门县| 礼泉县| 海盐县| 家居| 银川市| 商南县| 通辽市| 河东区| 达日县| 沾化县| 儋州市| 平原县| 巴彦淖尔市| 馆陶县| 白山市|