再談ADO .NET vs JDBC

來源:互聯網
上載者:User

曾經在.NET下有過大約三年的開發經曆,可以說非常熟悉ADO .NET。ADO .NET最大的特性是對中斷連線方式的全方位支援,其引入了DataSet、DataTable、DataRow等等對象,構建了一個“記憶體資料庫”簡化版本,DataAdapter把DataReader的資料填充到DataTable或者DataSet中,給使用者一個直觀的使用方式。ADO .NET還能夠和ASP .NET和Windows Form的控制項進行資料邦定,使得編寫一些小程式很簡單。

剛開始轉向Java平台進行開發時,發現JDBC沒有這些特性,一下子沒習慣過來,覺得JDBC很難用,一些習慣於ADO .NET的同事,還打算自行開發一套類似DataSet、DataTable的咚咚。

在Java平台下開發應用,已經一年多了,這一年中,對JDBC的看法慢慢有了一些變化,也同時反過來思考ADO .NET,發現了JDBC的很多優點,也發現了ADO .NET的一些缺陷。今天我粗略閱讀了一遍JDBC 3.0的規範後,把一些想法整理如下:

1、ADO .NET最大的優點是對中斷連線訪問資料庫方式的強有力支援。相比起來,JDBC也引入類似的功能,RowSet,但是比起ADO .NET來,還是不夠。
2、ADO .NET功能不完整。MS對這一點也是承認的,承認ADO .NET不能替代ADO。其中一個很重要的功能是分頁訪問資料的支援。以前在開發ADO .NET程式時,還專門編寫一個程式,調用ADO,分頁擷取資料。
3、ADO .NET的一些介面設計不恰當:
      a、對介面編程支援不好。特別在.NET Framework 1.0中,問題特別嚴重。例如你想基於介面編程,編寫如下的代碼:

IDbConnection conn = ; //無法只通過URL擷取相應的Connection實現,需要自行編寫工具類。
IDbCommand command = conn.CreateCommand();
IDataAdapter dataAdapter = ; //這個又如何構建呢? 

      在.NET Framework 2.0中,情況有所改善,可以這樣寫:

DbProviderFactory provider = DbProviderFactories.GetFactory ("");
IDbConnection connection = provider.CreateConnection ();
IDataAdapter adapter = provider.CreateDataAdapter ();

      
      在.NET Framework 1.x中,ADO .NET肯定沒有認真考慮基於介面編程,而JDBC最初設計時,就是完全基於介面編程。.NET Framework 2.0中,Microsoft意識了其這個短視的行為,增加了DbProiderFactory的介面,但是我覺得還是不如JDBC作得好。
      在JDBC中,你可以這樣寫:

String url = "jdbc:mysql://127.0.0.1/mysql";
String userName = "sa";
String password = "";
Connection conn = DriverManager.getConnection(url, userName, password);

 JDBC中,與ADO的ConnectionString是URL,JDBC Driver的URL格式為:
    jdbc:<subprotocol>:<subname>
    
    不同的Driver實現,認識不同的subprotocol。你可以在動態裝載一個Driver,例如:

DriverManager.registerDriver(new MyDriver());

    而不同的Driver通過實現acceptsURL來識別自己的subprotocol。例如一個Driver的實現:

 public boolean acceptsURL(String url) throws SQLException {
  if (url != null && url.startsWith("jdbc:ksql:")) {
   return true;
  }

  return false;
 }

 3、JDBC的資料來源的擷取方式多樣:
  a、直接通過DriverManager.getConnection獲得串連
  b、通過應用伺服器的資料來源獲得串連。例如:

  // Get the initial JNDI naming context
  Context ctx = new InitialContext();
  // Get the DataSource object associated with the logical name
  // "jdbc/AcmeDB" and use it to obtain a database connection
  DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");
  Connection con = ds.getConnection("user", "pwd");

 .NET中,沒有類似的咚咚。
 
 4、ADO .NET不包括分散式交易的介面,ADO .NET的分散式交易是通過MS DTC統一管理的。JDBC本身就提供了對分散式交易支援的介面,不同的JDBC Driver實現了這一個介面,就支援分散式交易了。
 
 5、ADO .NET中,不同的ADO .NET Provider的參數格式不一樣的。OleDb和Odbc都是使用匿名參數,SqlClient使用“@”開頭的具名引數,OracleCLient使用“:”開頭的具名引數。這明顯讓人無法基於介面編程嘛,以前使用ADO .NET時,為了基於介面編程,必須自己編寫一大堆工具類,很討厭!
 6、JDBC的一些類層級結構不合理。其中一個明顯的就是Statement、PreparedStatement、CallableStatement繼承關係不合理。ADO .NET沒有此問題
 7、JDBC中,參數計數是從1開始的,最初使用者容易犯錯。ADO .NET沒有此問題 
JDBC是一個規範,是一個標準,而ADO .NET只是微軟的私家類庫。.NET Framework目前成為標準的類庫還只有一小部分,.NET走向開放的道路的路途漫漫啊!MONO的ADO .NET實現,不知道是否對Microsoft構成了侵權行為?
 總結
 a、JDBC開放,架構設計良好,但在一些細節地方有些小瑕疵。
 b、ADO .NET易用性好,對中斷連線式的資料訪問支援很好,但整體設計和開放性稍差。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.