場景
今天使用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
- 創建一個工程 avatica-bug-fixed
<dependency>
<groupId>org.apache.calcite.avatica</groupId>
<artifactId>avatica-server</artifactId>
<version>1.15.0</version>
</dependency>
爲啥用1.15.0 因爲druid的這個版本就是這個,爲了兼容版本,防止類方法不同
-
將https://github.com/apache/calcite-avatica的
server/src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java
拷貝到新工程裏面 -
路徑保持一致
src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java
-
打包
mvn clean install
-
上傳到druid的lib目錄裏面
-
重啓 druid
完美解決