利用多執行緒(用到原子類AtomicInteger)往資料庫批量插入大量資料
package duocharu; import com.minisay.base.util.OJDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.concurrent.atomic.AtomicInteger; /** * @author xiaobu * @version JDK1.8.0_171 * @date on 2018/10/18 12:23 * @descrption oracle 多個執行緒插入 */ public class MyThread extends Thread { private static AtomicInteger index = new AtomicInteger(0); private static long time1 = 0; public void run() { Connection conn =null; PreparedStatement preparedStatement=null; int i = index.getAndIncrement(); try { conn= OJDBCUtils.getConn(); assert conn != null; conn.setAutoCommit(false); String sql = "INSERT INTO tb_demo1(id) values(?)"; preparedStatement= conn.prepareStatement(sql); int count = 10000000; for (int j = i * count; j < (i + 1) * count; j++) { preparedStatement.setInt(1, j + 1); preparedStatement.addBatch(); if ((j % 50000 == 0 && j != 0) || j == (count - 1)) { preparedStatement.executeBatch(); conn.commit(); preparedStatement.clearBatch(); } } preparedStatement.executeBatch(); preparedStatement.clearBatch(); conn.commit(); preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); }finally { OJDBCUtils.closeStatement(preparedStatement); OJDBCUtils.closeConnection(conn); } System.out.println("當前執行緒:" + Thread.currentThread().getName() + "_" + i + " 耗時:" + (System.currentTimeMillis() - time1) / 1000 + " s"); } public static void main(String[] args) { time1 = System.currentTimeMillis(); System.out.println("當前時間:" + time1); MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); MyThread myThread3 = new MyThread(); MyThread myThread4 = new MyThread(); MyThread myThread5 = new MyThread(); MyThread myThread6 = new MyThread(); MyThread myThread7 = new MyThread(); MyThread myThread8 = new MyThread(); MyThread myThread9 = new MyThread(); MyThread myThread10 = new MyThread(); myThread1.start(); myThread2.start(); // myThread3.start(); // myThread4.start(); // myThread5.start(); // myThread6.start(); // myThread7.start(); // myThread8.start(); // myThread9.start(); // myThread10.start(); } }
經過測試oracle單個執行緒和多個執行緒插入效率差不多,但是mysql就有明顯的差別
相關推薦
利用多執行緒(用到原子類AtomicInteger)往資料庫批量插入大量資料
package duocharu; import com.minisay.base.util.OJDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import
Java多執行緒系列---“JUC原子類”01之 原子類的實現(CAS演算法)
轉自:https://blog.csdn.net/ls5718/article/details/52563959 & https://blog.csdn.net/mmoren/article/details/79185862(含部分修改) 在JDK 5之前Java語言是靠
Java多執行緒系列--“JUC原子類”03之 AtomicLong原子類
轉自:https://www.cnblogs.com/skywang12345/p/3514593.html(含部分修改) 概要 AtomicInteger, AtomicLong和AtomicBoolean這3個基本型別的原子類的原理和用法相似。本章以AtomicLong對基本型別的原子類進行介紹。內容
Java多執行緒系列---“JUC原子類”04之 AtomicLongArray原子類
轉自:https://www.cnblogs.com/skywang12345/p/3514604.html(含部分修改) 概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray這3個數組型別的原子類的原理和用法相似。本章以AtomicLo
Java多執行緒系列---“JUC原子類”05之 AtomicReference原子類
轉自:http://www.cnblogs.com/skywang12345/p/3514623.html(部分修改) 概要 本章對AtomicReference引用型別的原子類進行介紹。內容包括: AtomicReference介紹和函式列表 AtomicReference原始碼分析(基於J
Java多執行緒系列---“JUC原子類”06之 AtomicLongFieldUpdater原子類
轉自:http://www.cnblogs.com/skywang12345/p/3514635.html (含部分修改) 概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater這3個修改類的成員的原
Java多執行緒系列---“JUC原子類”02之 框架
轉自:http://www.cnblogs.com/skywang12345/p/3514589.html 根據修改的資料型別,可以將JUC包中的原子操作類可以分為4類。 1. 基本型別: AtomicInteger, AtomicLong, AtomicBoolean ;2.&
用PHP實現守護程序任務後臺執行與多執行緒(php-resque使用說明)
訊息佇列處理後臺任務帶來的問題 專案中經常會有後臺執行任務的需求,比如傳送郵件時,因為要連線郵件伺服器,往往需要5-10秒甚至更長時間,如果能先給使用者一個成功的提示資訊,然後在後臺慢慢處理髮送郵件的操作,顯然會有更好的使用者體驗。 為了實現類似的需求,We
java多執行緒系列--"JUC"原子類 01 之框架
根據修改的資料型別,可以將JUC包中的原子操作類可以分為4類 1 基本型別:AtomicInteger,AtomicLong,AtomicBoolean; 2 陣列型別:AtomicIntegerArray,AtomicLongArray,AtomicReferenceA
Java多執行緒系列--“JUC原子類”01之 框架
根據修改的資料型別,可以將JUC包中的原子操作類可以分為4類。 基本型別: AtomicInteger,AtomicLong, AtomicBoolean ; 陣列型別: AtomicIntegerArray, AtomicLongArray,Ato
JAVA 多執行緒(生產者和消費者模式)
在生產-消費模式中:通常由兩類執行緒,即若干個生產者的執行緒和若干個消費者的執行緒。生產者執行緒負責提交使用者請求,消費者執行緒則負責具體處理生產者提交的任務,在生產者和消費者之間通過共享記憶體快取區進行通訊。 主要構成: provider:生產者執行緒負責生產資料 consume
再說說單例模式和多執行緒(靜態內部類實現)
靜態內部類: package thread.singleton; public class StaticInnerClassSingleton { private static class Singleton{ private static Singleton si
Java基礎複習一之多執行緒(併發,記憶體模型)
前言:畢業來北京轉眼一年半了,但是沒有太多的成績。沒有太多的記錄和沉澱。現在開始複習一下基礎的知識。涉及到的有多執行緒,集合,JVM,NIO,資料庫,作業系統。後面還是想走實時處理那一塊,可能會有那方面的研究。 多執行緒:為啥用?因為想去執行不同的任務,或利用現狀多核的處
Java多執行緒(二)之Atomic:原子變數與原子類
一、何謂Atomic? Atomic一詞跟原子有點關係,後者曾被人認為是最小物質的單位。計算機中的Atomic是指不能分割成若干部分的意思。如果一段程式碼被認為是Atomic,則表示這段程式碼在
用Winform 利用多執行緒做的一個網站壓力測試小工具(帶原始碼)
我們一直在做網站,但在我河南這塊,對測試工作,特別是壓力測試一般都不怎麼在意,都是自己訪問一下速度不錯就行了,再就是資料庫訪問速度測試也是同樣情況 程式設計師在寫Sql程式碼時,一般是一個人寫完之後,一執行可快完事 其實這些是不夠的,我們根本沒有進行過多使用者多執行緒的測試,如果是100個,一千個要同時訪問,
多執行緒(1):繼承Thread類和實現Runnable介面
多執行緒的兩種實現方法: 1.繼承Thread類 繼承Thread類,重寫run()方法。建立多執行緒的時候,需要建立物件例項,然後呼叫start()方法。類物件的屬性屬於執行緒私有,執行緒之間互不影響。 public class ClassExtendT
java多執行緒(14)ThreadLocal類
ThreadLocal類物件可以為每一個執行緒都建立一個“副本”,使得好像每一個執行緒都“擁有了”ThreadLocal類物件一樣 以下為程式碼示例,具體的講解穿插在程式碼中 class Account2{ private ThreadLocal<
java day25 多執行緒(下) 單例類(Runtime,Timer
25.01_多執行緒(單例設計模式)(掌握) 單例設計模式:保證類在記憶體中只有一個物件。 如何保證類在記憶體中只有一個物件呢? (1)控制類的建立,不讓其他類來建立本類的物件。private (2)在本類中定義一個本類的物件。Singl
Java多執行緒(2)—— 執行緒實現之繼承Thread類
1.1、使用多執行緒 一個程序在執行時至少會有1個執行緒在執行,執行緒會在後臺執行;例如呼叫public static void main() 方法的執行緒就是如此,而且由JVM建立。 package
理解多執行緒(四)--原子量和原子操作
原子量 互斥量可以對於共享變數的訪問進行加鎖,可以保證對臨界區的互斥訪問,但加鎖總是繁瑣的,所以提供了更簡單的共享變數保護訪問的操作,原子量和原子操作。 原子量的構造 原子量包含在#include 中,對於基本型別,我們可以這樣定義原子變數 std::atomic_b