1.JPA 適配
總結(jié)一些,JPA 工程 適配 人大金倉(KingBase) 數(shù)據(jù)庫遇到的些問題
1.0.背景
項目需要適配國產(chǎn)化,其中包含操作系統(tǒng)悲伶、數(shù)據(jù)庫领斥、消息中間件等
當前 為 SpringBoot + JPA 工程 適配 KingBase8
1.1.SQL 轉(zhuǎn)化
KingBase8 安裝后,會自帶 遷移工具的
通過 這個工具 可以轉(zhuǎn)換 MySQL 或 Oracle 的腳本(DDL,DML)
1.2.問題
1.2.1 qrtz 注冊失敗
工程里使用了qrtz ,qrtz 需要DB保存一些調(diào)度任務(wù)的詳情,但在注冊這些數(shù)據(jù)的時候欢峰,告訴說表字段太短了(Oracle、MySQL 里長度都是1)
排查好久也沒跟蹤到具體失敗的原因是什么涨共,后來將 表字段大小調(diào)大了點纽帖,臨時處理了。
1.2.2 org.hibernate.engine.jdbc.spi.SqlExceptionHelper [129] -| 錯誤: 關(guān)系 "hibernate_sequence" 不存在
解決:
在 DB 里創(chuàng)建了這個序列
create sequence HIBERNATE_SEQUENCE
minvalue 100
maxvalue 9223372036854775807
start with 1
increment by 1
cache 10;
minvalue 為什么是100举反?
有些表有初始化數(shù)據(jù)懊直,占據(jù)了自動生成的 id 值
2 JDBC 適配
2.0.背景
老舊的 spring 工程, 使用原生的 jdbc 進行數(shù)據(jù)的操作
2.1.問題
2.1.1 com.kingbase8.util.KSQLException: The query "select TTEXT from TABLE where ID=?" is not locked.
問題產(chǎn)生的原因在于 要 更新 clob 類型的字段導致的
解決: 在 select 語句后加上 for update 火鼻,把行鎖住室囊,再來更新
官方給的示例:
MySQL 與 Oracle 不需要 for update 來鎖行的操作
3 其他問題
3.1 需注意的表字段類型
smallserial/serial/bigserial : 自動增長的數(shù)據(jù)類型,可用作主鍵
varchar : 有單位 byte / char. 缺省是byte
執(zhí)行ddl之前:需顯示指定 char
set char_default_type = 'char';
3.2 觸發(fā)器
與Oracle對比
Oracel:
CREATE
OR REPLACE TRIGGER IS_TEST_TRG BEFORE INSERT ON IS_TEST FOR EACH ROW
WHEN (NEW.ID IS NULL)
BEGIN
SELECT
IS_TEST.NEXTVAL INTO : NEW.ID
FROM
DUAL;
END;
KingBase8
CREATE
OR REPLACE TRIGGER IS_TEST_TRG BEFORE INSERT ON
PUBLIC.IS_TEST FOR EACH ROW
WHEN(
(
NEW.ID IS NULL
)
) AS BEGIN SELECT
IS_TEST .NEXTVAL INTO NEW.ID
FROM
DUAL;
END;
區(qū)別:
1.在BEGIN 前加 AS
2.INTO 后魁索,NEW.ID 前的 : 刪掉
3.3 使用 druid 數(shù)據(jù)源
在啟動的時候報不支持的db類型
java.lang.IllegalStateException: dbType not support : null, url jdbc:kingbase8://192.168.2.1:54321/test
在跟蹤源碼后發(fā)現(xiàn)融撞,druid 并不支持 kingbase8 ,并且又在官方 FAQ 里找到相關(guān)解釋
去掉了 wall 后工程正常啟動