您好,登錄后才能下訂單哦!
本篇文章為大家展示了Oracle驅動ojdbc14.jar導致千萬富翁破產的示例分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
這是一個“千萬富翁”瞬間變為“貧民”的真實過程。且聽我慢慢道來。
1.故障模擬過程
1)先看一段JAVA代碼對字符串讀取轉換后的數值表示形式的差異
這段代碼實現的功能是從平文本文件中將字符串表示形式的內容轉化為數值并打印出結果。
Normal
0
false
false
false
EN-US
ZH-CN
X-NONE</w:LidThemeComplexScript.
<style. /* Style. Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0cm;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
</style.package org.seco.sclcore.test; importjava.math.BigDecimal; publicclass Sample{ /** *@paramargs */ publicstaticvoid main(String[]
args) { //TODOAuto-generated method stub System.out.println(getSalesMoney("26947280"));
System.out.println(getSalesMoney("122936367")); } publicstatic BigDecimalgetSalesMoney(String value) {
String stringValue; boolean isNegative = false; if (value.indexOf("-") != -1)
{
stringValue = value.replace("-", "");
isNegative = true;
} else
{
stringValue = value;
}
BigDecimal result = BigDecimal.ZERO; if (isNegative)
{ double doubleValue =
-1;
result =
BigDecimal.valueOf(Double.valueOf(stringValue).doubleValue()).multiply(
BigDecimal.valueOf(doubleValue));
} else
{
result = BigDecimal.valueOf(Double.valueOf(stringValue).doubleValue());
} return result; } }
2)代碼輸出結果
代碼中顯式的將"26947280"和"122936367"字符串讀取并轉化為數字。結果對應如下:
"26947280" -- 2.694728E+7
"122936367" -- 122936367
規律:字符串中以數字零結尾的內容轉化為數字后以2.694728E+7這種科學計數法的形式保存,而非零幾位的內容還是以原有形式顯式。
重點關注科學計數法表示的結果,此處"26947280"結尾處的零已被去掉。2.694728E+7這種科學計數法表示的數字就是數字26947280,此處沒有問題。
3)入庫后故障出現
JAVA代碼將結果保存到Oracle數據庫后,詭異的事情發生了。原先以科學計數法顯示的2.694728E+7數值被存入Oracle數據庫后變成了26.9472,如下所示。
錯誤值 實際值
26.9472 26947280
這種錯誤是絕對無法容忍的。
原本將近兩千七百萬人民幣的資產幻滅了,變成了不到二十七元人民幣。這是何等的荒謬,誰都是無法承受這種從千萬富翁變為貧民的打擊。
2.故障分析過程
看到這個荒謬的錯誤后我們需要做的是冷靜、冷靜……還是冷靜。
仔細的去分析導致這個錯誤的最終原因到底在哪里。
1)第一種推測:JAVA本身的問題
這種可能性基本可以排除。因為在我們的測試代碼中返回的數值上看,即便數字表示形式不一樣(科學計數法與否),但是最終轉化為數值是忠于原字符串本身內容的。也就是說2.694728E+7就是表示26947280,122936367還是其自身。
2)第二種推測:Oracle數據庫本身的問題
這種可能性也站不住腳,試想一下,作為一款大牌商業數據庫軟件的Oracle怎么會隨隨便便將客戶的數據篡改呢。
Oracle會將應用程序傳過來的內容原原本本的存放到數據庫中,用于后續的展示或處理。
3)第三種推測:問題出在應用程序和Oracle數據庫之間
JAVA應用程序是通過ojdbc14.jar這個驅動程序與Oracle數據庫進行銜接的。莫非問題出在這個環節?
(1)查看當前ojdbc14.jar文件的版本
版本查看方法:可以使用解壓軟件打開ojdbc14.jar文件,查看META-INF文件夾中的MANIFEST.MF文件,內容如下:
Manifest-Version: 1.0
Specification-Title: Oracle JDBC driver classes for use with JDK14
Sealed: true
Created-By: 1.4.2_08 (Sun Microsystems Inc.)
Implementation-Title: ojdbc14.jar
Specification-Vendor: Oracle Corporation
Specification-Version: Oracle JDBC Driver version - "10.2.0.1.0"
Implementation-Version: Oracle JDBC Driver version - "10.2.0.1.0"
Implementation-Vendor: Oracle Corporation
Implementation-Time: Wed Jun 22 11:19:45 2005
Name: oracle/sql/converter/
Sealed: false
Name: oracle/sql/
Sealed: false
Name: oracle/sql/converter_xcharset/
Sealed: false
可見,這里使用的是10.2.0.1.0這個10g版本中的最基礎的驅動程序。
(2)嘗試下載10g最新的驅動程序重新測試
10g的最新ojdbc14.jar文件的版本信息如下:
Manifest-Version: 1.0
Specification-Title: Oracle JDBC driver classes for use with JDK14
Sealed: true
Created-By: 1.4.2_14 (Sun Microsystems Inc.)
Implementation-Title: ojdbc14.jar
Specification-Vendor: Oracle Corporation
Specification-Version: Oracle JDBC Driver version - "10.2.0.5.0"
Implementation-Version: Oracle JDBC Driver version - "10.2.0.5.0"
Implementation-Vendor: Oracle Corporation
Implementation-Time: Thu Apr 8 03:40:31 2010
Name: oracle/sql/converter/
Sealed: false
Name: oracle/sql/
Sealed: false
Name: oracle/sql/converter_xcharset/
Sealed: false
10g最新版本的驅動是10.2.0.5.0。
在更換了驅動程序之后,之前的故障迎刃而解。原來罪魁禍首就是APP與DB之間的驅動程序ojdbc14.jar。
3.故障處理方法
通過上面的分析過程已經確認是Oracle驅動程序ojdbc14.jar版本過低導致的,因此故障處理方法很直接,替換生產環境中10.2.0.1版本的驅動為10.2.0.5驅動。
本文中提到的故障場景影響是很惡劣的。即便在替換驅動后依然有很多善后工作要做,比如將已經入庫的錯誤數據的查找并調整正確。
在JAVA應用程序和數據庫之間的驅動選取方面需要注意,基本要求,保證驅動版本和數據庫的版本保持一致,或者使用較新版本的驅動程序。
這個故障帶給我們的啟示是:任何一個環節都有可能存在重大的隱患,細致嚴謹永遠是IT人最重要的職業素質。
上述內容就是Oracle驅動ojdbc14.jar導致千萬富翁破產的示例分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。