溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle驅(qū)動ojdbc14.jar導致千萬富翁破產(chǎn)的示例分析

發(fā)布時間:2021-11-08 09:31:10 來源:億速云 閱讀:210 作者:柒染 欄目:建站服務器

本篇文章為大家展示了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è)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI