您好,登錄后才能下訂單哦!
本篇文章為大家展示了Oracle驅(qū)動ojdbc14.jar導致千萬富翁破產(chǎn)的示例分析,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
這是一個“千萬富翁”瞬間變?yōu)椤柏毭瘛钡恼鎸嵾^程。且聽我慢慢道來。
1.故障模擬過程
1)先看一段JAVA代碼對字符串讀取轉(zhuǎn)換后的數(shù)值表示形式的差異
這段代碼實現(xiàn)的功能是從平文本文件中將字符串表示形式的內(nèi)容轉(zhuǎn)化為數(shù)值并打印出結(jié)果。
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)代碼輸出結(jié)果
代碼中顯式的將"26947280"和"122936367"字符串讀取并轉(zhuǎn)化為數(shù)字。結(jié)果對應如下:
"26947280" -- 2.694728E+7
"122936367" -- 122936367
規(guī)律:字符串中以數(shù)字零結(jié)尾的內(nèi)容轉(zhuǎn)化為數(shù)字后以2.694728E+7這種科學計數(shù)法的形式保存,而非零幾位的內(nèi)容還是以原有形式顯式。
重點關(guān)注科學計數(shù)法表示的結(jié)果,此處"26947280"結(jié)尾處的零已被去掉。2.694728E+7這種科學計數(shù)法表示的數(shù)字就是數(shù)字26947280,此處沒有問題。
3)入庫后故障出現(xiàn)
JAVA代碼將結(jié)果保存到Oracle數(shù)據(jù)庫后,詭異的事情發(fā)生了。原先以科學計數(shù)法顯示的2.694728E+7數(shù)值被存入Oracle數(shù)據(jù)庫后變成了26.9472,如下所示。
錯誤值 實際值
26.9472 26947280
這種錯誤是絕對無法容忍的。
原本將近兩千七百萬人民幣的資產(chǎn)幻滅了,變成了不到二十七元人民幣。這是何等的荒謬,誰都是無法承受這種從千萬富翁變?yōu)樨毭竦拇驌簟?br/>
2.故障分析過程
看到這個荒謬的錯誤后我們需要做的是冷靜、冷靜……還是冷靜。
仔細的去分析導致這個錯誤的最終原因到底在哪里。
1)第一種推測:JAVA本身的問題
這種可能性基本可以排除。因為在我們的測試代碼中返回的數(shù)值上看,即便數(shù)字表示形式不一樣(科學計數(shù)法與否),但是最終轉(zhuǎn)化為數(shù)值是忠于原字符串本身內(nèi)容的。也就是說2.694728E+7就是表示26947280,122936367還是其自身。
2)第二種推測:Oracle數(shù)據(jù)庫本身的問題
這種可能性也站不住腳,試想一下,作為一款大牌商業(yè)數(shù)據(jù)庫軟件的Oracle怎么會隨隨便便將客戶的數(shù)據(jù)篡改呢。
Oracle會將應用程序傳過來的內(nèi)容原原本本的存放到數(shù)據(jù)庫中,用于后續(xù)的展示或處理。
3)第三種推測:問題出在應用程序和Oracle數(shù)據(jù)庫之間
JAVA應用程序是通過ojdbc14.jar這個驅(qū)動程序與Oracle數(shù)據(jù)庫進行銜接的。莫非問題出在這個環(huán)節(jié)?
(1)查看當前ojdbc14.jar文件的版本
版本查看方法:可以使用解壓軟件打開ojdbc14.jar文件,查看META-INF文件夾中的MANIFEST.MF文件,內(nèi)容如下:
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版本中的最基礎的驅(qū)動程序。
(2)嘗試下載10g最新的驅(qū)動程序重新測試
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最新版本的驅(qū)動是10.2.0.5.0。
在更換了驅(qū)動程序之后,之前的故障迎刃而解。原來罪魁禍首就是APP與DB之間的驅(qū)動程序ojdbc14.jar。
3.故障處理方法
通過上面的分析過程已經(jīng)確認是Oracle驅(qū)動程序ojdbc14.jar版本過低導致的,因此故障處理方法很直接,替換生產(chǎn)環(huán)境中10.2.0.1版本的驅(qū)動為10.2.0.5驅(qū)動。
本文中提到的故障場景影響是很惡劣的。即便在替換驅(qū)動后依然有很多善后工作要做,比如將已經(jīng)入庫的錯誤數(shù)據(jù)的查找并調(diào)整正確。
在JAVA應用程序和數(shù)據(jù)庫之間的驅(qū)動選取方面需要注意,基本要求,保證驅(qū)動版本和數(shù)據(jù)庫的版本保持一致,或者使用較新版本的驅(qū)動程序。
這個故障帶給我們的啟示是:任何一個環(huán)節(jié)都有可能存在重大的隱患,細致嚴謹永遠是IT人最重要的職業(yè)素質(zhì)。
上述內(nèi)容就是Oracle驅(qū)動ojdbc14.jar導致千萬富翁破產(chǎn)的示例分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。