關於oracle與mysql官方jdbc的一些區別

來源:互聯網
上載者:User

關於oracle與mysql官方jdbc的一些區別

 

 

描述

mysql

oracle

jdbc驅動

 

驅動:
http://dev.mysql.com/downloads/connector/j/

驅動類型:TYPE4

最新版都聲稱支援JDBC4.0

標準驅動註冊名稱:com.mysql.jdbc.Driver

用於主從讀寫分離驅動註冊名稱:com.mysql.jdbc.ReplicationDriver

驅動:

http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

驅動類型:TYPE2(oci),TYPE4(thin)
最新版都聲稱支援JDBC4.0

標準驅動註冊名稱:
oracle.jdbc.OracleDriver

oracle.jdbc.driver.OracleDriver

jdbc url

 

標準驅動URL如下:
jdbc:mysql://host:port/dbname

ReplicationDriver的URL如下:

jdbc:mysql:replication://master,slave1,slave2/dbname

oci模式:需要用戶端安裝oracle的用戶端,並且使用的jdbc驅動最好和用戶端安裝的版本相同,URL格式如下:
jdbc:oracle:oci:@tnsname

jdbc:oracle:oci:@host:port:sid

thin模式:不需要安裝oracle的用戶端,URL格式如下:jdbc:oracle:thin:@host:port:sid

串連屬性

 

可以在jdbc url中直接像http url一樣用索引值對指定串連屬性,例如:

jdbc:mysql://127.0.0.1:3306/test?user=root&password=1234

只能通過properties配置屬性

串連指定字元集

 

預設為伺服器端字元編碼,可以在串連中通過屬性 characterEncoding強制指定字元編碼

不支援指定資料庫字元集,預設為伺服器端字元編碼;
jdbc 的資料編碼與本地NLS_LANG環境變數無關;
對於一些如US7ASCII這種非國際化字元的資料庫編碼,存取中文需要做轉碼處理;
如果資料編碼與資料庫不同也需要做轉碼處理;
使用NVARCHAR2這種國際化欄位類型不需要轉碼處理

batch

批量處理DML操作,一般用於減少網路傳輸,有可能效能提升10倍以上。

支援,會返回每條SQL實際影響的行數,

mysql的batch預設只是文法支援,並不提高效能,需要在串連屬性中指定rewriteBatchedStatements=true才能達到batch真真的效果:
insert into values(...)將轉換為insert into values(...),(...),...的SQL執行,
update 和delete將轉換為一個多條語句的SQL發送到伺服器執行,期間會臨時設定allowMultiQueries=true

支援,不支援返回影響行數,
老版本的驅動當一個batch很大時有資料丟失的BUG

用戶端資料接收方式

 

預設為從伺服器一次取出所有資料放在用戶端記憶體中,fetch size參數不起作用,當一條SQL返回資料量較大時可能會出現JVM OOM。

要一條SQL從伺服器讀取大量資料,不發生JVM OOM,可以採用以下方法之一:

1、當statement設定以下屬性時,採用的是流資料接收方式,每次只從伺服器接收部份資料,直到所有資料處理完畢,不會發生JVM OOM。

          setResultSetType(ResultSet.TYPE_FORWARD_ONLY);

          setFetchSize(Integer.MIN_VALUE); 

 

2、調用statement的enableStreamingResults方法,實際上enableStreamingResults方法內部封裝的就是第1種方式。

3、設定串連屬性useCursorFetch=true (5.0版驅動開始支援),statement以TYPE_FORWARD_ONLY開啟,再設定fetch
size參數,表示採用伺服器端遊標,每次從伺服器取fetch_size條資料。

支援,預設為從伺服器一次取出fetch size 條記錄放在用戶端,用戶端處理完成一個批次後再向伺服器取下一個批次,直到所有資料處理完成,當需要處理大量資料時,ResultSetType應設定為TYPE_FORWARD_ONLY,否則可能會出現JVM
OOM。 

PreparedStatement

預先處理SQL

支援
主要用於防SQL注入,目前版本對效能沒有提升,詳細說明見

http://blog.csdn.net/yzsind/article/details/7266281

支援
非常重要,不僅可防止SQL注入,還會大大送減少伺服器CPU開銷,提高效能

SQL執行逾時設定

 

可通過PreparedStatement.setQueryTimeout(value)設定每條SQL的執行逾時時間(5.0)

通過串連屬性socketTimeout設定所有SQL的逾時時間

可通過PreparedStatement.setQueryTimeout(value)設定每條SQL的執行逾時時間

通過串連屬性oracle.jdbc.ReadTimeout設定所有SQL的逾時時間

一次執行多條SQL

 

通過參數allowMultiQueries控制,預設不允許,當多條SQL時會返回多個結果集,可以用jdbc的getMoreResults方法處理,例:

stmt.executeQuery("select * from t1;select * from t2");
ResultSet rs1=stmt.getResultSet();
while (rs1.next()) {
   ...
}
if (stmt.getMoreResults()) {

  ResultSet rs2=stmt.getResultSet();

  while (rs2.next()) {

    ...
  }

}

不支援

負載平衡與故障切換

 

通過loadbalance相關的串連參數實現負載平衡(5.1)
使用ReplicationDriver實現讀寫分離,通過connection.setReadOnly實現master和slave請求自動處理,例如:

Class.forName("com.mysql.jdbc.ReplicationDriver").newInstance();
Connection conn = DriverManager.getConnection(      "jdbc:mysql:replication://127.0.0.1,10.20.36.20/test",
          "yzs", "yzs");
conn.setReadOnly(true);
...//操作主庫
conn.setReadOnly(false);
...//操作從庫
conn.setReadOnly(true);
...//操作主庫

詳見:
http://dev.mysql.com/doc/refman/5.6/en/connector-j-reference-replication-connection.html

通過在串連url裡指定多個伺服器及切換參數配置

 

 轉載自:http://blog.csdn.net/yzsind/article/details/7853029 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.