- 浏览: 273496 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
muyufenghua:
public static <T super B> ...
浅谈Java泛型中的extends和super关键字 -
wantodare:
class Test1 {
{
a=1;
}
pr ...
Java对象初始化详解 -
wubo2qml:
问下如何进行列中数字大小的比较。我看了几个过滤器,最接近的是S ...
利用Filter进行HBase查询 -
blackproof:
rowkey是A_B我知道要的A集合,也知道要的B范围不用自定 ...
利用Filter进行HBase查询 -
bin_1715575332:
文章不错,尤其了后半部分讲解一些原理。
利用Filter进行HBase查询
在实际的开发过程中,特别是大型的分布式应用系统,往往会涉及到大批量的数据。那么在测试的时候就需要准备足够多的数据以便进行测试。
为了提高插入数据的效率,我们可以利用MySql的批量插入数据能力。其实,从本质来说也就是取消JDBC中事务的自动提交,改为手动提交。
如果没有关闭JDBC事务的自动提交,那么JDBC驱动会在每次执行了一条SQL语句之后,自动提交,并且关闭连接。而我们知道打开数据库连接是非常耗资源的,而且有些JDBC框架还会限制数据库操作的频率。这种情况下,如果采用单调数据插入效果非常不好。
解决的方法之一,就是关闭JDBC事务的自动提交,改为手动提交。我们可以记录SQL语句的执行次数,然后当达到某一个值的时候,比如10w次的时候,手动提交一下事务,然后关闭并重新开始数据库连接。再进行下一批数据局的插入或者更新。
这种方法非常适合于准备测试环境当中的大批量数据。在运行程序过程中,会碰到JVM抛出内存不足的异常,这个时候可以调大内存,或者减少每批数据的数据量来解决。
以下代码仅供参考,在下面代码中,每批的数据库量为1w条记录。不同JDBC版本支持的批量插入的数据量不同,为了谨慎起见,可以先改小一点,然后慢慢提高。
为了提高插入数据的效率,我们可以利用MySql的批量插入数据能力。其实,从本质来说也就是取消JDBC中事务的自动提交,改为手动提交。
如果没有关闭JDBC事务的自动提交,那么JDBC驱动会在每次执行了一条SQL语句之后,自动提交,并且关闭连接。而我们知道打开数据库连接是非常耗资源的,而且有些JDBC框架还会限制数据库操作的频率。这种情况下,如果采用单调数据插入效果非常不好。
解决的方法之一,就是关闭JDBC事务的自动提交,改为手动提交。我们可以记录SQL语句的执行次数,然后当达到某一个值的时候,比如10w次的时候,手动提交一下事务,然后关闭并重新开始数据库连接。再进行下一批数据局的插入或者更新。
这种方法非常适合于准备测试环境当中的大批量数据。在运行程序过程中,会碰到JVM抛出内存不足的异常,这个时候可以调大内存,或者减少每批数据的数据量来解决。
以下代码仅供参考,在下面代码中,每批的数据库量为1w条记录。不同JDBC版本支持的批量插入的数据量不同,为了谨慎起见,可以先改小一点,然后慢慢提高。
@Test public void testInsertFollowRelation(){ String db = "com.mysql.jdbc.Driver"; String host = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=GBK"; String user = "abc"; String passwd = "abc"; Connection con = null; try{ Class.forName(db).newInstance(); } catch (Exception e) { System.out.println("加载驱动失败:" + db); } long starTime = System.currentTimeMillis(); try { long startRowNum = 0; long count = 0; //使用事务插入,每10000条数据提交一下事务。 //提高效率 for(int i = 0; i < 10; i++){ BufferedReader reader = new BufferedReader(new FileReader(new File("E:\\test.txt"))); con = DriverManager.getConnection(host, user, passwd); con.setAutoCommit(false); PreparedStatement pstmt = con.prepareStatement("INSERT INTO test " + "(id,info) " + "VALUES(?,?,?,now())"); String info = null; while((info= reader.readLine()) != null){ pstmt.setLong(1, startRowNum); pstmt.setLong(2, info); pstmt.executeUpdate(); count++; startRowNum ++; if(startRowNum % 10000 == 0){//如果数据条数达到10000条,则提交事务 con.commit(); con.close(); //重开链接 con = DriverManager.getConnection(host, user, passwd); con.setAutoCommit(false); pstmt = con.prepareStatement("INSERT INTO test " + "(id,info) " + "VALUES(?,?,?,now())"); System.out.println("数据量达到10000条,提交事务完成。"); } } reader.close(); } long endTime = System.currentTimeMillis(); System.out.println("共耗时:<" + new Float(((endTime-starTime)/1000)) + ">秒。插入了(" + count + ")条数据"); } catch(Exception e){ e.printStackTrace(); try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } }
评论
3 楼
Mysun
2013-01-12
最后一段逻辑:
保证不会有数据遗漏的
if(startRowNum % 10000 != 0){//循环外面判断,防止最后有剩余数据没有提交 pstmt.executeBatch(); con.commit(); }
保证不会有数据遗漏的
2 楼
a283037321
2012-09-20
while((info= reader.readLine()) != null){
pstmt.setLong(1, startRowNum);
pstmt.setLong(2, info);
count++;
pstmt.addBatch();
startRowNum ++;
if(startRowNum % 10000 == 0){//如果数据条数达到10000条,则提交事务 pstmt.executeBatch();
con.commit();
con.close();
//重开链接
con = DriverManager.getConnection(host, user, passwd);
con.setAutoCommit(false);
pstmt = con.prepareStatement("INSERT INTO test " +
"(id,info) " +
"VALUES(?,?,?,now())");
System.out.println("数据量达到10000条,提交事务完成。");
}
}if(startRowNum % 10000 != 0){//循环外面判断,防止最后有剩余数据没有提交
pstmt.executeBatch();
con.commit();
}
用addBatch()应该快一些,我是小菜鸟,不知这样对不对
pstmt.setLong(1, startRowNum);
pstmt.setLong(2, info);
count++;
pstmt.addBatch();
startRowNum ++;
if(startRowNum % 10000 == 0){//如果数据条数达到10000条,则提交事务 pstmt.executeBatch();
con.commit();
con.close();
//重开链接
con = DriverManager.getConnection(host, user, passwd);
con.setAutoCommit(false);
pstmt = con.prepareStatement("INSERT INTO test " +
"(id,info) " +
"VALUES(?,?,?,now())");
System.out.println("数据量达到10000条,提交事务完成。");
}
}if(startRowNum % 10000 != 0){//循环外面判断,防止最后有剩余数据没有提交
pstmt.executeBatch();
con.commit();
}
用addBatch()应该快一些,我是小菜鸟,不知这样对不对
1 楼
a283037321
2012-09-20
(startRowNum % 10000 == 0 这样如果数据总数取余后不等于0则后面剩下了少于1000条的数据没有插入数据库吧?
发表评论
-
Servlet 3.0新特性
2011-03-11 13:12 1382Servlet 3.0中最主要的两个新特性总结如下: 改变了 ... -
Java中wait与notify方法的使用
2010-05-22 14:09 9494在java多线程编程中 ... -
去掉对Spring BeanFacotry的getBean方法的依赖
2009-12-27 23:52 2740在使用Spring时,有时会碰到这种情况: 引用需要在 ... -
通过HttpServletRequestWrapper解决Tomcat请求乱码问题
2009-11-16 23:08 2289应用一:解决tomcat下中文乱码问题(先来个简单的) 在t ... -
相对路径获取Tomcat Web容器中的资源
2009-08-20 21:36 14465最近做项目碰到个问题,我需要利用velocity模版来渲染 ... -
Jboss是数据源配置
2009-08-16 15:38 2044配置Jboss的数据源非常简单,可以从$JBOSS_HOME\ ... -
Jboss 4.x 端口及其修改
2009-08-07 14:49 2852注:本文中所述内容适合于Jboss 4.x系列应用服务器。 ... -
JBOSS共享安装
2009-08-07 14:36 1949本文内容适合于Jboss 4.x系列应用服务器。 在项目中, ... -
Tomcat热部署
2009-06-24 20:33 3818使用过tomcat的人都知道 ... -
Improved Session Tracking
2009-06-24 01:23 1181Improved Session Tracking Septe ... -
jsessionid存在的问题及其解决方案
2009-06-24 00:29 3189jsessionid是Java Web Server( ... -
tomcat数据库连接池设置
2009-06-23 16:56 14481.Tomcat中的设置 2.我的工作目录在c:\eclip ... -
ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
2009-06-23 16:47 25801. 首先查看tnsnames.ora ... -
webwork type等于redirect时的参数传递
2009-06-23 02:09 2165Webwork在使用result类型为redirect时,将会 ... -
js跨域问题小结
2009-06-11 15:43 1744js跨域问题小结 javascript出于安全方面的考虑,是不 ... -
Spring共享上下文机制
2009-05-19 15:53 3870对于Spring应用程序上下文的引用基本有两种形式 ... -
webwork result type之redirect&redirect-action
2009-05-09 17:49 3238可能大家都知道在webwork里面如果想重定向到另外一个 ... -
使用javascirpt获取JSON格式的日期
2009-05-08 14:00 1999在用json-lib里的net.sf.json.JSONO ... -
JQuery JSON异步请求中文乱码问题
2009-05-08 13:48 15870最近在用Jquery的getJSON方法进行AJAX异步调 ... -
webwork-2.1.7与Spring2.0整合
2009-05-03 14:00 1473这里使用随webwork2.2发布的ActionAutowir ...
相关推荐
你需要先创建存储过程,然后调用...存储过程可以通过循环批量插入数据,提高代码的重用性和可维护性。 这样的好处:逻辑封装:复杂的插入逻辑可以封装在存储过程内,易于管理。 灵活性:可以根据参数动态调整插入行为。
### MySQL批量插入数据的技术解析与实践 #### 一、引言 MySQL作为一款广泛使用的开源关系型数据库管理系统,在处理大量数据的场景下显得尤为重要。批量插入数据是提高数据处理效率的有效手段之一。本文将深入探讨...
mysql 批量插入测试数据 ,可判断条件插入数据,随心所遇插入,do where 循环
MySql练习1:批量插入成绩数据.zip,MySql练习1:批量插入成绩数据.zipMySql练习1:批量插入成绩数据.zipMySql练习1:批量插入成绩数据.zipMySql练习1:批量插入成绩数据.zip
MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...
只要学我一样编写这么一个工具类便可以实现批量插入多条数据,百条,千条,万条,后期还会继续优化增加数据时的速度!有点代码基础的保证能看懂,此项目已经有了前端界面你可以直接的导入然后运行测试既可以了,表...
这个shell脚本的主要功能是向名为`dbname`的数据库中的`tablename`表中批量插入数据。脚本接受一个参数`$1`,即最大插入行数。它使用了一个while循环,循环次数根据传入的参数决定。 在循环内部,`mysql`命令用于...
首先,我们关注C#中一个关键接口`IBatcherProvider`,它定义了批量插入数据的基本方法。这个接口提供了一个`Insert`方法,接受一个`DataTable`对象和批次大小参数,使得我们可以灵活地处理数据并控制每次写入的数据...
源码批量添加到SQLServer和Mysql数据库。源码包含有不同方法的添加,第一种逐条添加,第二种批量加入,其批量加实现原理其实就是把数据存入内存表(DataTable)中使用Backcopy一次性加入数据库。添加dll引用即可调用...
在IT领域,尤其是在数据库操作与框架应用中,批量插入数据是一项常见且重要的需求。相比于单条插入,批量插入能够显著提升数据处理效率,减少数据库I/O操作,从而提高整体性能。本文将深入探讨如何利用MyBatis框架...
或者使用批量插入数据的特定数据库特性,如MySQL的LOAD DATA INFILE。 以上就是使用Delphi批量插入数据库数据的一些关键知识点。具体到压缩包中的代码fans.net文件,可能是提供示例代码的网站链接,你可以访问该...
本文将深入探讨如何使用JDBC进行批量插入数据,这在处理大量数据时能显著提高性能。 批量插入数据是数据库操作中常见的一种优化策略,特别是在数据分析、数据迁移或大数据处理等场景。传统的单条插入方式可能会导致...
在C#.NET中批量插入大量数据到数据库是一个常见的任务,特别是在处理诸如从Excel文件导入数据等场景时。这里,我们将探讨如何使用C#.NET高效地完成这个任务,并提供一个简单的示例来说明整个过程。 首先,我们需要...
"JDBC连接MySQL数据库批量插入数据过程详解" 本文主要介绍了使用JDBC连接MySQL数据库批量插入数据的过程详解,通过示例代码详细介绍了批量插入数据的步骤,对大家的学习或者工作具有一定的参考学习价值。 一、JDBC...
在Java中,执行MySQL批量插入数据有多种方法,每种方法在性能上都有所不同。以下是对这些方法的详细分析: 方法1:单条插入 这是最基础的插入方式,每次循环都创建一个新的SQL语句并执行。这种方法的效率最低,因为...
一种快速大数据的mysql 数据库的插入方法,相比之前一条一条插入,根本不是一个级别的!
5. **优化数据库配置**:调整数据库的参数,如增加`innodb_buffer_pool_size`以缓存更多数据,或者调整`bulk_insert_buffer_size`以优化批量插入。 6. **索引优化**:避免在插入过程中使用索引,除非它们是必要的。...
本主题将详细讲解如何使用Spring JDBC Template访问MySQL数据库并进行批量插入数据的操作。 首先,我们需要在项目中引入Spring框架的相关依赖,通常包括`spring-context`和`spring-jdbc`。这些可以在Maven或Gradle...
本文将探讨Mybatis和JDBC在批量插入MySQL数据库时的性能差异,并提供相关的测试资源。 首先,JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一种规范,它允许程序员使用SQL语句直接操作数据库...
本教程将详述如何使用Apache POI库读取Excel数据,并通过Java的JDBC接口批量插入到MySQL数据库中。Apache POI是Java平台上的一个开源项目,它允许程序员创建、修改和显示Microsoft Office格式的文件,其中包括Excel...