sharding-jdbc遇到的問題

一、前言

其實(shí)最近找工作面試,都能補(bǔ)缺自己好多知識(shí)點(diǎn),對(duì)于源碼的熟悉度,掌握程度都會(huì)有一個(gè)進(jìn)步,一些問題應(yīng)該怎么思考等等,這就是需要的成長(zhǎng)。努力?。?!

二、內(nèi)容

離職前做了一個(gè)分表的功能,按照月分表處理埋點(diǎn)數(shù)據(jù),遇到以下兩個(gè)問題
1)、在分表查詢數(shù)據(jù)的時(shí)候,出現(xiàn)異常,Unsupported Date type:class java.lang.String
2)、在分表查詢跨表查的時(shí)候只查詢出來(lái)一條數(shù)據(jù)
現(xiàn)在對(duì)這兩個(gè)問題做下說(shuō)明如下:

2.1、類型轉(zhuǎn)換異常問題

@Override
  public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
    try {
      if (Object.class.equals(method.getDeclaringClass())) {
        return method.invoke(this, params);
      }    
      Object o = method.invoke(rs, params);
      if ("next".equals(method.getName())) {
        if (((Boolean) o)) {
          rows++;
          if (isTraceEnabled()) {
            ResultSetMetaData rsmd = rs.getMetaData();
            final int columnCount = rsmd.getColumnCount();
            if (first) {
              first = false;
              printColumnHeaders(rsmd, columnCount);
            }
            printColumnValues(columnCount);
          }
        } else {
          debug("     Total: " + rows, false);
        }
      }
      clearColumnInfo();
      return o;
    } catch (Throwable t) {
      throw ExceptionUtil.unwrapThrowable(t);
    }
  }
private void printColumnValues(int columnCount) {
    StringBuilder row = new StringBuilder();
    row.append("       Row: ");
    for (int i = 1; i <= columnCount; i++) {
      String colname;
      try {
        if (blobColumns.contains(i)) {
          colname = "<<BLOB>>";
        } else {
          colname = rs.getString(i);
        }
      } catch (SQLException e) {
        // generally can't call getString() on a BLOB column
        colname = "<<Cannot Display>>";
      }
      row.append(colname);
      if (i != columnCount) {
        row.append(", ");
      }
    }
    trace(row.toString(), false);
  }
image.png
@Override
    public String getString(final int columnIndex) throws SQLException {
        Object result = mergeResultSet.getValue(columnIndex, String.class);
        wasNull = null == result;
        return (String) ResultSetUtil.convertValue(result, String.class);
    }
image.png
image.png


### Cause: com.dangdang.ddframe.rdb.sharding.exception.ShardingJdbcException: Unsupported Date type:class java.lang.String
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
    ... 89 common frames omitted
Caused by: com.dangdang.ddframe.rdb.sharding.exception.ShardingJdbcException: Unsupported Date type:class java.lang.String
    at com.dangdang.ddframe.rdb.sharding.merger.util.ResultSetUtil.convertDateValue(ResultSetUtil.java:122)
    at com.dangdang.ddframe.rdb.sharding.merger.util.ResultSetUtil.convertValue(ResultSetUtil.java:56)
    at com.dangdang.ddframe.rdb.sharding.jdbc.core.resultset.ShardingResultSet.getString(ShardingResultSet.java:168)
    at org.apache.ibatis.logging.jdbc.ResultSetLogger.printColumnValues(ResultSetLogger.java:117)
    at org.apache.ibatis.logging.jdbc.ResultSetLogger.invoke(ResultSetLogger.java:79)
    at com.sun.proxy.$Proxy172.next(Unknown Source)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:345)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:322)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:295)
    at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:192)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
    at com.sun.proxy.$Proxy169.query(Unknown Source)
    at org.apache.ibatis.executor.ReuseExecutor.doQuery(ReuseExecutor.java:60)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    ... 95 common frames omitted

ResultSetLogger.java  ----- invoke(Object proxy,Method method,Object[] params) throws Throwable


ResultSetLogger.java ----- printColumnValues(columnCount);



ResultSetLogger.java -----   colname = rs.getString(i);


ShardingResultSet.java ----- getString(final int columnIndex);


ShardingResultSet.java ----- return (String) ResultSetUtil.convertValue(result, String.class);



ResultSetUtil.java      ----- return convertDateValue(value, convertType);


ResultSetUtil.java   convertDateValue(final Object value, final Class<?> convertType)   拋出異常

image.png

2.2、對(duì)于查詢數(shù)據(jù)合并的問題

針對(duì)第二個(gè)問題,最開始思考的時(shí)候是覺得是不是sharding不支持跨庫(kù)查詢,因?yàn)閱渭儾樵円粡埍硎菦]問題的,所有也沒辦法,就是跟源碼,在對(duì)于一列的時(shí)候count的時(shí)候,進(jìn)行了合并操作,其實(shí)當(dāng)時(shí)很納悶,為什么,count這個(gè)字段有影響么,然后我嘗試在sql里面把如下代碼做了更改
原始sql:

select count,clickDate,clickName from table

修改完后

select t.count,t.clickDate,t.clickName from table t

其實(shí)就是給表加了個(gè)別名,然后也加到了字段前,這樣就解決了,其實(shí)覺得很神奇,后面把這的源碼那塊放出來(lái),之前忘記截圖了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容