1. 程式人生 > >JDBC各種插入資料的速度對比

JDBC各種插入資料的速度對比

對於需要批量插入資料庫操作JDBC有多重方式,本利從三個角度對Statement和PreparedStatement兩種執行方式進行分析,總結較優的方案。

當前實現由如下條件:

  執行資料庫:Mysql

執行資料數量:10萬條

執行前提:執行差入資料庫錢均需要提供空表,防止資料量大造成的影響

執行方式:Statement和PreparedStatement兩種方式

執行步驟開始:

1、建立表

複製程式碼
1 CREATE TABLE T_PRODUCT (
2   ID bigint(12) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
3   NAME varchar(60) NOT NULL COMMENT '產品名稱',
4 WEIGHT varchar(60) NOT NULL COMMENT '產品重量', 5 MARK varchar(60) NOT NULL COMMENT '產品說明', 6 PRIMARY KEY (ID) 7 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='產品表';
複製程式碼

2、編寫操作資料庫工具類

複製程式碼
  1 package com.luwei.test.jdbc;
  2 
  3 import java.sql.Connection;
  4 import java.sql.DriverManager;
5 import java.sql.SQLException; 6 import java.sql.Statement; 7 import java.util.ResourceBundle; 8 9 /** 10 * <Description> TODO<br> 11 * 12 * @author lu.wei<br> 13 * @email [email protected] <br> 14 * @date 2017年1月9日 <br> 15 * @since V1.0<br>
16 * @see com.luwei.test.jdbc <br> 17 */ 18 public class JdbcTemplate { 19 private static String DRIVER_CLASS_NAME = null; 20 private static String URL = null; 21 private static String USERNAME = null; 22 private static String PASSWORD = null; 23 24 static { 25 ResourceBundle bundle = ResourceBundle.getBundle("jdbc"); 26 DRIVER_CLASS_NAME = bundle.getString("jdbc.driverClassName"); 27 URL = bundle.getString("jdbc.url"); 28 USERNAME = bundle.getString("jdbc.username"); 29 PASSWORD = bundle.getString("jdbc.password"); 30 } 31 32 /** 33 * 34 * <Description> 獲取資料庫連線<br> 35 * 36 * @author lu.wei<br> 37 * @email [email protected] <br> 38 * @date 2017年1月9日 下午10:19:41 <br> 39 * @return 40 * @throws Exception 41 * <br> 42 */ 43 public static Connection getConnection() throws Exception { 44 Class.forName(DRIVER_CLASS_NAME); 45 Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 46 return connection; 47 } 48 49 /** 50 * 51 * <Description> 提交事務<br> 52 * 53 * @author lu.wei<br> 54 * @email [email protected] <br> 55 * @date 2017年1月9日 下午10:20:48 <br> 56 * @param connection 57 * <br> 58 */ 59 public static void commit(Connection connection) { 60 try { 61 connection.commit(); 62 } 63 catch (SQLException e) { 64 e.printStackTrace(); 65 } 66 } 67 68 /** 69 * 70 * <Description> 開啟事務<br> 71 * 72 * @author lu.wei<br> 73 * @email [email protected] <br> 74 * @date 2017年1月9日 下午10:23:56 <br> 75 * @param connection 76 * <br> 77 */ 78 public static void beginTx(Connection connection) { 79 try { 80 connection.setAutoCommit(false); 81 } 82 catch (SQLException e) { 83 e.printStackTrace(); 84 } 85 } 86 87 /** 88 * 89 * <Description> 回滾<br> 90 * 91 * @author lu.wei<br> 92 * @email [email protected] <br> 93 * @date 2017年1月9日 下午10:24:33 <br> 94 * @param connection 95 * <br> 96 */ 97 public static void rollback(Connection connection) { 98 try { 99 connection.rollback(); 100 } 101 catch (SQLException e) { 102 e.printStackTrace(); 103 } 104 } 105 106 /** 107 * 108 * <Description> TODO<br> 109 * 110 * @author lu.wei<br> 111 * @email [email protected] <br> 112 * @date 2017年1月9日 下午10:28:49 <br> 113 * @param statement 114 * @param connection 115 * <br> 116 */ 117 public static void releaseDb(Statement statement, Connection connection) { 118 try { 119 statement.close(); 120 connection.close(); 121 } 122 catch (SQLException e) { 123 e.printStackTrace(); 124 } 125 } 126 }
複製程式碼

3、執行資料庫插入操作

3.1、使用Statement直接插入,三次執行耗時:41979 42608 42490

複製程式碼
 1 @Test
 2 public void testStatement() {
 3     Connection connection = null;
 4     Statement statement = null;
 5     try {
 6         connection = JdbcTemplate.getConnection();
 7         JdbcTemplate.beginTx(connection);
 8 
 9         statement = connection.createStatement();
10         long begin = System.currentTimeMillis();
11         for (int i = 0; i < 100000; i++) {
12             String sql = "insert into t_product values(null,'name_" + i + "','120kg','mark_" + i + "')";
13             statement.execute(sql);
14         }
15         long end = System.currentTimeMillis();
16         System.out.println(end - begin);
17         JdbcTemplate.commit(connection);
18     }
19     catch (Exception e) {
20         e.printStackTrace();
21         JdbcTemplate.rollback(connection);
22     }
23     finally {
24         JdbcTemplate.releaseDb(statement, connection);
25     }
26 }
複製程式碼

3.2、使用PreparedStatement直接插入,三次執行耗時:22808 24675 22281

複製程式碼
 1 @Test
 2 public void testPreparedStatement() {
 3     Connection connection = null;
 4     PreparedStatement statement = null;
 5     try {
 6         connection = JdbcTemplate.getConnection();
 7         JdbcTemplate.beginTx(connection);
 8         String sql = "insert into t_product values(null,?,?,?)";
 9 
10         statement = connection.prepareStatement(sql);
11         long begin = System.currentTimeMillis();
12         for (int i = 0; i < 100000; i++) {
13             statement.setString(1, "name_" + i);
14             statement.setString(2, "120kg");
15             statement.setString(3, "mark_" + i);
16             statement.executeUpdate();
17         }
18         long end = System.currentTimeMillis();
19         System.out.println(end - begin);
20         JdbcTemplate.commit(connection);
21     }
22     catch (Exception e) {
23         e.printStackTrace();
24         JdbcTemplate.rollback(connection);
25     }
26     finally {
27         JdbcTemplate.releaseDb(statement, connection);
28     }
29 }
複製程式碼

3.3、使用BatchStatement直接插入,三次執行耗時:15342 15235 15485

複製程式碼
 1 @Test
 2 public void testBatchStatement() {
 3     Connection connection = null;
 4     Statement statement = null;
 5     try {
 6         connection = JdbcTemplate.getConnection();
 7         JdbcTemplate.beginTx(connection);
 8 
 9         statement = connection.createStatement();
10         long begin = System.currentTimeMillis();
11         for (int i = 0; i < 100000; i++) {
12             String sql = "insert into t_product values(null,'name_" + i + "','120kg','mark_" + i + "')";
13             statement.addBatch(sql);
14 
15             if ((i + 1) % 100 == 0) {
16                 statement.executeBatch();
17                 statement.clearBatch();
18             }
19         }
20         statement.executeBatch();
21         statement.clearBatch();
22         long end = System.currentTimeMillis();
23         System.out.println(end - begin);
24         JdbcTemplate.commit(connection);
25     }
26     catch (Exception e) {
27         e.printStackTrace();
28         JdbcTemplate.rollback(connection);
29     }
30     finally {
31         JdbcTemplate.releaseDb(statement, connection);
32     }
33 }
複製程式碼

3.4、使用BatchPreparedStatement直接插入,三次執行耗時:21913 22045 23291

複製程式碼
 1 @Test
 2 public void testBatchPreparedStatement() {
 3     Connection connection = null;
 4     PreparedStatement statement = null;
 5     try {
 6         connection = JdbcTemplate.getConnection();
 7         JdbcTemplate.beginTx(connection);
 8         String sql = "insert into t_product values(null,?,?,?)";
 9 
10         statement = connection.prepareStatement(sql);
11         long begin = System.currentTimeMillis();
12         for (int i = 0; i < 100000; i++) {
13             statement.setString(1, "name_" + i);
14             statement.setString(2, "120kg");
15             statement.setString(3, "mark_" + i);
16             statement.addBatch();
17             if ((i + 1) % 100 == 0) {
18                 statement.executeBatch();
19                 statement.clearBatch();
20             }
21         }
22         statement.executeBatch();
23         statement.clearBatch();
24         long end = System.currentTimeMillis();
25         System.out.println(end - begin);
26         JdbcTemplate.commit(connection);
27     }
28     catch (Exception e) {
29         e.printStackTrace();
30         JdbcTemplate.rollback(connection);
31     }
32     finally {
33         JdbcTemplate.releaseDb(statement, connection);
34     }
35 }
複製程式碼

3.5、使用採用多Value值Statement直接插入,三次執行耗時:2931 3007 3203 2964

複製程式碼
 1 @Test
 2 public void testMutilValueStatement() {
 3     Connection connection = null;
 4     Statement statement = null;
 5     try {
 6         connection = JdbcTemplate.getConnection();
 7         JdbcTemplate.beginTx(connection);
 8 
 9         statement = connection.createStatement();
10 
11         StringBuffer sql = new StringBuffer("insert into t_product values");
12         long begin = System.currentTimeMillis();
13         for (int i = 0; i < 100000; i++) {
14             if (i != 0) {
15                 sql.append(",");
16             }
17             sql.append("(null,'name_" + i + "','120kg','mark_" + i + "')");
18         }
19         statement.execute(sql.toString());
20         long end = System.currentTimeMillis();
21         System.out.println(end - begin);
22         JdbcTemplate.commit(connection);
23     }
24     catch (Exception e) {
25         e.printStackTrace();
26         JdbcTemplate.rollback(connection);
27     }
28     finally {
29         JdbcTemplate.releaseDb(statement, connection);
30     }
31 }
複製程式碼

3.6、使用採用多Value值PreparedStatement直接插入,三次執行耗時:3356 3218 3233

複製程式碼
 1 @Test
 2 public void testMutilValuePreparedStatement() {
 3     Connection connection = null;
 4     PreparedStatement statement = null;
 5     try {
 6         connection = JdbcTemplate.getConnection();
 7         JdbcTemplate.beginTx(connection);
 8 
 9         StringBuffer sql = new StringBuffer("insert into t_product values");
10         long begin = System.currentTimeMillis();
11         for (
            
           

相關推薦

JDBC各種插入資料速度對比

對於需要批量插入資料庫操作JDBC有多重方式,本利從三個角度對Statement和PreparedStatement兩種執行方式進行分析,總結較優的方案。 當前實現由如下條件:   執行資料庫:Mysql 執行資料數量:10萬條 執行前提:執行差入資料庫錢均需要提

Java之JDBC批量插入資料

普通插入方式 10萬條資料,耗時13秒。。。 private String url = "jdbc:mysql://localhost:3306/test01"; private String user = "root"; private String password

EF批量插入資料耗時對比

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF批量插入 { class Progra

LinkedList和ArrayList在尾部插入資料效率對比

做這個實驗之前,我的猜想的是:因為每次都是在尾部插入資料,而LinkedLiist裡面有一個last指標一直指向最後一個元素,而ArrayList則根據索引來找到最後一個元素,那麼,這兩個方式中,效率應該是差不多的; 但是實驗結果卻不是這樣的; 先看程式碼: packa

用原始的jdbc批量插入資料

原始的jdbc批量插入資料的方法 @Service("importDao") @Transactional //使用jdbc進行批

JDBC插入資料後返回新資料id

使用jdbc向表中插入資料時,有時候需要返回新插入資料的id。比如現在要向兩個表中分別插入一條資料,第一條資料插入後生成的id要作為第二條資料的一個欄位值。 具體程式碼: PreparedStatement pstmt = null; ResultSet rs =

JDBC插入,刪除,修改資料庫中的資料

    public static void add()     {         String sql = "insert into users values(?,?,?,?,?,?)";         try         {             preparedStatement = conn

使用JDBC向SqlServer資料庫中插入資料

在實際的開發的當中 我們會發現在資料庫中插入資料是比查詢資料難的 因為查詢只需要一個固定的值就可以進行查詢 但是插入的話需要對照資料庫的建表 因為有些鍵值不允許為空 示例程式碼: package sqlserver.controller; im

使用JDBC在MySQL資料庫中快速批量插入資料

使用JDBC連線MySQL資料庫進行資料插入的時候,特別是大批量資料連續插入(10W+),如何提高效率呢? 在JDBC程式設計介面中Statement 有兩個方法特別值得注意: void addBatch() throws SQLException Adds a set

JDBC插入資料,更新資料,使用NamedParameterJdbcTemplate物件直接操作javaBean

原來如此簡單: DButil: public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() { if (nam == null) {             synchronized(DBU

java利用jdbc連線資料庫之插入資料

java通過JDBC連線資料庫 具體功能: 使用PreparedStatement介面中的executeUpdate()方法向資料庫中插入一條資料 前提: 具有一個數據庫和一個列表(列表和資料庫長啥樣後面會說) 1:建立java project

如何利用jdbc快速插入百萬條資料

當須要向資料庫插入百萬條資料時,利用hibernate,mybatis等持久層框架時耗時較久,此時使用jdbc插入效率會更高。此種場景特別適用於讀取檔案匯入到資料庫。可以利用批處理來加快jdbc的插入效率。String sql = "insert into person(id

JDBC使用佔位符插入資料報錯MySQLSyntaxErrorException: You have an error.....syntax to use near '?,?)'

JDBC使用佔位符插入資料報錯:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that correspo

各種加密演算法的速度對比

cpu: Intel Core i7-4712MQ CPU 2.3GHz  memory:8GB os:win7 64 命令: cryptotest bAlgorithm MiB/Second Microseconds to Setup Key and IV AES/GCM

海量資料插入資料庫效率對比測試 ---ADO.NET下SqlBulkCopy()對比LINQ 下InsertAllOnSubmit()

摘要:使用.NET相關技術向資料庫中插入海量資料是常用操作。本文對比ADO.NET和LINQ兩種技術,分別使用SqlBulkCopy()和InsertAllOnSubmit()方法進行操作。得出結論:相同插入工作量(1w條資料)插入效率相差200倍之巨! 測試場景: 準備

jdbc批量插入幾百萬資料怎麼實現?

網上搜到這樣的一篇部落格,我覺得講的不錯,分享給大家:今天在做一個將excel資料匯入資料庫的程式時,由於資料量大,準備採用jdbc的批量插入。於是用了preparedStatement.addBatch();當加入1w條資料時,再執行插入操作,preparedStateme

JDBC操作Vertica資料庫,用PreparedStatements物件實現批量插入資料

import java.sql.*; import java.util.Properties; public class BatchInsertExample { public static void main(String[] args) {          

select * 和 select 所有字段寫出來 ,速度對比

bsp 第一次 blog 師說 sel lec 意見 -1 tab 從很早時候,聽老師說 select * from table 比 select a,b,c,d from table 要慢很多。3年來從未測試。 今天沒事測一測, 不測不知道,一測嚇一跳。 當然 以下純

解決拿蛋問題的時候,通過幾個shell腳本運算速度對比,體會了算法和編程優化的重要性

拿蛋問題 shell腳本運算速度對比 算法和編程優化 前幾天,一位同學在群裏提出一個拿蛋的問題,原題如下:有一筐雞蛋,1個1個拿,正好拿完2個2個拿,正好拿完3個3個拿,正好拿完4個4個拿,剩下2個5個5個拿,剩下4個6個6個拿,正好拿完7個7個拿,剩下5個8個8個拿,剩下2個9個9個拿,正好拿完

35 JDBC批量插入數據二

獲取 else ++ star bsp pri conn nal cat package MYSQK; import java.sql.*; /** * PreparedStatement 對象可以對sql語句進行預編譯,預編譯的信息會存在存儲該對象中,當相同的sql