打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
大量数据情况下单线程插入和多线程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个线程花费时间:567075个线程花费时间:216888个线程花费时间:1662510个线程花费时间:1609820个线程花费时间:1988240个线程花费时间:23536笔记本CPU数:8

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python 并发编程(一):从性能角度理解并发编程
程序什么时候应该使用多线程,什么时候单线程效率高。
1.1.3 如何减少上下文切换
android多线程下载详解
秒杀多线程第十篇 生产者消费者问题
蜘蛛/爬虫程序的多线程控制(C#语言)下
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服