springboot版本 2.2.2.RELEASE
druid版本 1.1.21
oracle版本 12g
遇到問題和解決方法記錄如下,獨樂樂不如衆樂樂,希望遇到同樣問題的人看到後會有所幫助
1.連接oracle工具navicat,下載版本和oci版本要一致,都是64位或都是32位
我是64位navicat,所以下載了oci爲64位的:https://download.oracle.com/otn_software/nt/instantclient/19500/instantclient-basic-windows.x64-19.5.0.0.0dbru.zip
下載解壓後,在navicat 工具-->選項-->oci 配置剛纔解壓的文件夾裏的oci,配置後必須重啓navicat;
創建oralce鏈接如圖:
記得設置保活心跳間隔,不然過一會就自己斷了就必須重啓才能連上,設置如下圖後就不會斷了
連上後就可以happy的使用了
2.druid連接池,程序過一會兒就報com.alibaba.druid.util.JdbcUtils - close statement error錯誤,然後重連訪問需要停頓一段時間,體驗很不好
解決方案:
# 初始化大小,最小,最大
initialSize: 10
minIdle: 10
maxActive: 200
keepAlive: true
# 配置獲取連接等待超時的時間
maxWait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis: 60000
validationQuery: SELECT 1 FROM DUAL
validationQueryTimeout: 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打開PSCache,並且指定每個連接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 100
# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
filters: stat,wall,log4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合併多個DruidDataSource的監控數據
useGlobalDataSourceStat: true
removeAbandoned: true
removeAbandonedTimeout: 1800
注意上配置中紅色配置很重要,然後在程序中相應設置一下,如下圖
最後登錄druid管理界面確認一下是否配置成功,如下圖,其他屬性都可以看下是否成功
這樣終於解決了druid連oracle過一會就close error和停頓的問題了。
具體原因是通過趴底層代碼keepAlive默認false,debug走到心跳檢測是否有效時,如果沒有keepAlive就不會按空閒檢測時間執行,導致oracle服務端可能由於防火牆等因素斷了鏈接,而客戶端不知道就報關閉鏈接錯誤了。
3.創建和關閉sqlSession都沒有進行事務註冊,老是提示create/close a non transanctional session
解決方案是給每個service的實現類impl註解上@Transactional(rollbackFor = Exception.class)
例如截圖:
以上問題在此記錄一下,希望見着能解心中疑惑,如果你有其他高見或者疑問,留言本帖吧!