国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

J2EE 應用程序中的數據管理和數據持久性

2019-11-18 12:29:01
字體:
來源:轉載
供稿:網友

  本文分析了在 java 平臺上可用的兩個數據治理策略:Java 對象序列化和 Java 數據庫連接(JDBC)。盡管本質上這兩種數據治理策略并不存在孰優孰劣的問題,但在治理企業信息系統時,JDBC 輕而易舉地得以勝出。在本文中,Java 開發人員 G.V.B. Subrahmanyam 和 Shankar Itchapurapu 對序列化和 JDBC都進行了介紹,并通過討論和實例來向您展示了 JDBC 是您的最佳選擇的原因。
  
  當您正在建立企業信息系統時,需要確保以某種有效的方式存儲、檢索和顯示企業數據。對于所有業務而言,數據都是獨一無二的最大資產。所有軟件系統都涉及數據,因此,數據的重要性是無論如何強調都不過分的。
  
  應用程序的數據治理功能包括四個基本操作,通常也需要對企業數據執行這四個操作,它們是:建立、檢索、更新 和 刪除(即 CRUD)。治理在企業系統的數據涉及在很長一段時間范圍之內,始終如一地、成功地執行 CRUD 操作,而不必頻繁地更改實際執行這些操作的代碼。換句話說,治理數據意味著開發穩健的、可擴展和可維護的軟件系統,以確保成功地進行 CRUD 操作,在軟件的生命期中能夠以一致的方式執行操作。
  
  本文討論了 J2EE 中的兩種可用數據治理策略:Java 對象序列化和 Java 數據庫連接(JDBC)。我們將查看這兩種方法的優缺點。這兩種數據治理策略實質上不存在孰優孰劣。在特定實現中,策略的可用性取決于項目的范圍(出現在系統環境中的活動的活動范圍),系統的上下文(驅動系統/子系統運行時的值的集合),以及其他的外部因素。然而,Java 序列化并不適合于企業系統,其數據需要用一種定義良好的結構(如RDBMS)來組織。我們首先將快速瀏覽 Java 對象序列化,然后查看 JDBC 更重要的一些方面,從而了解后者是如何實現前者所缺乏的一些要害特性的。
  
  本文并不打算對 Java 對象序列化或者 JDBC 進行全面介紹。有關這兩項技術的更多信息,請回顧參考資料小節。
  
  Java 對象序列化
  對象序列化是最簡單的 Java 持久性策略。對象序列化是一個將對象圖平面化為一個字節的線性序列的過程。對象圖是作為對象繼續、關聯和聚合的結果而實現的一些關系式。對象的非暫態實例屬性以字節的形式被寫入到持久存儲中。實例屬性的值就是執行時間序列化時內存中的值。假如一個 Java 對象是可序列化的,那么它至少必須實現 java.io.Serializable 接口,該接口具有如下所示的結構:
  
  package java.io;
  public interface Serializable
  {}
  
  您可以看到,java.io.Serializable 接口并沒有聲明任何方法。它是一個記號或者標記接口。它告訴 Java 運行時環境,該實現類是可序列化的。列表 1 顯示實現該接口的一個示例類。
  
  列表 1. MySerializableObject.java
  
  import java.io.Serializable;
  
  public class MySerializableObject extends MySuperClass implements Serializable
  {
   PRivate String property1 = null;
  private String property2 = null;
  
  public String getProperty1()
  {
   return property1;
  }
  
  public void setProperty1(String val)
  {
   property1 = val;
  }
  public String getProperty2()
  {
   return property2;
  }
  
  public void setProperty2(String val)
  {
   property2 = val;
  }
   private void writeObject(ObjectOutputStream out)
   throws IOException
   {
    out.writeObject (getProperty1 ());
   out.writeObject (getProperty2 ());
   }
  
   private void readObject (ObjectInputStream in)
   throws IOException, ClassNotFoundException
   {
    setProperty1 ((String) in.readObject ());
    setProperty2 ((String) in.readObject ());
   }
  }
  
  無需自己實現 writeObject(...) 和 readObject(...) 方法來執行序列化;Java 運行時環境具有使這些方法可用的默認實現。然而,您可以重寫這些方法,提供如何存儲對象狀態的您自己的實現。
  
  關于序列化,您需要記住一些要點。首先,在序列化期間,整個對象圖(即,所有父類和被引用類)都將被序列化。其次, Serializable 類的所有實例變量自身都應該是可序列化的,除非已經非凡聲明它們為暫態,或者已經重寫 writeObject(...) 和 readObject(...) 來只序列化那些可序列化的實例變量。假如違反了后一規則,在運行時將出現一個異常。
  
  每個后續 J2SE 版本都對對象序列化系統進行少量的增加。J2SE 1.4 也相應地向 ObjectOutputStream and ObjectInputStream 增加 writeUnshared() and readUnshared()方法。通常,一個序列化的流只包含任何給定對象的一個序列化實例,并且共享對該對象引用的其他對象可以對它進行后向引用。通常期望序列化一個對象獨立于其他對象可能維護的任何引用。非共享的讀寫方法答應對象作為新的、獨一無二的對象被序列化,從而獲得一個類似于對象克隆但開銷更少的效果。
  
  Java 對象序列化存在的問題
  序列化涉及到將對象圖從內存具體化到持久存儲(例如硬盤)中。這涉及到大量 I/O 開銷。通常,對應用程序而言,序列化并不是最佳選擇:
  
  治理幾十萬兆字節的存儲數據
  頻繁地更新可序列化對象
  對存儲企業數據而言,序列化是一個錯誤選擇,因為:
  
  序列化的字節流只對 Java 語言是可讀的。這是一個重大缺陷,因為企業系統通常是異構的,許多應用程序要與其他應用程序共同處理相同的數據。
  
  對象檢索涉及大量的 I/O 開銷。
  
  沒有一個用來從序列化對象圖中檢索獲取數據的查詢語言。
  
  序列化沒有內置的安全機制。
  
  序列化本身并不提供任何事務控制機制,因此不能在那些需要并發訪問從而不使用輔助 API 的應用程序中使用它。
  Java 數據庫連接(JDBC)
  Java 數據庫連接(JDBC)是一個標準的 API,它使用 Java 編程語言與數據庫進行交互。諸如 JDBC 的調用級接口是編程接口,它們答應從外部訪問 SQL 命令來處理和更新數據庫中的數據。通過提供與數據庫連接的庫例程,它們答應將 SQL 調用集成到通用的編程環境中。非凡是,JDBC 有一個使接口變得極其簡單和直觀的例程的豐富收集。
  
  在下面幾個小節中,我們將查看通過 JDBC 與數據庫連接所涉及的一些步驟。我們將非凡關注與 Java 對象序列化相比,JDBC 是如何成為一個企業數據治理策略的。
  
  建立一個數據庫連接
  在利用 JDBC 做任何其他事情之前,需要從驅動程序供給商那里獲取數據庫驅動程序,并且將該庫添加到類路徑中。一旦完這項工作,就可以在 Java 程序中使用類似于下面所示的代碼來實現實際的連接。
  
  Class.forName(<your driver class Name>);
  Java.sql.Connection conn = DriverManager.getConnection(<connection URL>);
  
  Java 對象序列化并不需要這個該步驟,因為使用序列化來執行持久性操作并不需要 DBMS。 序列化是一個基于文件的機制;因此,在序列化一個對象之前,需要在目標文件系統中打開一個 I/O 流。
  
  創建 JDBC Statement 和 PreparedStatement
  可以用 JDBC Statement 對象將 SQL 語句發送到數據庫治理系統(DBMS),并且不應該將該對象與 SQL 語句混淆。 JDBC Statement 對象是與打開連接有關聯,而不是與任何單獨的 SQL 語句有關聯。可以將 JDBC Statement 對象看作是位于連接上的一個通道,將一個或多個(您請求執行的)SQL 語句傳送給 DBMS。
  
  為了創建 Statement 對象,您需要一個活動的連接。通過使用我們前面所創建的 Connection 對象 con——下面的代碼來完成這項工作。
  
  Statement stmt = con.createStatement();
  
  到目前為止,我們已經有了一個 Statement 對象,但是還沒有將對象傳遞到 DBMS 的 SQL 語句。
  
  當數據庫接收到語句時,數據庫引擎首先會分析該語句并查找句法錯誤。一旦完成對語句的分析,數據庫就必須計算出執行它的最有效方法。在計算上,這可能非常昂貴。數據庫會檢查哪些索引可以提供幫助,假如存在這樣的索引的話,或者檢查是否應該完全讀取表中的所有行。數據庫針對數據進行統計,找出最佳的執行方式。一旦創建好查詢計劃,數據庫引擎就可以執行它。
  
  生成這樣一個計劃會占用 CPU 資源。理想情況是,假如我們兩次發送相同的語句到數據庫,那么我們希望數據庫重用第一個語句的訪問計劃,我們可以使用 PreparedStatement 對象來獲得這種效果。
  
  這里有一個主要的特性是,將 PreparedStatement 與其超類 Statement 區別開來:與 Statement 不同,在創建 PreparedStatement 時,會提供一個 SQL 語句。然后了立即將它發送給 DBMS,在那里編譯該語句。因而, PreparedStatement 實際上是作為一 個通道與連接和被編譯的 SQL 語句相關聯的。
  
  那么,它的優勢是什么呢?假如需要多次使用相同的查詢或者不同參數的類似查詢,那么利用 PreparedStatement,語句,只需被 DBMS 編譯和優化一次即可。與使用正常的 Statement 相比,每次使用相同的 SQL 語句都需要重新編譯一次。
  
  還可以通過 Connection 方法創建PreparedStatement 。下面代碼顯示了如何創建一個帶有三個輸入參數的參數化了的 SQL 語句。
  
  Prepa

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳泉市| 文山县| 自治县| 上饶县| 谢通门县| 温州市| 麦盖提县| 磐石市| 苍山县| 名山县| 扎兰屯市| 武陟县| 泗水县| 仁化县| 会昌县| 交口县| 湄潭县| 镇平县| 建水县| 长岭县| 宜君县| 侯马市| 临城县| 五莲县| 柳江县| 仁寿县| 夏河县| 都匀市| 原阳县| 康平县| 稷山县| 辽阳县| 志丹县| 苍南县| 涪陵区| 西吉县| 深州市| 阿合奇县| 桓台县| 翁牛特旗| 吉林省|