博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqlite批量插入数据巨慢,java解决方案
阅读量:7206 次
发布时间:2019-06-29

本文共 2548 字,大约阅读时间需要 8 分钟。

 

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。

 

  最近做一个从mysql数据库查询数据,导出sqlite的db文件,做好之后点击导出按钮,一个1000条数据导出竟然用了280s,有木有。用户会疯掉的。前端点击完之后没啥反应,一直转圈圈,等待服务器响应,于是就打印服务器响应时间,最后发现在保存sqlite时特别慢,因为我是for循环一条一条insert的,所以可以看到本地的db文件以肉眼可见的龟速在增大,所以就上某度搜索sqlite批量插入的方法,大部分人也碰到了跟我一样的问题,但是好像做java的很少用sqlite,大部分都是mysql、oracle等。但是他们用Android的sqlite提供了一种思想,就是使用事物控制批量插入。事物开启之后所有的update会保存在缓存中,commit时会保存本地文件,于是就写了如下代码。直接从280s骤减为0.8s,太爽了。不说了,直接上代码。

package com.sense.devcenter.device.utils;import com.sense.devcenter.common.utils.PropertyConfig;import org.apache.commons.dbcp2.BasicDataSource;import org.springframework.jdbc.datasource.DataSourceUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class SqliteUtils {  private BasicDataSource dataSource = null;  private Connection con = null;  public SqliteUtils(String name) {    initDataSource(name);  }  private static final String path = PropertyConfig.getDevicePath();  public void update(String sql) {    try {      PreparedStatement ps = con.prepareStatement(sql);      ps.executeUpdate();    } catch (Exception e) {      throw new RuntimeException(e.getMessage());    }  }  public void beginTransaction(){    try {      con.setAutoCommit(false);    } catch (SQLException e) {      e.printStackTrace();    }  }  public void commitTransaction(){    try {      con.commit();    } catch (SQLException e) {      e.printStackTrace();    }  }  private void initDataSource(String name) {    synchronized (Thread.class) {      if (null == dataSource) {        this.dataSource = new BasicDataSource();        this.dataSource.setUrl("jdbc:sqlite://" + path + name + ".db");        this.dataSource.setDriverClassName("org.sqlite.JDBC");      }    }    try {      con = dataSource.getConnection();    } catch (SQLException e) {      e.printStackTrace();    }  }  public ResultSet select(String sql){    Connection con = null;    try {      con = dataSource.getConnection();      PreparedStatement ps = con.prepareStatement(sql);      return ps.executeQuery();    } catch (Exception e) {      throw new RuntimeException(e.getMessage());    } finally {      try {        DataSourceUtils.doReleaseConnection(con, dataSource);      } catch (SQLException e) {        e.printStackTrace();      }    }  }  public void closeDataSource(){    try {      dataSource.close();      con.close();    } catch (SQLException e) {      e.printStackTrace();    }  }}

 

转载于:https://www.cnblogs.com/xiao-tangyuan/p/9556114.html

你可能感兴趣的文章
把wcf服务,改成restful方式,以及吐槽
查看>>
SpatiaLite 各版本数据库差异
查看>>
Python变量和数据类型
查看>>
HTML(二)选择器
查看>>
C++ 类模板的使用
查看>>
AJAX编程-封装ajax工具函数
查看>>
Common Lisp学习笔记(九)
查看>>
一只菜鸡的话
查看>>
变量声明和定义的区别
查看>>
python之路之课后作业
查看>>
p4475 巧克力王国
查看>>
js中的Attribute
查看>>
Mysql的一些常用命令
查看>>
蓝桥杯:基础练习 闰年判断
查看>>
LeetCode-82-Remove Duplicates from Sorted List II
查看>>
ASP.NET XML读取、增加、修改和删除操作
查看>>
struts2将servlet对象注入到Action中
查看>>
快速排序
查看>>
const变量存储位置及const指针
查看>>
MFC 加载链接库(DLL)错误
查看>>