人大金倉kingbase invalid value for parameter client_encoding ANSI_X3.4-1968

人大金倉kingbase invalid value for parameter client_encoding ANSI_X3.4-1968

背景

應(yīng)用連接數(shù)據(jù)庫的時候提示以下錯誤:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is com.kingbase8.util.KSQLException: ????????????: ?????? "client_encoding" ????????????: "ANSI_X3.4-1968"
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.cloud.autoconfigure.RefreshAutoConfiguration$JpaInvokerConfiguration.init(RefreshAutoConfiguration.java:120)
    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.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157)
    ... 26 common frames omitted

懷疑問題

  1. jdbc驅(qū)動連接沒有設(shè)置和數(shù)據(jù)庫一致的編碼

    人大金倉的資料實在是少,甚至如何在jdbc連接設(shè)置編碼都無法找到,但是我們可以查找kingbase://協(xié)議踏幻,看看別人是怎么寫的察署,發(fā)現(xiàn)是這樣寫的:

    *jdbc:kingbase8*://***:5419/cdb?useUnicode=true&characterEncoding=utf-8屎暇。于是改上去,并沒有用。排除改方向

  2. Druid不支持kingbase8

    在百度確實找到了這個說法,但是官網(wǎng)上不去茂嗓,沒辦法驗證這個說法。而且本地可以正常連接科阎,服務(wù)器連接不正常述吸。排除改方向

