Oracle轉PostgreSQL後,應用層修改時碰到的問題

使用 Ora2PG 完成Oracle到PostgreSQL遷移後,就需要修改Java應用的代碼了,我們使用的是 Spring Boot + Druid + MyBatis,除了常規的函數不同要修改,比較瑣碎的就屬子查詢要有別名和臨時表的問題。

這裏,重點講臨時表碰到的問題:

1. 使用 Ora2PG 工具後,發現所有的臨時表定義都不在目標導出文件裏。以前用Oracle,可以把臨時表定義好,Oracle會保證數據隔離的。但是這幾個臨時表都沒導出來,應用在測試時報表不存在。但是在PGAdmin和Navicat裏執行臨時表的定義語句均可成功,也能查詢到,但是一跑應用就說表不存在。網上搜了PostgreSQL 臨時表才知道機制不同。

2. 於是我就在需要臨時表的語句前用 Spring JdbcTemplate 執行建表語句,結果報 “com.alibaba.druid.sql.parser.ParserException: TODO IDENTIFIER” 和 “sql injecion violation” 錯誤,但是建表語句在 PG 客戶端執行都是沒問題的。所以我只能換掉 Druid,嘗試 C3P0 連接池。

3. 參照 Spring Boot 集成 MyBatis 與 c3p0 寫完代碼,運行時報 “ClassNotFoundException: org.postgresql.PGDate   ” 錯誤,但是同樣的數據庫連接參數 Druid 是可以的,後來才發現 Druid和 C3P0 對讀取到的屬性值處理不同,Druid會處理值左右的空格,而 C3P0 不會,所以要保證參數值左右不要有空格。

4. 臨時表的機制在上面給出的參考鏈接裏,該作者講的比較清楚了。我對此的理解是:

a)	如果數據在一個事務裏是一次消費,那麼用 on commit drop
b)	如果同一用戶會話裏,不同事務間依賴相同表結構,但是產生的數據均不同,用 on commit delete rows
c)	如果類似緩存功能,整個會話期間多個事務都去查詢,則用 on commit preserve rows
第一種直接在事務裏需要地方創建臨時表,後兩種都是可以在用戶登錄的時候或者合適的地方預先創建

 

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