SQLite性能测试(插入)

最近一直在思考一个问题,SQLite 做到这么轻量级,那它注定不会像 MySql 一样强性能,那么它的性能怎么样呢?并发量多高呢?

官方解释:

About SQLite

最大数据库大小:281TB

最大行大小:1GB

请添加图片描述

话不多说,操作!

创建数据库&表

新建db文件,作为存储数据库

请添加图片描述

创建user表,作为测试数据表

CREATE TABLE "user" (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER NOT NULL
);

新建测试demo

新建maven项目,引入相关依赖

<dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.36.0.3</version>
</dependency>

新建测试case

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class SqliteInsertExample {public static void main(String[] args) {String url = "jdbc:sqlite:D:\\env\\SQLite\\data\\user.db";String tableName = "user"; try (Connection conn = DriverManager.getConnection(url);PreparedStatement pstmt = conn.prepareStatement(//插入sql"INSERT INTO " + tableName + " (name, age) VALUES (?,?)")) {pstmt.setString(1, "张三");pstmt.setString(2, "20");// 记录执行开始时间double startTime = System.currentTimeMillis();//执行插入操作int rowsInserted = pstmt.executeUpdate();//记录执行结束时间double endTime = System.currentTimeMillis();double duration = endTime - startTime;if (rowsInserted > 0) {System.out.println("Inserted successfully!");System.out.println("执行时间为:"+duration/1000+"s");}} catch (SQLException e) {System.out.println(e.getMessage());}}
}

执行测试

  1. 插入一条记录,执行时间 0.002s,感觉还不错,基本无感😎

请添加图片描述

  1. 修改代码,循环插入 1000 条记录,再次测试
//执行插入操作
int rowsInserted = 0;
for (int i = 0; i < 1000; i++) {rowsInserted = pstmt.executeUpdate();
}

1.6s 左右,还是相当可以

请添加图片描述

  1. 加大力度继续测试,循环插入100,0000 条记录
 for (int i = 0; i < 1000000; i++) {rowsInserted = pstmt.executeUpdate();}

漫长的等待…

这次测试明显不乐观,时长达到了26分钟😥

请添加图片描述

  1. 换个思路——模拟并发开辟几个线程,在多线程下循环插入数据
 public class SqliteInsertExample{public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread1 = new Thread(myRunnable);Thread thread2 = new Thread(myRunnable);Thread thread3 = new Thread(myRunnable);Thread thread4 = new Thread(myRunnable);Thread thread5 = new Thread(myRunnable);//开启线程thread1.start();thread2.start();thread3.start();thread4.start();thread5.start();}
}
//线程类class MyRunnable implements Runnable{//插入数据库的代码...}

报错了…5个线程失败两个,在 sql 执行期间会有表锁,看来显然不能这么简单处理

请添加图片描述

如果一个线程执行完毕后,再启用下一个线程,那么我模拟的多并发就没有了意义

与MySQL做个对比

在刚刚测试中循环插入一百万条数据,执行时长长达26分钟,属实是有些恐怖,那么一样的操作一样的环境,换成 mysql (5.7版本) 会有什么样的结果呢?

引入依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>

创建库表

 CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(100) NOT NULL,`age` varchar(100) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

新建测试case

 import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;public class MysqlInsertExample {public static void main(String[] args) {// JDBC 驱动名和数据库 URLString JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";String DB_URL = "jdbc:mysql://localhost/user";// 数据库的用户名与密码String USER = "root";String PASS = "123456";try {//加载并注册JDBC驱动Class.forName(JDBC_DRIVER);Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);//插入sqlString sql = "INSERT INTO user (name, age) VALUES (?, ?)";PreparedStatement pstmt = conn.prepareStatement(sql);// 设置占位符的值pstmt.setString(1, "李四");pstmt.setString(2, "30");// 记录执行开始时间double startTime = System.currentTimeMillis();//执行插入操作int rowsAffected = 0;for (int i = 0; i < 1000000; i++) {rowsAffected = pstmt.executeUpdate();}//记录执行结束时间double endTime = System.currentTimeMillis();double duration = endTime - startTime;if (rowsAffected > 0) {System.out.println("Inserted successfully!");System.out.println("执行时间为:" + duration / 1000 + "s");}//清理环境,关闭连接pstmt.close();conn.close();} catch (ClassNotFoundException e) {// JDBC 驱动类没有找到e.printStackTrace();} catch (SQLException e) {// 处理 JDBC 错误e.printStackTrace();}}}

7分钟左右,看来还得是MySQL,性能不是一个量级

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频--AAC编码解析和示例

目录 1&#xff1a;AAC编码介绍 2&#xff1a;AAC格式介绍 3&#xff1a;AAC -ADTS帧组成 4&#xff1a;AAC-ADTS&#xff1a;&#xff08;adts_fixed_header&#xff09;格式介绍 5&#xff1a;AAC-ADTS&#xff1a;&#xff08;adts_variable_header&#xff09;格式介绍…

什么是机器视觉应用解决方案?

机器视觉应用解决方案通常指的是利用视觉系统自动检测、处理和分析图像的技术方案&#xff0c;以便执行各种工业或研究任务&#xff0c;如质量控制、自动检测、导航和识别等。在LabVIEW环境中&#xff0c;这些解决方案通常涉及到硬件和软件的紧密集成&#xff0c;以实现高效的数…

C语言收尾 预处理相关知识

一. 预处理详解 1.1 预定义符号 FILE //进行编译的源文件LINE //文件当前的行号DATE //文件被编译的日期TIME //文件被编译的时间FUNCTION //文件当前所在的函数STDC //如果编译器遵循ANSI C标准&#xff0c;其值为1&#xff0c;否则未定义 这些预定义符号都是语言内置的 我们…

用 Python 和 AkShare 进行个股数据清洗:源码剖析和建议优化

这是《个股清洗源码》一个获取股票买卖盘信息并将其打印到控制台并保存到文件的脚本。 下面我们来对源码进行剖析 先复习一下源码 import os import akshare as ak from akshare import stock_bid_ask_em from datetime import datetime import pandas as pd from io import …

类和对象中篇

类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情况下&#xff0c;都会自动生成下面6个默认成员函数 ①初始化和清理&#xff1a;构造函数和析构函数 ②拷贝复制&#x…

无线通信模块通过TCP/IP协议实现与PC端的数据传输

在当今的信息时代&#xff0c;无线通信技术的发展日新月异&#xff0c;为我们的工作和生活带来了极大的便利。其中&#xff0c;无线通信模块通过TCP/IP协议向PC端传送数据已经成为了一种常见的通信方式。本文将详细介绍这一过程的主要步骤和涉及的关键技术&#xff0c;并以WIFI…

Linux——信号量

什么是信号量&#xff1f; 信号量是用来用于同步和互斥的。其实就是一个计数器&#xff0c;进行PV操作&#xff0c;其中P操作就是让计数器–&#xff0c;V操作就是让计数器。 从物理上说明信号量的P、V操作的含义。 P(S)表示申请一个资源&#xff0c;S.value>0表示有资源可…

OBS插件--复合模糊

复合模糊 复合是一款滤镜插件&#xff0c;支持多种模糊类型和多种蒙版效果。支持模糊源的部分显示区域&#xff0c;可以反选区域进行模糊&#xff0c;这个功能对于场景部分区域需要遮盖非常实用。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在…

实现用户个人随机salt生成jwt及鉴别用户权限的实现思路

实现用户个人随机salt生成jwt及鉴别用户权限的实现 盐值是什么&#xff1f; 盐值&#xff08;salt&#xff09;是在密码学中用于增加密码安全性的一种随机值。它通常是一个随机生成的字符串&#xff0c;与用户密码结合在一起&#xff0c;然后再进行加密处理。盐值的作用是增加…

【Unity 鼠标输入检测】

Unity 鼠标输入检测 Unity提供了多种方法来检测和处理鼠标输入&#xff0c;允许开发者在游戏中实现对鼠标移动、点击和滚轮滚动的响应。以下是一些基本的鼠标输入检测方法&#xff1a; 1. Input.mousePosition 这个属性返回当前鼠标指针的屏幕坐标。坐标是以像素为单位的&…

【吊打面试官系列】Java高并发篇 - 同步方法和同步块,哪个是更好的选择?

大家好&#xff0c;我是锋哥。今天分享关于 【同步方法和同步块&#xff0c;哪个是更好的选择&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 同步方法和同步块&#xff0c;哪个是更好的选择&#xff1f; 同步块是更好的选择&#xff0c;因为它不会锁住整个对象…

Prim算法(Prim‘s Algorithm)

Prim算法&#xff08;Prims Algorithm&#xff09;&#xff0c;由罗伯特普里姆&#xff08;Robert C. Prim&#xff09;于1957年提出&#xff0c;是一种用于构造加权无向图的最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;的贪心算法。最小生成树是一个无环子图…

临近空间相关概念

临近空间概念 距地 20KM-100KM 的临近空间位于内外层空间之中&#xff0c;也称为 超高空、近空间、亚轨道等。 特点就是&#xff1a;纵跨 非电离层和电离层、空气稀薄&#xff0c;存在 臭氧、紫外、辐射等特殊环境 存在 重力波、行星波、大气放电等特殊现象。 临近空间高速飞…

##15 探索高级数据增强技术以提高模型泛化能力

文章目录 前言数据增强的重要性常见的数据增强技术高级数据增强技术在PyTorch中实现数据增强结论 前言 在深度学习领域&#xff0c;数据增强是一种有效的技术&#xff0c;它可以通过在原始数据上应用一系列变换来生成新的训练样本&#xff0c;从而增加数据的多样性&#xff0c…

前端 | 易混词卡片切换

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 绘制单词卡片效果&#xff0c;实现点击左半部分上翻&#xff0c;点击右半部分下翻。 &#x1f4da;模块实现解析 &#x1f407;…

品鉴中的个人风格:如何形成自己与众不同的红酒品鉴体验

品鉴云仓酒庄雷盛红酒不仅是一种感官体验&#xff0c;更是一种个人风格的展现。每个人都有自己与众不同的品味和偏好&#xff0c;通过品鉴红酒&#xff0c;我们可以形成自己与众不同的红酒品鉴体验。 要形成自己与众不同的红酒品鉴体验&#xff0c;首先需要勇于尝试不同类型的红…

conda 常用20个命令

conda常用20个命令 这些命令涵盖了Conda环境管理和包管理的常用功能&#xff0c;可帮助你有效地管理Python环境和软件包。 创建环境&#xff1a; conda create --name myenv这个命令用于创建一个名为myenv的新环境。你可以在--name后面指定环境的名称&#xff0c;并在其后加上…

C++语法之在谈const与模版参数

最近一直在复习C的语法&#xff0c;感觉遇到了不少问题&#xff0c;或许是之前没想的这么深。废话不说&#xff0c;开始说正事。 一、再谈const 有些朋友可能有些疑问&#xff0c;不就是const吗&#xff1f;我知道&#xff0c;const可以给非const赋值&#xff0c;反过来不行&…

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

Webpack模块联邦:微前端架构的新选择

Webpack模块联邦&#xff08;Module Federation&#xff09;是Webpack 5引入的一项革命性特性&#xff0c;它彻底改变了微前端架构的实现方式。模块联邦允许不同的Web应用程序&#xff08;或微前端应用&#xff09;在运行时动态共享代码&#xff0c;无需传统的打包或发布过程中…