java批量插入数据进数据库中

方式1:

for循环,每一次进行一次插入数据。

方式2:

jdbc的preparedStatement的batch操作

PreparedStatement.addBatch();

......
PreparedStatement.executeBatch();

一次最多不要超过50条:
1.因为当你插入的时候 数据库已经锁定,然而如果你一次性插入太多会造成其他业务的等待。
2.会造成内存的溢出

方式2的本质是:insert into table (a,b,c,d) values(av,bv,cv.dv);insert into table (a,b,c,d) values(...)...

方式3:

for循环拼接sql。成为insert into table (a,b,c,d) values (av,bv,cv,dv),(....),(...).这种形式

别人的经验之谈:

  最近项目中使用SSH+oracle数据库,使用C3P0连接池,要求当执行某动作时在2表中各插入一万条数据。于是就采用了jdbc的方式插入。
    先获取一个sequence,再将数据插入到数据库中。一测试时间,崩溃了,用时近3分钟(其中获取两个表的sequence很费时),后来想想以前曾经做过一个类似的项目,使用了主键自增的策略,就将主键改为自增了。再次测试,还可以,不到3秒。将此代码记录下来,以便日后参考。
    顺便说说,可以使用存储过程(尤其是操作多个表插数据),这样效率更快些。 

这篇文章也不错:

这篇论坛文章根据笔者的个人经验着重介绍了使用insert插入大量数据的常用技巧,更多内容请参考下文: 使用insert插入大量数据的个人经验总结在很多时候,我们会需要对一个表进行插入大量的数据,并且希望在尽可能短的时间内完成该工作,这里,和大家分享下我平时在做大量数据insert的一些经验。 前提:在做insert数据之前,如果是非生产环境,请将表的索引和约束去掉,待insert完成后再建索引和约束。
1.insert into tab1 select * from tab2;
commit;
这是最基础的insert语句,我们把tab2表中的数据insert到tab1表中。根据经验,千万级的数据可在1小时内完成。但是该方法产生的arch会非常快,需要关注归档的产生量,及时启动备份软件,避免arch目录撑爆。
2.alter table tab1 nologging;
insert /*+ append */ into tab1 select * from tab2;
commit;
alter table tab1 logging;
该方法会使得产生arch大大减少,并且在一定程度上提高时间,根据经验,千万级的数据可在45分钟内完成。但是请注意,该方法适合单进程的串行方式,如果当有多个进程同时运行时,后发起的进程会有enqueue的等待。
注意此方法千万不能dataguard上用(不过要是在database已经force logging那也是不怕的,呵呵)!!
3.insert into tab1 select /*+ parallel */ * from tab2;
commit;
对于select之后的语句是全表扫描的情况,我们可以加parallel的hint来提高其并发,这里需要注意的是最大并发度受到初始化参数parallel_max_servers的限制,并发的进程可以通过v$px_session查看,或者ps -ef |grep ora_p查看。
4.alter session enable parallel dml;
insert /*+ parallel */ into tab1 select * from tab2;
commit;
与方法2相反,并发的insert,尚未比较和方法2哪个效率更高(偶估计是方法2快),有测试过的朋友欢迎补充。
5.insert into tab1 select * from tab2 partition (p1);
insert into tab1 select * from tab2 partition (p2);
insert into tab1 select * from tab2 partition (p3);
insert into tab1 select * from tab2 partition (p4);
对于分区表可以利用tab1进行多个进程的并发insert,分区越多,可以启动的进程越多。我曾经试过insert 2.6亿行记录的一个表,8个分区,8个进程,如果用方法2,单个进程完成可能要40分钟,但是由于是有8个分区8个进程,后发进程有enqueue,所以因此需要的时间为40分钟×8;但是如果用方法5,虽然单个进程需要110分钟,但是由于能够并发进程执行,所以总共需要的时间就约为110分钟了。
6. DECLARE
TYPE dtarray IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
v_col1 dtarray;
v_col2 dtarray;
v_col3 dtarray;
BEGIN
SELECT col1, col2, col3 BULK COLLECT
INTO v_col1, v_col2, v_col3
FROM tab2;
FORALL i IN 1 .. v_col1.COUNT
insert into tab1....;
END;
用批量绑定(bulk binding)的方式。当循环执行一个绑定变量的sql语句时候,在PL/SQL 和SQL引擎(engines)中,会发生大量的上下文切换(context switches)。使用bulk binding,能将数据批量的从plsql引擎传到sql引擎,从而减少上下文切换过程,提升效率。该方法比较适合于在线处理,不必停机。
7.sqlplus -s user/pwd< runlog.txt
set copycommit 2;
set arraysize 5000;
copy from user/[email protected] -
to user/[email protected] -
insert tab1 using select * from tab2;
exit
EOF
用copy的方法进行插入,注意此处insert没有into关键字。该方法的好处是可以设置copycommit和arrarysize来一起控制commit的频率,上面的方法是每10000行commit一次。

来自:http://freebile.blog.51cto.com/447744/587120/

时间: 2024-10-03 21:55:13

java批量插入数据进数据库中的相关文章

java 批量插入数据 到数据库

//大数据插入方式 String sql = "insert into T_DR_RF(CUSTOMER_CODE,RFID_TAG) values(?,?)"; Connection connection =db.getConnection(); connection.setAutoCommit(false); PreparedStatement ps = connection.prepareStatement(sql); for (Map<String, Object>

Java通过Mybatis实现批量插入数据到Oracle中

最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式: 结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目录结构如下图所示,添加相应的jar包 2.新建数据库表:ACCOUNT_INFO 1 CREATE TABLE ACCOUNT_INFO ( 2 "ID" NUMBER(12) NOT NULL , 3 "USERNAME" VARCHAR2(64 BYTE) NULL

关于从JSP页面插入数据到数据库中乱码问题的解决

问题描述:最近我在写一个j2ee的留言板系统模块,遇到了一个非常让我头大的问题,当我从JSP页面输入数据后,通过hibernate中的业务逻辑类HQL语句把这个数据插入到本地的mysql数据库中,可是当我发现成功插入后在数据库中看到的是乱码,再回显到浏览页面中看到的也是一堆乱码,我的jsp页面设置编码为UTF-8,如下: <%@ page language="java" contentType="text/html; charset=UTF-8"    pag

C#_批量插入数据到Sqlserver中的四种方式

先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database CarSYS;    go    use CarSYS;  

sql 批量插入数据到Sqlserver中 效率较高的方法

使用SqlBulk #region 方式二 static void InsertTwo() { Console.WriteLine("使用Bulk插入的实现方式"); Stopwatch sw = new Stopwatch(); DataTable dt = GetTableSchema(); using (SqlConnection conn = new SqlConnection(StrConnMsg)) { SqlBulkCopy bulkCopy = new SqlBulkC

Java 批量插入数据(Oracle)

//批量添加20000条数据用时8秒. try { String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SID String user = "oracle"; String password = "oracle"; StringBuffer sql = new StringBuffer(); sql.append("insert into ex_log (EX_LOG_I

用SqlBulkCopy批量插入数据到SqlServer数据库表中

首先创建一个数据库连接类:SQLHelper using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data; namespace insetData { public class SQLHelper { public static readonly string Strconn = "Data

向mysql中批量插入数据的性能分析

MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example(example_id, name, valu

用python操作mysql数据库(之批量插入数据)

#!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb #建立连接 conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1qaz#EDC',db='test_db') cur = conn.cursor() #对数据进行操作 li = [('tanzhenx','shaoguan'),('huangmengdie','shaoguan')] #定义一个列表,列表中