掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

通過JDBC連接Oracle數據庫的(de)十個(gè)技巧

2019/4/10 9:22:22

通過JDBC連接Oracle數據庫的(de)十個(gè)技巧

  1、在客戶端軟件(jiàn)開(kāi)發中使用(yòng)Thin驅動程序

  在開(kāi)發Java軟件(jiàn)方面,Oracle數據庫提供了四種類型的(de)驅動程序,其中兩種用(yòng)于應用(yòng)軟件(jiàn)、applets、servlets等客戶端軟件(jiàn),另外二種用(yòng)于數據庫中的(de)Java存儲過程等服務器(qì)端軟件(jiàn)。在客戶機端軟件(jiàn)的(de)開(kāi)發中,我們可(kě)以選擇OCI驅動程序或Thin驅動程序。OCI驅動程序利用(yòng)Java本地(dì)化接口(JNI),通過Oracle客戶端軟件(jiàn)與數據庫進行(xíng)通訊。Thin驅動程序是純Java驅動程序,它直接與數據庫進行(xíng)通訊。爲了獲得最高(gāo)的(de)性能(néng),Oracle建議在客戶端軟件(jiàn)的(de)開(kāi)發中使用(yòng)OCI驅動程序,這似乎是正确的(de)。但(dàn)我建議使用(yòng)Thin驅動程序,因爲通過多次測試發現,在通常情況下,Thin驅動程序的(de)性能(néng)都(dōu)超過了OCI驅動程序。

  2、關閉自動提交功能(néng),提高(gāo)系統性能(néng)

  在第一次建立與數據庫的(de)連接時,在缺省情況下,連接是在自動提交模式下的(de)。爲了獲得更好的(de)性能(néng),可(kě)以通過調用(yòng)帶布爾值false參數的(de)Connection類的(de)setAutoCommit()方法關閉自動提交功能(néng),如(rú)下所示:

  conn.setAutoCommit(false);

  值得注意的(de)是,一旦關閉了自動提交功能(néng),我們就需要通過調用(yòng)Connection類的(de)commit()和(hé)rollback()方法來人(rén)工(gōng)的(de)方式對事務進行(xíng)管理(lǐ)。

  3、在動态SQL或有(yǒu)時間限制(zhì)的(de)命令中使用(yòng)Statement對象

  在執行(xíng)SQL命令時,我們有(yǒu)二種選擇:可(kě)以使用(yòng)PreparedStatement對象,也(yě)可(kě)以使用(yòng)Statement對象。無論多少(shǎo)次地(dì)使用(yòng)同一個(gè)SQL命令,PreparedStatement都(dōu)隻對它解析和(hé)編譯一次。當使用(yòng)Statement對象時,每次執行(xíng)一個(gè)SQL命令時,都(dōu)會(huì)對它進行(xíng)解析和(hé)編譯。這可(kě)能(néng)會(huì)使你(nǐ)認爲,使用(yòng)PreparedStatement對象比使用(yòng)Statement對象的(de)速度更快。然而,我進行(xíng)的(de)測試表明(míng),在客戶端軟件(jiàn)中,情況并非如(rú)此。因此,在有(yǒu)時間限制(zhì)的(de)SQL操作中,除非成批地(dì)處理(lǐ)SQL命令,我們應當考慮使用(yòng)Statement對象。

  此外,使用(yòng)Statement對象也(yě)使得編寫動态SQL命令更加簡單,因爲我們可(kě)以将字符串連接在一起,建立一個(gè)有(yǒu)效的(de)SQL命令。因此,我認爲,Statement對象可(kě)以使動态SQL命令的(de)創建和(hé)執行(xíng)變得更加簡單。

  4、利用(yòng)helper函數對動态SQL命令進行(xíng)格式化

  在創建使用(yòng)Statement對象執行(xíng)的(de)動态SQL命令時,我們需要處理(lǐ)一些格式化方面的(de)問題。例如(rú),如(rú)果我們想創建一個(gè)将名字O'Reilly插入表中的(de)SQL命令,則必須使用(yòng)二個(gè)相(xiàng)連的(de)“''”号替換O'Reilly中的(de)“'”号。完成這些工(gōng)作的(de)最好的(de)方法是創建一個(gè)完成替換操作的(de)helper方法,然後在連接字符串心服用(yòng)公式表達一個(gè)SQL命令時,使用(yòng)創建的(de)helper方法。與此類似的(de)是,我們可(kě)以讓helper方法接受一個(gè)Date型的(de)值,然後讓它輸出基于Oracle的(de)to_date()函數的(de)字符串表達式。

  5、利用(yòng)PreparedStatement對象提高(gāo)數據庫的(de)總體效率

  在使用(yòng)PreparedStatement對象執行(xíng)SQL命令時,命令被數據庫進行(xíng)解析和(hé)編譯,然後被放(fàng)到(dào)命令緩沖區。然後,每當執行(xíng)同一個(gè)PreparedStatement對象時,它就會(huì)被再解析一次,但(dàn)不會(huì)被再次編譯。在緩沖區中可(kě)以發現預編譯的(de)命令,并且可(kě)以重新使用(yòng)。在有(yǒu)大(dà)量用(yòng)戶的(de)企業(yè)級應用(yòng)軟件(jiàn)中,經常會(huì)重複執行(xíng)相(xiàng)同的(de)SQL命令,使用(yòng)PreparedStatement對象帶來的(de)編譯次數的(de)減少(shǎo)能(néng)夠提高(gāo)數據庫的(de)總體性能(néng)。如(rú)果不是在客戶端創建、預備、執行(xíng)PreparedStatement任務需要的(de)時間長于Statement任務,我會(huì)建議在除動态SQL命令之外的(de)所有(yǒu)情況下使用(yòng)PreparedStatement對象。

  6、在成批處理(lǐ)重複的(de)插入或更新操作中使用(yòng)PreparedStatement對象

  如(rú)果成批地(dì)處理(lǐ)插入和(hé)更新操作,就能(néng)夠顯著(zhe)地(dì)減少(shǎo)它們所需要的(de)時間。Oracle提供的(de)Statement和(hé) CallableStatement并不真正地(dì)支持批處理(lǐ),隻有(yǒu)PreparedStatement對象才真正地(dì)支持批處理(lǐ)。我們可(kě)以使用(yòng)addBatch()和(hé)executeBatch()方法選擇标準的(de)JDBC批處理(lǐ),或者通過利用(yòng)PreparedStatement對象的(de)setExecuteBatch()方法和(hé)标準的(de)executeUpdate()方法選擇速度更快的(de)Oracle專有(yǒu)的(de)方法。要使用(yòng)Oracle專有(yǒu)的(de)批處理(lǐ)機制(zhì),可(kě)以以如(rú)下所示的(de)方式調用(yòng)setExecuteBatch():

  PreparedStatement pstmt3D null;

  try {

  ((OraclePreparedStatement)

  pstmt).setExecuteBatch(30);

  ...

  pstmt.executeUpdate();

  }

  調用(yòng)setExecuteBatch()時指定的(de)值是一個(gè)上(shàng)限,當達到(dào)該值時,就會(huì)自動地(dì)引發SQL命令執行(xíng),标準的(de)executeUpdate()方法就會(huì)被作爲批處理(lǐ)送到(dào)數據庫中。我們可(kě)以通過調用(yòng)PreparedStatement類的(de)sendBatch()方法随時傳輸批處理(lǐ)任務。

  7、使用(yòng)Oracle locator方法插入、更新大(dà)對象(LOB)

  Oracle的(de)PreparedStatement類不完全支持BLOB和(hé)CLOB等大(dà)對象的(de)處理(lǐ),尤其是Thin驅動程序不支持利用(yòng)PreparedStatement對象的(de)setObject()和(hé)setBinaryStream()方法設置BLOB的(de)值,也(yě)不支持利用(yòng)setCharacterStream()方法設置CLOB的(de)值。隻有(yǒu)locator本身中的(de)方法才能(néng)夠從數據庫中獲取LOB類型的(de)值。可(kě)以使用(yòng)PreparedStatement對象插入或更新LOB,但(dàn)需要使用(yòng)locator才能(néng)獲取LOB的(de)值。由于存在這二個(gè)問題,因此,我建議使用(yòng)locator的(de)方法來插入、更新或獲取LOB的(de)值。

  8、使用(yòng)SQL92語法調用(yòng)存儲過程

  在調用(yòng)存儲過程時,我們可(kě)以使用(yòng)SQL92或Oracle PL/SQL,由于使用(yòng)Oracle PL/SQL并沒有(yǒu)什(shén)麽實際的(de)好處,而且會(huì)給以後維護你(nǐ)的(de)應用(yòng)程序的(de)開(kāi)發人(rén)員帶來麻煩,因此,我建議在調用(yòng)存儲過程時使用(yòng)SQL92。

  9、使用(yòng)Object SQL将對象模式轉移到(dào)數據庫中

  既然可(kě)以将Oracle的(de)數據庫作爲一種面向對象的(de)數據庫來使用(yòng),就可(kě)以考慮将應用(yòng)程序中的(de)面向對象模式轉到(dào)數據庫中。目前的(de)方法是創建Java bean作爲僞裝的(de)數據庫對象,将它們的(de)屬性映射到(dào)關系表中,然後在這些bean中添加方法。盡管這樣作在Java中沒有(yǒu)什(shén)麽問題,但(dàn)由于操作都(dōu)是在數據庫之外進行(xíng)的(de),因此其他(tā)訪問數據庫的(de)應用(yòng)軟件(jiàn)無法利用(yòng)對象模式。如(rú)果利用(yòng)Oracle的(de)面向對象的(de)技術(shù),可(kě)以通過創建一個(gè)新的(de)數據庫對象類型在數據庫中模仿其數據和(hé)操作,然後使用(yòng)JPublisher等工(gōng)具生成自己的(de)Java bean類。如(rú)果使用(yòng)這種方式,不但(dàn)Java應用(yòng)程序可(kě)以使用(yòng)應用(yòng)軟件(jiàn)的(de)對象模式,其他(tā)需要共享你(nǐ)的(de)應用(yòng)中的(de)數據和(hé)操作的(de)應用(yòng)軟件(jiàn)也(yě)可(kě)以使用(yòng)應用(yòng)軟件(jiàn)中的(de)對象模式。

  10、利用(yòng)SQL完成數據庫内的(de)操作

  我要向大(dà)家介紹的(de)最重要的(de)經驗是充分(fēn)利用(yòng)SQL的(de)面向集合的(de)方法來解決數據庫處理(lǐ)需求,而不是使用(yòng)Java等過程化的(de)編程語言。

  如(rú)果編程人(rén)員要在一個(gè)表中查找許多行(xíng),結果中的(de)每個(gè)行(xíng)都(dōu)會(huì)查找其他(tā)表中的(de)數據,最後,編程人(rén)員創建了獨立的(de)UPDATE命令來成批地(dì)更新第一個(gè)表中的(de)數據。與此類似的(de)任務可(kě)以通過在set子句中使用(yòng)多列子查詢而在一個(gè)UPDATE命令中完成。當能(néng)夠在單一的(de)SQL命令中完成任務,何必要讓數據在網上(shàng)流來流去的(de)?我建議用(yòng)戶認真學習(xí)如(rú)何最大(dà)限度地(dì)發揮SQL的(de)功能(néng)。

 


深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04

咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号