閱讀481 返回首頁    go 阿裏雲 go 技術社區[雲棲]


實踐真知:解決 Jdbc 連接 Oracle 12c 時快時慢的問題

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

李真旭@killdb

Oracle ACE,雲和恩墨技術專家

個人博客:www.killdb.com


編輯手記:認識 JDBC 連接在不同版本間的差異,準確找出導致連接不穩定的真凶


我們通過一個實例來認識連接的問題 。

問題描述

客戶使用的是 oracle 12c(12.1.0.1),應用通過jdbc訪問發現時快時慢。但是通過 sqlplus 訪問發現一切正常。開始以為是防火牆問題,檢查發現防火牆什麼的都是禁用掉了,甚至我還修改了 selinux=disable,發現問題依舊。由於之前處理過幾個類似的 case,都是 jdbc 版本的問題,因此開始我讓他們換幾個 jdbc 版本測試下,發現問題依舊。類似如下結果:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


後麵我通過 strace 跟蹤發現了一些蛛絲馬跡,如下的跟蹤的結果:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


到futex 這裏一直 timeout,大概10多秒。其中的 open(“/dev/random”, O_RDONLY) 引起了我的注意,google 搜了一下,還真有不少人遇到過。

Oracle 從11g開始,對於jdbc 這塊兒安全上進行了加強,大概是這樣的一個解釋:
The JDBC 11g needs about 40 bytes of secure random numbers, gathered from /dev/random, to encrypt its connect string.

那麼解決方法就是將 java_home下麵的 Java.security 文件中的如下內容進行修改:
securerandom.source=file:/dev/random 修改為:securerandom.source=file:/dev/urandom

當我客戶檢查時,發現這個配置文件已經是 securerandom.source=file:/dev/urandom 了。到這裏我似乎感覺是 jdbc 版本的問題了或者是 12c 本身的問題。

將客戶的jar把傳到自己的 12.1.0.1 和 12.1.0.2 環境中進行測試,發現現象一樣,時快時慢。通過 strace 跟蹤了一下,發現信息跟之前在客戶環境中的 strace 結果類似,這是很怪異的。後麵我懷疑可能是這個配置文件並沒有起作用,最後搜了下mos發現有一篇文檔:

How To Configure Database JVM (JavaVM) To Use /dev/urandom (In Order To Avoid JDBC Connection Delays Due To Lack Of Random Number Entropy) (ID 1594701.1)

其中對這個問題的描述如下:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

簡單來講,使用 /dev/random 產生隨機數的方式必須要保證熵足夠大,才能夠產生足夠的隨機數支持連接,否則係統就會產生等待,直到有足夠的隨機數再進行連接,這樣就有了延時。為解決這個問題,建議使用 /dev/urandom,因其不會受到阻塞,因此很好地解決了連接延時的問題。

建議是直接修改配置文件,如下:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


這樣修改的目的是強製database JVM 使用 /dev/urandom, 而不是 /dev/random。

這個 case 本身是並不複雜,比較簡單,跟大家分享一下,歡迎交流!

注意:這裏最好是使用 oracle 自己的 java,保持版本一致,我這裏測試發現如果使用 os 自己的 java,版本較低,連接仍然會比較慢。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

這個版本很明顯是低於Oracle 12.1.0.1 官方文檔中的要求的,必須是1.6.0_37以上版本。


文章轉自數據和雲公眾號,原文鏈接

最後更新:2017-07-18 11:32:59

  上一篇:go  DBA生存警示:主備環境誤操作案例及防範建議
  下一篇:go  抬頭看天,低頭看路,五一看人:雲時代的DBA,何去何從?