`

请大家帮帮忙 如何在java语言中利用jdbc的方式往oracle表插入大数据量问题

阅读更多
我再项目开发过程中遇到需要对一张主表和一张明细表同时插入大数量,目前我采取的方式是直接利用statement将拼装sql语句,然后向数据库每1000条数据提交一次。基本类似如下的格式:
begin
insert into zb values (zb_seq.nextval,'aa');
insert into mxb values (mxb_seq.nextval, zb_seq.currval, 'bb');
insert into mxb values (mxb_seq.nextval, zb_seq.currval, 'bb');
insert into mxb values (mxb_seq.nextval, zb_seq.currval, 'bb');
insert into zb values (zb_seq.nextval,'cc');
insert into mxb values (mxb_seq.nextval, zb_seq.currval, 'dd');
insert into mxb values (mxb_seq.nextval, zb_seq.currval, 'dd');
insert into mxb values (mxb_seq.nextval, zb_seq.currval, 'dd');
end;

现在我看过关于使用PreparedStatement加executeBatch方法可以更快,主要想提高预编译sql文件的次数,从而达到提高效率。根据用去的需求,批量插入的记录越多越好,比如插入10W笔数据,那么主表需要插入10W,明细表至少是10W。目前想改进之后的数据库插入方式为:
insert into zb values (zb_seq.nextval,?);
insert into mxb values (mxb_seq.nextval, zb_seq.currval, ?);

想请大家帮我看看,解答几个问题:
1.PreparedStatement里面是否可以放多个sql?
2.我主表插入一条记录,明细表需要插入主表刚才插入的guid,该种模式是否适用?该怎么写?
3.尾部的错误到底该如何解决?

下面贴出的我的测试java类
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class testBatch {
	
	public void execBatchSql(){
        Connection conn = getConnection();      
		try{
			conn.setAutoCommit(false);
			long beginTime = System.currentTimeMillis();
			PreparedStatement pst = null;
			for (int i=0;i<10000;i++){
				pst = conn.prepareStatement("insert into zb values (zb_seq.nextval,?)");
				pst.setString(1, "testzb"+i);
				pst.addBatch();
				pst = conn.prepareStatement("insert into mxb values (mxb_seq.nextval, zb_seq.currval, ?)");
				for(int j=7;j<10;j++){
					pst.setString(1, "testmxb"+i+j);
					pst.addBatch();
				}
				if(i%1000 == 0){
					pst.executeBatch();
					conn.commit();
					pst.clearBatch();
				}
			}
			pst.executeBatch();
			long endTime = System.currentTimeMillis();
			System.out.println("用时:"+(endTime-beginTime)+"毫秒");
			pst.close();
			conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
	
	public Connection getConnection(){
		Connection conn = null;
		try{
			String driverClassName = "oracle.jdbc.driver.OracleDriver";
			String url = "jdbc:oracle:thin:@10.40.6.68:1521:jszx";
			String user = "fszg";
			String password = "fszg";
			Class cc = Class.forName(driverClassName);
			Driver driver = (Driver)cc.newInstance();
			DriverManager.registerDriver(driver);
			conn = DriverManager.getConnection(url,user,password);
		}catch(Exception e){
			e.printStackTrace();
		}
		return conn;
	}
	
	
	
	public static void main(String[] agrs){
		testBatch t = new testBatch();
		t.execBatchSql();
		
	}

}

下面是我的建表语法,是oracle9i的数据库。
create table zb
(
guid number(20),
name varchar2(20)
);
create table mxb
(
guid number(20),
f_guid number(20),
name varchar2(20)
);
-- Create sequence 
create sequence zb_seq
minvalue 3304000000000000001
maxvalue 9999999999999999999
start with 3304000000000000001
increment by 1
cache 20;
-- Create sequence 
create sequence mxb_seq
minvalue 3306000000000000001
maxvalue 9999999999999999999
start with 3306000000000000001
increment by 1
cache 20;



但是我现在调试的时候却有问题,提示:
java.sql.BatchUpdateException: ORA-08002: sequence ZB_SEQ.CURRVAL is not yet defined in this session

	at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
	at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907)
	at cn.com.gsoft.fszg.testBatch.execBatchSql(testBatch.java:26)
	at cn.com.gsoft.fszg.testBatch.main(testBatch.java:63)
1
8
分享到:
评论
6 楼 awwang 2012-11-16  
这个怎么可能是正解呢?preparedStatement每次循环都去做,直接导致效率低下。
错误原因还是很明白
5 楼 neitnaco 2011-07-30  
还没有解决,有没有其他更好的方法呢?
4 楼 neitnaco 2011-07-28  
chansman 写道
已经是正解,PreparedStatement放的sql太多内存溢出,同时数据库压力大,你现在这么做已经很好了,注意异常后回退

但是我上述写法却报错了,java.sql.BatchUpdateException: ORA-08002: sequence ZB_SEQ.CURRVAL is not yet defined in this session ?
能是什么原因呢?
3 楼 chansman 2011-07-28  
已经是正解,PreparedStatement放的sql太多内存溢出,同时数据库压力大,你现在这么做已经很好了,注意异常后回退
2 楼 neitnaco 2011-07-28  
PreparedStatement里面是否可以放多个sql?
1 楼 neitnaco 2011-07-28  
请热心人事过来帮我看看。

相关推荐

    JAVA Oracle_JDBC

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

    Java用JDBC实现对Oracle数据库操作

    标题“Java用JDBC实现对Oracle数据库操作”主要涉及Java编程语言如何利用Java Database Connectivity (JDBC) API来与Oracle数据库进行交互。JDBC是Java中用于与各种数据库通信的标准接口,而Oracle数据库是一个广泛...

    Java使用Jdbc连接Oracle执行简单查询操作示例

    1. 导入Jdbc驱动包:在Java程序中需要引入Oracle的Jdbc驱动包,通常是oracle.jdbc.driver.OracleDriver。 2. 注册Jdbc驱动:使用Class.forName()方法注册Jdbc驱动。 3. 建立数据库连接:使用DriverManager.get...

    用java编程将txt文件数据导入oracle

    在本程序中,我们使用 Java 语言的 JDBC 驱动程序来连接 Oracle 数据库,并将 TXT 文件中的数据导入数据库。 4. JDBC 驱动程序:JDBC(Java Database Connectivity)是一种 Java API,用于连接数据库。在本程序中,...

    jdbc批量插入大字段

    在处理大量Blob数据时,传统的单条插入方式可能会导致性能低下,因为每条SQL语句都需要与数据库进行交互,这会增加网络传输和数据库处理的开销。因此,"jdbc批量插入大字段"这个话题旨在探讨如何高效地通过Java JDBC...

    java代码oracle数据库批量插入

    ### Java代码实现Oracle...这种方式相比于逐条插入数据,可以显著提升插入速度,特别是在需要插入大量数据的情况下效果更加明显。同时,通过禁用自动提交和批量处理的方式,减少了网络往返次数,进一步提高了执行效率。

    jdbcoracle(多国语言支持)

    本文将深入探讨JDBC(Java Database Connectivity)与Oracle数据库在实现多国语言支持方面的技术细节和实践策略。 一、JDBC简介 JDBC是Java平台上的标准接口,它为Java应用程序提供了访问各种类型数据库的能力,...

    java使用jdbc连接oracle数据库

    在本场景中,`ojdbc6.jar`是Oracle提供的JDBC驱动程序,用于建立Java应用程序与Oracle数据库之间的通信桥梁。下面将详细阐述如何使用这个jar包以及涉及的相关知识点。 首先,JDBC是Java平台的标准接口,它由Sun ...

    Java ORACLE JDBC 驱动

    总的来说,Java ORACLE JDBC驱动是Java开发者在处理Oracle数据库时必不可少的工具,它提供了高效、稳定和灵活的数据库访问方式。正确地使用和理解这些知识点对于进行Java与Oracle数据库的集成开发至关重要。

    java jdbc oracle代码

    Java JDBC (Java Database Connectivity) 是Java编程语言中用于与数据库交互的一组接口和类,它提供了标准的方法来连接、查询和操作数据库。Oracle是世界上最流行的商业数据库系统之一,广泛应用于企业级应用。当...

    JAVA_JDBC面向对象分页(初步设计二之oracle)

    在Java编程中,JDBC(Java Database Connectivity)是用于与数据库交互的标准API,它使得Java开发者能够连接到各种类型的数据库并执行SQL语句。在处理大量数据时,分页查询是一种有效的策略,可以提高应用程序的性能...

    Oracle 官方 JDBC Demo JAVA

    Oracle官方JDBC Demo是Oracle公司提供的Java数据库连接(JDBC)示例代码,旨在帮助开发者理解和使用JDBC驱动程序与Oracle数据库进行交互。这个压缩包包含了一些基础到高级的JDBC操作实例,对于初学者和有经验的开发...

    jdbc-oracle.rar_JDBC ORACLE_java JDBC orac_java jdbc oracle_jdbc

    在Java编程语言中,JDBC(Java Database Connectivity)是一个用于与各种数据库进行交互的标准接口。JDBC提供了一套规范,使得Java程序员可以使用统一的方法来访问数据库,包括Oracle数据库。Oracle是世界上最流行的...

    Jdbc连接oracle远程数据库中文乱码解决

    在Java应用中,数据在JVM(Java虚拟机)内部是以Unicode编码存储的,而Oracle数据库可能采用不同的字符集,如GBK或UTF-8等。因此,当数据在两者之间传输时,如果没有正确设置编码转换,就可能出现乱码。 1. **配置...

    用JDBC向Students表中插入数据

    本文将详细讲解如何使用JDBC(Java Database Connectivity)来向一个名为“Students”的数据库表中插入数据,同时也会涉及Oracle数据库和Java的相关知识点。 首先,JDBC是Java语言与各种数据库交互的一套标准接口,...

    java中jdbc连接oracle代码及jar包

    在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的一套标准API。Oracle数据库是世界上最流行的数据库管理系统之一,广泛应用于企业级应用。本教程将详细讲解如何在Java项目中使用JDBC...

    JAVA Spring boot JDBC同步不同服务器oracle数据库

    Java Spring Boot 框架与JDBC的集成是企业级应用开发中常见的一种技术组合,尤其在处理数据库交互时。本教程将详细讲解如何利用Spring Boot和JDBC实现跨服务器Oracle数据库的同步。 首先,Spring Boot简化了Java...

    java servlet+Jdbc+Oracle

    JDBC(Java Database Connectivity)是Java语言访问数据库的标准API,而Oracle是一种广泛使用的商业关系型数据库管理系统。 1. **Java Servlet**: Java Servlet是Java平台上的一个标准,允许开发者创建服务器端的...

    ORACLE数据库中插入大字段数据的解决方法

    如果数据量巨大,可以考虑先将数据插入临时表或利用表分区功能,分批处理,然后再合并到目标表。 6. **调整初始化参数**: 优化数据库参数如`DB_FILE_MULTIBLOCK_READ_COUNT`和`LOB_CACHE_SIZE`,可以提升大字段...

Global site tag (gtag.js) - Google Analytics