百度蜘蛛对视频网站的抓取,可以做黄金期权的网站,正规网站建设哪家好,在线观看网站深夜免费0 解决问题最佳途径#xff1a;直接找官方
先说明的是#xff0c;有问题直接去找官方文档#xff0c;而不应该去百度搜索#xff0c;您很容易体验到#xff0c;搜索引擎很难快速找到真正对您有价值的解决方案#xff0c;而官方文档是最快捷的途径。
本篇也是基于官方文…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 使用什么选项
我们的需求是
将txt文件导入到数据库表的一部分columns将其他的columns设置为指定值
根据语法原型我们需要的语法格式是
LOAD DATA INFILE [file_name]
INTO TABLE [table_name](column1,column2,……)
SET column5expr,column6expr……JDBC是这样的关键代码
String sql LOAD DATA INFILE ? INTO TABLE Performance_First(SalesOrder) SET ID?,Name?,QueryStatus0,SubmitTimenow(),CalculateStatus0;
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导入文件夹的时候需要
获取java工程的路径文件路径 Java工程路径 文件名
注意加上后缀并且不要使用中文。
3.3 注意
不能包含中文文件的路径和文件名都不能包含中文您可能会遇到一些报错这是因为权限不足默认情况下只有指定文件夹中的文件可以被导入这个问题请如果您遇到请自行查阅资料解决。