【Druid 實戰】Druid 的 SQL 中文亂碼問題(avatica)

場景

今天使用Druid,通過avatica客戶端去查詢的時候,發現返回值爲空

select xx from table where a = '開心'

發現交互的時候,返回的Response裏面返回的查詢語句竟然是

select xx from table where a = '??'

在這裏插入圖片描述
你妹啊,這問號啥意思。我就一箇中文查詢語句啊
冷靜,冷靜,
肯定是編碼問題

問題排查

在這裏插入圖片描述
看源碼

先獲取utf-8的bytesarray => 由httpclient 作爲 application/octet-steam 上傳服務端

所以客戶端沒問題

難道是服務端有問題?
在這裏插入圖片描述

https://www.cnblogs.com/ginponson/p/9042571.html

正如其中介紹,找到對應的avatica版本 1.15.0

 final String jsonRequest =	        final String jsonRequest = rawRequest;
            new String(rawRequest.getBytes("ISO-8859-1"), "UTF-8");

在這裏插入圖片描述

修復地址: https://github.com/apache/calcite-avatica/commit/fa8c9bd94c9de48dbfb644b2154f5689ea01fca1?diff=split

utf-8編碼後的字節流,你用ISO-8859-1是什麼意思。

好吧,人家在新版本已經修復了。

but 我的druid是0.18.1,全網最新有木有,有木有

然後看了一下對應的 pom.xml
在這裏插入圖片描述
人家在 0.18.2-SNAPSHOT 更新的(7 day)

解決方案

人家的版本還沒有release,肯定不敢升級了
在這裏插入圖片描述
java classpath 按序加載類

java -jar -c a.jar b.jar => 如果 a和b中都有一個com.xxx.XxxService => 優先使用 a.jar 的類

ok

  1. 創建一個工程 avatica-bug-fixed
<dependency>
    <groupId>org.apache.calcite.avatica</groupId>
    <artifactId>avatica-server</artifactId>
    <version>1.15.0</version>
</dependency>

爲啥用1.15.0 因爲druid的這個版本就是這個,爲了兼容版本,防止類方法不同

  1. 將https://github.com/apache/calcite-avatica的server/src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java拷貝到新工程裏面

  2. 路徑保持一致src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java

  3. 打包 mvn clean install

  4. 上傳到druid的lib目錄裏面

  5. 重啓 druid

完美解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章