大量数据情况下单线程插入和多线程insert数据库的性能测试

转载 2015年11月18日 10:32:48

大量数据情况下单线程插入和多线程insert数据库的性能测试

 

之前一直没有遇到过大批量数据入库的场景,所以一直没有思考过在大量数据的情况下单线程插入和多线程插入的性能情况。今天在看一个项目源代码的时候发现使用了多线程insert操作。

于是简单的写了一个测试程序来测试一批数据在N个线程下的insert情况。

public class ThreadImport {
    private String url="jdbc:oracle:thin:@localhost:1521:orcl";
    private String user="cmis";
    private String password="cmis";
    public Connection getConnect(){
        Connection con = null;
         try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con=DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
         return con;
    }
    public void multiThreadImport( final int ThreadNum){
        final CountDownLatch cdl= new CountDownLatch(ThreadNum);
        long starttime=System.currentTimeMillis();
        for(int k=1;k<=ThreadNum;k++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Connection con=getConnect();
                    try {
                        Statement st=con.createStatement();
                        for(int i=1;i<=80000/ThreadNum;i++){
                            String uuid=UUID.randomUUID().toString();
                            st.addBatch("insert into demo_table(a,b) values('"+uuid+"','"+uuid+"')");
                            if(i%500==0){
                                st.executeBatch();
                            }
                        }
                        cdl.countDown();
                    } catch (Exception e) {
                    }finally{
                        try {
                            con.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
        try {
            cdl.await();
            long spendtime=System.currentTimeMillis()-starttime;
            System.out.println( ThreadNum+"个线程花费时间:"+spendtime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) throws Exception {
        ThreadImport ti=new ThreadImport();
        ti.multiThreadImport(1);
        ti.multiThreadImport(5);
        ti.multiThreadImport(8);
        ti.multiThreadImport(10);
        ti.multiThreadImport(20);
        ti.multiThreadImport(40);
        System.out.println("笔记本CPU数:"+Runtime.getRuntime().availableProcessors());
    }

}

运行结果:

1个线程花费时间:56707
5个线程花费时间:21688
8个线程花费时间:16625
10个线程花费时间:16098
20个线程花费时间:19882
40个线程花费时间:23536
笔记本CPU数:8

发现在一定数量的线程下性能提升的还是很明显。

在实际的项目中,使用了连接池的情况下,多线程(在一定范围内)数据插入的性能还要明显一点。

单表插入100万条记录的多线程实现

public class InsertRecord implements Runnable{   private int startIndex;   private int endIndex; ...
  • xiaohanshenchu
  • xiaohanshenchu
  • 2014年03月11日 15:28
  • 1601

多线程读取文本并解析插入到数据库

package com.dragonsoft.extract.support; import java.util.concurrent.ExecutorService; import ja...
  • mayy123456
  • mayy123456
  • 2017年09月01日 14:04
  • 268

多线程实现数据库的并发操作

http://www.cnblogs.com/hanfight/p/4701763.html
  • u013322876
  • u013322876
  • 2016年10月11日 22:08
  • 4292

多线程 数据库 插入 实例

  • 2008年01月26日 17:10
  • 2KB
  • 下载

多线程操作数据库

1.      多线程最好不要共用一个连接 以下是来自MSDN的一段话http://msdn.microsoft.com/zh-cn/library/ms131686.aspx “SQL Serve...
  • my12hao
  • my12hao
  • 2015年03月24日 15:14
  • 1954

多线程操作数据库 (CoreData)

1: 主线程修改了数据库的某一条记录,但是子线程没有发生变化,反过来一样的问题。这种情况一般是发生在app有多个NSManagedObjectContext,两个线程分别对其进行了读写操作。 2...
  • jmulxg
  • jmulxg
  • 2012年11月16日 15:30
  • 6817

多线程操作数据库

当多线程对同一数据库进行操作的时候会可能发生冲突。 读读不会冲突,读写,写读等操作应该会引起冲突(其中的写包括update、delete和insert)。 解决冲突的方法: ...
  • minglingji
  • minglingji
  • 2012年04月24日 14:57
  • 484

多线程操作数据库

1.      多线程最好不要共用一个连接 以下是来自MSDN的一段话http://msdn.microsoft.com/zh-cn/library/ms131686.aspx “SQL Server...
  • wanglx2012
  • wanglx2012
  • 2014年02月27日 15:05
  • 2017

多线程操作数据库

1、多线程操作数据库--- FMDatabaseQueue    这个东西固然好用,但是一定要注意:他还是有弊端的,由于里边原理是block  GCD的使用,容易造成死锁,原因为明,继续研究中...
  • denghuihua
  • denghuihua
  • 2014年02月13日 18:51
  • 1882

多线程访问数据库

android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)上面的问题,是因为每次创建SQLit...
  • zhangyongfeiyong
  • zhangyongfeiyong
  • 2016年05月23日 09:47
  • 943
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大量数据情况下单线程插入和多线程insert数据库的性能测试
举报原因:
原因补充:

(最多只允许输入30个字)