MySQL提高插入数据的效率(结合JDBC)

0 解决问题最佳途径:直接找官方

先说明的是,有问题直接去找官方文档,而不应该去百度搜索,您很容易体验到,搜索引擎很难快速找到真正对您有价值的解决方案,而官方文档是最快捷的途径。

本篇也是基于官方文档和自己的实践得出的一些经验,适合初学者,本人也是初学者。

测试的插入数据只有353条,但是您依然能够体会到性能的提升。

1 【40s】使用云数据库Mysql的体验

下面是使用JDBC和INSERT INTO语句逐条插入信息。

/*** 将订单信息存入表 Performance_First** @param SalesOrder 销售提交批量订单* @param id         当前登录账户的id*/
private static void InsertSalesOrder(int id, String name, int[] SalesOrder) throws SQLException {Connection connection = null;PreparedStatement insertSalesOrder = null;String insertSalesOrderSQL = "insert into Performance_First " +"values (?,?,0,now(),?,0)";long startTime = 0;try {connection = DatabaseOperation.CreateDatabaseConnection();assert connection != null;insertSalesOrder = connection.prepareStatement(insertSalesOrderSQL);startTime = System.currentTimeMillis();// TODO 记录时间// 插入订单for (int TemporarySalesOrder : SalesOrder) {insertSalesOrder.setInt(1, id);insertSalesOrder.setString(2, name);insertSalesOrder.setInt(3, TemporarySalesOrder);insertSalesOrder.execute();// 应该加点插入成功的标记}} catch (Exception e) {e.printStackTrace();} finally {DatabaseOperation.CloseDatabase(connection, insertSalesOrder);}long endTime = System.currentTimeMillis();System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}

测试数据是353条,居然需要40s,我的天,难以忍受!

于是使用bing搜索半天,也没有找到什么结果,之后看见了官方文档,很快找到完美的解决方案

首先,进入Mysql中文文档,找到第7章 优化(可惜没有搜索功能……)。

我们找到INSERT语句的速度。

入一个记录需要的时间由下列因素组成,其中的数字表示大约比例:
连接:(3)
发送查询给服务器:(2)
分析查询:(2)
插入记录:(1x记录大小)
插入索引:(1x索引)
关闭:(1)
这不考虑打开表的初始开销,每个并发运行的查询打开。

好了,现在明白了,使用云数据库,连接和发送就占用了大部分时间,所以,使用本地数据库试一试?

2 【2s】提高性能:使用本地数据库

这部分依然使用INSERT INTO语句,速度果然提高了很多,比较不需要联网发送数据了。

不过,我们还想再快一点,此时,你需要知道,你不知道你不知道的知识,如果官方文档找不到蛛丝马迹,又没有搜索,那就只能先去搜索引擎搜一下,看看我们需要解决那个位置的问题。

不过,幸运的是,官方文档还真有。

当从一个文本文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT语句快20倍。参见LOAD DATA INFILE语法。

3 【20ms】进一步提高性能:使用LOAD DATA INFILE而不是INSERT INTO

我们获取了LOAD DATA INFILE的语法原型,然后使用我们需要的部分就可以了。

3.1 使用什么选项

我们的需求是

  1. 将txt文件导入到数据库表的一部分columns
  2. 将其他的columns设置为指定值

根据语法原型,我们需要的语法格式是

LOAD DATA INFILE [file_name]
INTO TABLE [table_name](column1,column2,……)
SET column5=expr,column6=expr……

JDBC是这样的(关键代码)

String sql = "LOAD DATA INFILE ? " +"INTO TABLE Performance_First(SalesOrder) " +"SET ID=?,Name=?,QueryStatus=0,SubmitTime=now(),CalculateStatus=0";
try (Connection connection = DatabaseOperation.CreateDatabaseConnection(); // 连接数据库
) {assert connection != null;startTime = System.currentTimeMillis();try (PreparedStatement p = connection.prepareStatement(sql);) {p.setString(1, filePath);p.setInt(2, id);p.setString(3, name);p.execute();}
}

3.2 文件路径:客户端与服务器

如果指定了LOCAL,则被认为与连接的客户端有关:
· 如果指定了LOCAL,则文件会被客户主机上的客户端读取,并被发送到服务器。文件会被给予一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于启动客户端时所在的目录。

  • 如果LOCAL没有被指定,则文件必须位于服务器主机上,并且被服务器直接读取。
    当在服务器主机上为文件定位时,服务器使用以下规则:
  • 如果给定了一个绝对的路径名称,则服务器使用此路径名称。
  • 如果给定了带有一个或多个引导组件的相对路径名称,则服务器会搜索相对于服务器数据目录的文件。
  • 如果给定了一个不带引导组件的文件名称,则服务器会在默认数据库的数据库目录中寻找文件。
    注意,这些规则意味着名为./myfile.txt的文件会从服务器数据目录中被读取,而名为myfile.txt的同样的文件会从默认数据库的数据库目录中读取。例如,下面的LOAD DATA语句会从db1数据库目录中读取文件data.txt,因为db1是当前数据库。即使语句明确把文件载入到db2数据库中的表里,也会从db1目录中读取。
mysql> USE db1;
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

注意,使用正斜杠指定Windows路径名称,而不是使用反斜杠。如果您使用反斜杠,您必须使用两个。
出于安全原因,当读取位于服务器中的文本文件时,文件必须位于数据库目录中,或者是全体可读的。另外,要对服务器文件使用LOAD DATA INFILE,您必须拥有FILE权限。

我们选择直接使用服务器本地的文件,而不是客户端远程上传,因此不需要加LOCAL

此外,数据库的文件会有默认的DATA文件夹,如果使用./则会认为是此文件夹,使用JDBC导入文件夹的时候,需要

  1. 获取java工程的路径
  2. 文件路径 = Java工程路径 + 文件名

注意加上后缀,并且,不要使用中文

3.3 注意

  1. 不能包含中文:文件的路径和文件名都不能包含中文
  2. 您可能会遇到一些报错,这是因为权限不足,默认情况下,只有指定文件夹中的文件可以被导入,这个问题请如果您遇到,请自行查阅资料解决。

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

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

相关文章

【计算机心理学】先设计再实现 在实现中完善设计

先设计再实现 在物理学中,通常都是先理论证明观点,再进行实践,然后,再有世界各地的科学家根据理论进行实验,以证明观点正确。 在计算机软件开发,硬件开发等,都讲求先逻辑抽象设计,…

【FPGA VerilogHDL】第一次尝试:LED灯基础实验

0 实验环境 0.1 软件环境 ISE 14.7win10vivado 2017.4 0.2 硬件设备 ISE适用的FPGA开发板:ALINK AX309 1 需求 能够灵活控制4个LED灯 2 Verilog实现 timescale 1ns / 1ps // // Create Date: 14:18:20 08/08/2020 // Module Name: led // Revision…

使用ISE一键生成bit文件

我们知道,这几个,在第一次做好源文件之后,需要一个个进行右键单击-->run,以发现错误。 但是之后的调试,只要一点点变化,哪怕是注释变化,都需要重新run3次,太麻烦了。 不过经过实…

【FPGA Verilog】实验二:key按键基础实验

只说一下经验和教训 1 必须按照设计流程走 不要因为实验简单,就直接进行综合,比如按照 设计编码RTL优化仿真综合管脚分配,实现下载 一定要按照这个步骤来。 2 必须先查看开发板说明文档 开始出了一个令人困惑的问题,后来发现…

【Java】字符串转换为数字:Integer的parseInt方法

Java官方文档[1]的解释 public static int parseInt​(String s) throws NumberFormatException Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus…

在win10上使用Vmware安装Mac OS

安装macOS 如何在Windows上VMware上安装macOS Catalina 10.15 做一些提示: 如果您在第一次启动mac的时候,在出现【语言选择】之前,出现了连接蓝牙内容。 您可以将教程中【修改为win10 x64】那一步跳过,请注意,如果您…

JDBC 防御性编程

防御性编程(Defensive Programming) 什么是Defensive Programming[1]? 原文:Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circu…

【Java】异常处理的目的

编程思维:Defensive Programming 我们写好程序,将其打包,然后用户就可以使用和运行,但是,外界的情况是未知的,我们的程序很可能因为某个因素的出现而崩溃,因此,对于我们可以预测到的…

【Coursera】Getting Started with Python:Week One - Reading: Welcome to The Class

原文 & 翻译 Reading: Welcome to The Class Welcome to Getting Started with Python, the first class in our Python for Everybody Specialization. We have built this class specifically for those with no prior programming experience. With a relatively simpl…

【Java】获取目录及其子目录文件的相关事宜

获取目录及其子目录文件的代码 public class Main {public static void main(String[] args) {String path "D:/"; File f new File(path);Main.getFile(f);}public static void getFile(File file){if(file ! null){File[] f file.listFiles();if(f ! null){for…

【计算机思维】面向人的开发 站在巨人的肩膀上

思维转变:使用其他程序员开发的“黑箱”,不要重复造轮子 以Java举例,从常用的集合框架开始,我们要产生新的思维转变了,我们已经学会了基本的功能,但是在真正开发的时候,用基础功能去做开发效率…

【Computer Organization】The Core Design Thinking of single cycle CPU

1 Overview This section introduces someting that maybe you need to know before learning. Note:This CPU is based on MIPS instruction set. 1.1 Tools LogisimCS 3410 ComponentsMARS MIPS simulatorWin10 or Mac OS 1.2 Courses 自己动手画CPU《计算机组织与结构实…

【汇编语言】王爽 - 内中断复习

0 前言 基于王爽《汇编语言》和Coursera的《计算机组成》课程。 1 中断分类 CPU在执行指令的过程中,产生了一个异常/中断,因为CPU只能同时执行一条指令,所以需要暂停该指令的执行,转而去处理异常/中断信息。 这个异常可以来…

【算法】蛮力法/穷举法/枚举法 的基本问题分析

炮兵问题的优化,设立逻辑数组 蛮力法设计思想 有策略地穷举 验证 制定穷举策略避免重复 简单来说,就是列举问题所有可能的解,然后去看看是否满足题目要求,是一种逆向解题方式。(我也不知道答案是什么,…

如何高效学习算法【实例 + 可视化】

对于初学者来说,学习算法,不应该先学习抽象的理论,那样没有感觉,越学越晕,应该: 有具体的例子有可视化过程 同时需要结合理论知识对照学习,理论扎实、实践有效,同时要有结果反馈。…

【计算机网络实验·北航】实验一:网络实验入门(1)

1.3 远程在线环境使用 PCA、PCB、PCC和PCD:4台PC机S1、S2:2台交换机R1、R2:2台路由器中间的设备:组网连线器 远程组网连线: 使用PCA上的组网连线软件,配置组网连线器,实现组网连线。 PCA和PCB…

【C++】int与string转换

头文件&#xff1a;<string>&#xff0c;注意&#xff0c;这与<string.h>、<cstring>不是一回事儿语法&#xff1a;int x to_string(str)&#xff0c;其中string str "1"。

【C++】rand函数的基本使用

rand()函数用于生成伪随机数&#xff0c;每次生成的随机数都不变&#xff0c;方便我们调试程序。 重要是的随机数的范围公式&#xff08;适用整数&#xff09; 公式&#xff1a; 确定范围加偏移量 例如&#xff1a;a和b是整数 [a,b]&#xff0c;范围是b - a 1&#xff0c…

【操作系统】虚拟化CPU、Memory,共享文件

几个概念 CPU、虚拟CPU进程内存、虚拟地址空间 物理的CPU被OS虚拟成了多个虚拟的CPU&#xff0c;这些虚拟CPU分别运行各自的程序&#xff0c;这些正在运行的程序被称为进程。物理内存被OS虚拟成了多个虚拟地址空间&#xff0c;每个进程都有独立的、自己的地址空间&#xff0c;…

【Linux】编译C语言文件(-o -lpthread)

在gcc中使用-o编译 对于一个一般的程序&#xff0c;直接使用gcc <C语言文件名> -o <编译后生成的文件名>即可&#xff0c;例如以下程序&#xff1a; // cpu.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc,…