解決步驟

  1. 解決初始化連接返回的亂碼信息

    com.kingbase8.util.KSQLException: ????????????: ?????? "client_encoding" ????????????: "ANSI_X3.4-1968"
    

    在以上信息可以看到,這個應(yīng)該是鏈接的時候返回的锣笨,第一反應(yīng)就是去查看kingbase日志:/data/kingbase/ES/V8/data/sys_log蝌矛。可以看到如下信息:

    2021-04-14 16:18:43 CST 致命錯誤:  參數(shù) "client_encoding" 的值無效: "ANSI_X3.4-1968"
    

    終于發(fā)現(xiàn)錯誤本體了票唆,但是,是什么導(dǎo)致了亂碼屹徘?亂碼肯定是中文不是英文了走趋,所以應(yīng)該有什么地址可以設(shè)置日志的編碼。不過kingbase基本和postgresql一致噪伊,所以按照postgresql的方法修改日志的編碼即可簿煌。大致找了下kingbase的日志氮唯,發(fā)現(xiàn)在這個文件kingbase.conf

    修改kingbase.conf日志編碼

    lc_messages = 'zh_CN.UTF-8'
    

    修改成:

    lc_messages = 'en_US.UTF-8'
    

    重啟kingbase:sudo systemctl restart kingbase

    之后可以看到j(luò)ava的日志打印正常了:

    FATAL: invalid value for parameter "client_encoding": "ANSI_X3.4-1968"

  2. 調(diào)試源碼

    根據(jù)提示信息查找,發(fā)現(xiàn)并沒有查看到有用的信息姨伟,所以嘗試調(diào)試源碼

    在以下文件的對應(yīng)方法[com.kingbase8.core.v3.ConnectionFactoryImpl#openConnectionImpl]找到了108行關(guān)鍵代碼:

    newStream = new KBStream(socketFactory, hostSpec, connectTimeout);
    String client_encoding;
    if (KBProperty.CLIENT_ENCODING.get(info) == null) {
    client_encoding = System.getProperty("file.encoding");
    info.setProperty("clientEncoding", client_encoding);
    LOGGER.log(Level.FINE, "Use current JVM default encoding {0}", client_encoding);
    }
    
    client_encoding = KBProperty.CLIENT_ENCODING.get(info);
    newStream.setEncoding(Encoding.getJVMEncoding(client_encoding));
    

    可以看到初始化連接的時候惩琉,獲取了jvm_encoding。這里夺荒,我們可以調(diào)試一下瞒渠,在容器下的jvm_encoding究竟是什么編碼?

    可以使用arthas修改容器class文件打印以下技扼,或者隨便在啟動的時候日志打印以下System.getProperty("file.encoding")伍玖。容器只記錄日志的輸出,所以可能使用System.out.println會無法顯示剿吻。

  3. 修改docker的jvm_encoding

    在dockerfile添加以下代碼即可:ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8

    完整的Dockerfile大致如下:

    #FROM指令必須指定且需要在Dockerfile其他指令的前面,指定的基礎(chǔ)image可以是官方遠程倉庫中的窍箍,也可以位于本地倉庫
    FROM livingobjects/jre8
    # UTF-8 并配置環(huán)境
    ENV LANG C.UTF-8
    ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8
    #使容器中的一個目錄具有持久化存儲數(shù)據(jù)的功能,該目錄可以被容器本身使用
    VOLUME /tmp
    #從src目錄復(fù)制文件到容器的dest丽旅。其中src可以是Dockerfile所在目錄的相對路徑椰棘,也可以是一個URL,還可以是一個壓縮包
    ADD target/*.jar app.jar
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    RUN echo 'Asia/Shanghai' >/etc/timezone
    #ADD wait-for-it.sh /wait-for-it.sh
    RUN bash -c 'touch /app.jar'
    #指定Docker容器啟動時執(zhí)行的命令榄笙,可以多次設(shè)置邪狞,但是只有最后一個有效。
    ENTRYPOINT ["java","-Dfile.encoding=UTF8","-jar","/app.jar","--spring.profiles.active=test","&"]
    
  4. 修改重新build了之后可以發(fā)現(xiàn)办斑,連接正常了外恕。

總結(jié)

  1. 網(wǎng)上關(guān)于人大金倉的資料比較少,如果遇到問題乡翅,可以嘗試把關(guān)鍵字更換成postgresql再查看鳞疲,也許更容易查找到答案
  2. 需要意識到容器化部署下一些參數(shù)不一致。
  3. 網(wǎng)上找不到答案可以從源碼入手
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蠕蚜,一起剝皮案震驚了整個濱河市尚洽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌靶累,老刑警劉巖腺毫,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挣柬,居然都是意外死亡潮酒,警方通過查閱死者的電腦和手機邪蛔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勃教,“玉大人淤击,你說我怎么就攤上這事」试矗” “怎么了污抬?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵绳军,是天一觀的道長。 經(jīng)常有香客問我删铃,道長耳贬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任猎唁,我火速辦了婚禮咒劲,結(jié)果婚禮上诫隅,老公的妹妹穿的比我還像新娘。我一直安慰自己逐纬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布兔毒。 她就那樣靜靜地躺著甸箱,像睡著了一般育叁。 火紅的嫁衣襯著肌膚如雪芍殖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天豌骏,我揣著相機與錄音龟梦,去河邊找鬼窃躲。 笑死,一個胖子當(dāng)著我的面吹牛蒂窒,可吹牛的內(nèi)容都是我干的赎婚。 我是一名探鬼主播樱溉,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼纬凤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挖帘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拇舀,失蹤者是張志新(化名)和其女友劉穎蜻底,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薄辅,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年脱惰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窿春。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡旧乞,死狀恐怖蔚润,靈堂內(nèi)的尸體忽然破棺而出良蛮,到底是詐尸還是另有隱情,我是刑警寧澤决瞳,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布皮胡,位于F島的核電站痴颊,受9級特大地震影響屡贺,放射性物質(zhì)發(fā)生泄漏锌杀。R本人自食惡果不足惜泻仙,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望突想。 院中可真熱鬧,春花似錦猾担、人聲如沸刺下。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至畅卓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惕鼓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工箱歧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留一膨,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓价淌,卻偏偏與公主長得像瞒津,于是被迫代替她去往敵國和親蝉衣。 傳聞我的和親對象是個殘疾皇子巷蚪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容