|
描述 |
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裡指定多個伺服器及切換參數配置 |