`
lijing727
  • 浏览: 15960 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据库数据的转换,从一张表转换到另一个表

阅读更多

1、没有使用数据库连接池(主要思想是分页查询、分批插入)

package util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class BatchProcess {

	public static void batchInsert(int m, int n) {

		long start = System.currentTimeMillis();

		String insertSql = "INSERT INTO LIJING727_ORIGDATA(DATA0,DATA1,"
				+ "DATA2,DATA3,DATA4,DATA5,DATA6,DATA7,DATA8,DATA9) VALUES "
				+ "(?,?,?,?,?,?,?,?,?,?)";

		for (int i = 0; i < m; i++) {

			Connection conn = DbConnStatic.getConnection();

			try {

				PreparedStatement pstmt = conn.prepareStatement(insertSql);

				for (int j = 0; j < n; j++) {

					pstmt.setInt(1, i * n + j + 1);
					pstmt.setString(2, "test" + 2);
					pstmt.setString(3, "test" + 3);
					pstmt.setString(4, "test" + 4);
					pstmt.setString(5, "test" + 5);
					pstmt.setString(6, "test" + 6);
					pstmt.setString(7, "test" + 7);
					pstmt.setString(8, "test" + 8);
					pstmt.setString(9, "test" + 9);
					pstmt.setString(10, "test" + 10);

					pstmt.addBatch();

				}

				pstmt.executeBatch();
				pstmt.close();
				// conn.close();
				// DbConnection.freeConnection();

			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		long end = System.currentTimeMillis();

		System.out
				.println("批量插入数据" + m + "*" + n + " 用时" + (end - start) / 1000f);

	}

	public static void deleteAllData() {

		long start = System.currentTimeMillis();

		Connection conn = DbConnStatic.getConnection();

		try {

			Statement stmt = conn.createStatement();

			String sql1 = "DELETE FROM LIJING727_ORIGDATA";
			//String sql2 = "DELETE FROM LIJING727_TEMPDATA";

			stmt.execute(sql1);
			//stmt.execute(sql2);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		long end = System.currentTimeMillis();

		System.out.println("批量删除所有数据 用时" + (end - start) / 1000f);

	}

	public static void transferData(int m, int n) {

		long start = System.currentTimeMillis();

		String insertSql = "INSERT INTO LIJING727_TEMPDATA(DATA0,DATA1,"
				+ "DATA2,DATA3,DATA4,DATA5,DATA6,DATA7,DATA8,DATA9) VALUES "
				+ "(?,?,?,?,?,?,?,?,?,?)";

		String selectSql = "SELECT * FROM (SELECT rownum r,a.* "
				+ "FROM LIJING727_ORIGDATA a WHERE rownum <= ?) WHERE r >= ?";
		
		for (int i = 0; i < m; i++) {

			Connection insertConn = new DbConn().getConnection();
			Connection selectConn = new DbConn().getConnection();

			try {

				PreparedStatement selectPstmt = selectConn.prepareStatement(selectSql);
				PreparedStatement insertPstmt = insertConn.prepareStatement(insertSql);
				
				selectPstmt.setInt(1, (i+1) * n);
				selectPstmt.setInt(2, i * n + 1);
				
				ResultSet rs = selectPstmt.executeQuery();
				
				while (rs.next()) {
					
					insertPstmt.setInt(1, rs.getInt(2));
					insertPstmt.setString(2, rs.getString(3));
					insertPstmt.setString(3, rs.getString(4));
					insertPstmt.setString(4, rs.getString(5));
					insertPstmt.setString(5, rs.getString(6));
					insertPstmt.setString(6, rs.getString(7));
					insertPstmt.setString(7, rs.getString(8));
					insertPstmt.setString(8, rs.getString(9));
					insertPstmt.setString(9, rs.getString(10));
					insertPstmt.setString(10, rs.getString(11));

					insertPstmt.addBatch();
					
				}

				insertPstmt.executeBatch();
				insertPstmt.close();
				selectPstmt.close();


			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		long end = System.currentTimeMillis();

		System.out
				.println("批量转换" + m + "*" + n + " 用时" + (end - start) / 1000f);

	}

}

 

 

2、使用数据库连接池

package util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import oracle.jdbc.driver.OraclePreparedStatement;

public class MultiThreadProcess {

	public static void batchInsert(int m, int n) throws ClassNotFoundException,
			SQLException, InterruptedException {

		ExecutorService exec = Executors.newCachedThreadPool();

		DbPool dbPool = new DbPool();
		dbPool.createPool();

		long start = System.currentTimeMillis();

		for (int i = 0; i < m; i++) {

			exec.execute(new BatchInsertTask(dbPool, i, n, start));

			// Thread thread = new Thread(new BatchInsertTask(dbPool, i, n,
			// start));
			// thread.join(); // 线程挂接,当前线程阻塞,thread执行完后,主线程才能执行
			// exec.execute(thread);
			// thread.start();

		}

		exec.shutdown();

	}

	public static void batchTransfer(int m, int n)
			throws ClassNotFoundException, SQLException, InterruptedException {

		ExecutorService exec = Executors.newCachedThreadPool();

		DbPool dbPool = new DbPool();
		dbPool.createPool();

		long start = System.currentTimeMillis();

		for (int i = 0; i < m; i++) {

			exec.execute(new BatchTransferTask(dbPool, i, n, start));

		}

		exec.shutdown();

	}

}

class BatchInsertTask implements Runnable {

	DbPool dbPool;
	int threadNum = 0;
	int batchNum = 0;
	long start;

	BatchInsertTask(DbPool dbPool, int threadNum, int batchNum, long startTime) {

		this.dbPool = dbPool;
		this.threadNum = threadNum;
		this.batchNum = batchNum;
		start = startTime;
	}

	@Override
	public void run() {

		String insertSql = "INSERT INTO LIJING727_ORIGDATA(DATA0,DATA1,"
				+ "DATA2,DATA3,DATA4,DATA5,DATA6,DATA7,DATA8,DATA9) VALUES "
				+ "(?,?,?,?,?,?,?,?,?,?)";

		try {

			Connection conn = dbPool.getConnection();
			OraclePreparedStatement pstmt = (OraclePreparedStatement) conn
					.prepareStatement(insertSql);

			for (int j = 0; j < batchNum; j++) {

				pstmt.setInt(1, threadNum * batchNum + j + 1);
				pstmt.setString(2, "test" + 2);
				pstmt.setString(3, "test" + 3);
				pstmt.setString(4, "test" + 4);
				pstmt.setString(5, "test" + 5);
				pstmt.setString(6, "test" + 6);
				pstmt.setString(7, "test" + 7);
				pstmt.setString(8, "test" + 8);
				pstmt.setString(9, "test" + 9);
				pstmt.setString(10, "test" + 10);

				pstmt.addBatch();

			}

			pstmt.executeBatch();
			pstmt.close();
			dbPool.returnConnection(conn);

			long end = System.currentTimeMillis();

			System.out.println("批量插入数据用时" + (end - start) / 1000f);

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

}

class BatchTransferTask implements Runnable {

	DbPool dbPool;
	int threadNum = 0;
	int batchNum = 0;
	long start;

	BatchTransferTask(DbPool dbPool, int threadNum, int batchNum, long startTime) {

		this.dbPool = dbPool;
		this.threadNum = threadNum;
		this.batchNum = batchNum;
		start = startTime;
	}

	@Override
	public void run() {

		String insertSql = "INSERT INTO LIJING727_TEMPDATA(DATA0,DATA1,"
				+ "DATA2,DATA3,DATA4,DATA5,DATA6,DATA7,DATA8,DATA9) VALUES "
				+ "(?,?,?,?,?,?,?,?,?,?)";

		String selectSql = "SELECT b.DATA0,b.DATA1,b.DATA2,b.DATA3,b.DATA4,"
				+ "b.DATA5,b.DATA6,b.DATA7,b.DATA8,b.DATA9"
				+ " FROM (SELECT rownum r,"
				+ "a.DATA0,a.DATA1,a.DATA2,a.DATA3,a.DATA4,a.DATA5,a.DATA6,"
				+ "a.DATA7,a.DATA8,a.DATA9"
				+ " FROM LIJING727_ORIGDATA a WHERE rownum <= ?) b"
				+ " WHERE r >= ?";

		// String selectSql = "SELECT b.DATA0,b.DATA1,b.DATA2,b.DATA3,b.DATA4,"
		// + "b.DATA5,b.DATA6,b.DATA7,b.DATA8,b.DATA9"
		// + " FROM (SELECT rownum r,a.*"
		// + " FROM LIJING727_ORIGDATA a WHERE rownum <= ?) b"
		// + " WHERE r >= ?";

		try {

			Connection insertConn = dbPool.getConnection();
			Connection selectConn = dbPool.getConnection();

			OraclePreparedStatement selectPstmt = (OraclePreparedStatement) selectConn
					.prepareStatement(selectSql);
			OraclePreparedStatement insertPstmt = (OraclePreparedStatement) insertConn
					.prepareStatement(insertSql);

			selectPstmt.setInt(1, (threadNum + 1) * batchNum);
			selectPstmt.setInt(2, threadNum * batchNum + 1);

			ResultSet rs = selectPstmt.executeQuery();

			while (rs.next()) {

				insertPstmt.setInt(1, rs.getInt(1));
				insertPstmt.setString(2, rs.getString(2));
				insertPstmt.setString(3, rs.getString(3));
				insertPstmt.setString(4, rs.getString(4));
				insertPstmt.setString(5, rs.getString(5));
				insertPstmt.setString(6, rs.getString(6));
				insertPstmt.setString(7, rs.getString(7));
				insertPstmt.setString(8, rs.getString(8));
				insertPstmt.setString(9, rs.getString(9));
				insertPstmt.setString(10, rs.getString(10));

				insertPstmt.addBatch();

			}

			rs.close();
			insertPstmt.executeBatch();
			insertPstmt.close();
			selectPstmt.close();

			dbPool.returnConnection(insertConn);
			dbPool.returnConnection(selectConn);

			long end = System.currentTimeMillis();

			System.out.println("批量转换数据用时" + (end - start) / 1000f);

		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

}

 

如果数据量很大,造成JVM溢出,可以在查询时的是分次处理,减少JVM的负担。

package util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import oracle.jdbc.driver.OraclePreparedStatement;

public class MultiBatchProcess {

	public static void batchInsert(int threadNum, int timeNum, int batchNum)
			throws ClassNotFoundException, SQLException, InterruptedException {

		ExecutorService exec = Executors.newCachedThreadPool();

		DbPool dbPool = new DbPool();
		dbPool.createPool();

		long start = System.currentTimeMillis();

		for (int i = 0; i < threadNum; i++) {

			exec.execute(new BatchInsert(dbPool, i, timeNum, batchNum, start));

		}

		exec.shutdown();

	}

	public static void batchTranfer(int threadNum, int timeNum, int batchNum)
			throws ClassNotFoundException, SQLException, InterruptedException {

		ExecutorService exec = Executors.newCachedThreadPool();

		DbPool dbPool = new DbPool();
		dbPool.createPool();

		long start = System.currentTimeMillis();

		for (int i = 0; i < threadNum; i++) {

			exec
					.execute(new BatchTransfer(dbPool, i, timeNum, batchNum,
							start));

		}

		exec.shutdown();

	}

}

class BatchTransfer implements Runnable {

	DbPool dbPool;
	int threadNo = 0;
	int timeNum = 0;
	int batchNum = 0;
	long start = 0;

	BatchTransfer(DbPool dbPool, int threadNum, int timeNum, int batchnum,
			long start) {

		this.dbPool = dbPool;
		this.threadNo = threadNum;
		this.timeNum = timeNum;
		this.batchNum = batchnum;
		this.start = start;

	}

	@Override
	public void run() {

		String insertSql = "INSERT INTO LIJING727_TEMPDATA(DATA0,DATA1,"
				+ "DATA2,DATA3,DATA4,DATA5,DATA6,DATA7,DATA8,DATA9) VALUES "
				+ "(?,?,?,?,?,?,?,?,?,?)";

		String selectSql = "SELECT b.DATA0,b.DATA1,b.DATA2,b.DATA3,b.DATA4,"
				+ "b.DATA5,b.DATA6,b.DATA7,b.DATA8,b.DATA9"
				+ " FROM (SELECT rownum r,"
				+ "a.DATA0,a.DATA1,a.DATA2,a.DATA3,a.DATA4,a.DATA5,a.DATA6,"
				+ "a.DATA7,a.DATA8,a.DATA9"
				+ " FROM LIJING727_ORIGDATA a WHERE rownum <= ?) b"
				+ " WHERE r >= ?";

		// String selectSql = "SELECT b.DATA0,b.DATA1,b.DATA2,b.DATA3,b.DATA4,"
		// + "b.DATA5,b.DATA6,b.DATA7,b.DATA8,b.DATA9"
		// + " FROM (SELECT rownum r,a.*"
		// + " FROM LIJING727_ORIGDATA a WHERE rownum <= ?) b"
		// + " WHERE r >= ?";

		try {

			Connection insertConn = dbPool.getConnection();
			Connection selectConn = dbPool.getConnection();

			OraclePreparedStatement selectPstmt = (OraclePreparedStatement) selectConn
					.prepareStatement(selectSql);
			OraclePreparedStatement insertPstmt = (OraclePreparedStatement) insertConn
					.prepareStatement(insertSql);

			for (int i = 0; i < timeNum; i++) {

				selectPstmt.setInt(1, threadNo * timeNum * batchNum + (i + 1)
						* batchNum);
				selectPstmt.setInt(2, threadNo * timeNum * batchNum + i
						* batchNum + 1);

				ResultSet rs = selectPstmt.executeQuery();

				while (rs.next()) {

					insertPstmt.setInt(1, rs.getInt(1));
					insertPstmt.setString(2, rs.getString(2));
					insertPstmt.setString(3, rs.getString(3));
					insertPstmt.setString(4, rs.getString(4));
					insertPstmt.setString(5, rs.getString(5));
					insertPstmt.setString(6, rs.getString(6));
					insertPstmt.setString(7, rs.getString(7));
					insertPstmt.setString(8, rs.getString(8));
					insertPstmt.setString(9, rs.getString(9));
					insertPstmt.setString(10, rs.getString(10));

					insertPstmt.addBatch();

				}

				rs.close();
				insertPstmt.executeBatch();
				insertPstmt.clearBatch();

			}

			insertPstmt.close();
			selectPstmt.close();

			dbPool.returnConnection(insertConn);
			dbPool.returnConnection(selectConn);

			long end = System.currentTimeMillis();

			System.out.println("批量转换数据用时" + (end - start) / 1000f);

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

class BatchInsert implements Runnable {

	DbPool dbPool;
	int threadNo = 0;
	int timeNum = 0;
	int batchNum = 0;
	long start = 0;

	BatchInsert(DbPool dbPool, int threadNum, int timeNum, int batchnum,
			long start) {

		this.dbPool = dbPool;
		this.threadNo = threadNum;
		this.timeNum = timeNum;
		this.batchNum = batchnum;
		this.start = start;

	}

	@Override
	public void run() {

		String insertSql = "INSERT INTO LIJING727_ORIGDATA(DATA0,DATA1,"
				+ "DATA2,DATA3,DATA4,DATA5,DATA6,DATA7,DATA8,DATA9) VALUES "
				+ "(?,?,?,?,?,?,?,?,?,?)";

		try {

			Connection conn = dbPool.getConnection();
			OraclePreparedStatement pstmt = (OraclePreparedStatement) conn
					.prepareStatement(insertSql);

			for (int i = 0; i < timeNum; i++) {

				for (int j = 0; j < batchNum; j++) {

					pstmt.setInt(1, threadNo * timeNum * batchNum + i
							* batchNum + j + 1);
					pstmt.setString(2, "test" + 2);
					pstmt.setString(3, "test" + 3);
					pstmt.setString(4, "test" + 4);
					pstmt.setString(5, "test" + 5);
					pstmt.setString(6, "test" + 6);
					pstmt.setString(7, "test" + 7);
					pstmt.setString(8, "test" + 8);
					pstmt.setString(9, "test" + 9);
					pstmt.setString(10, "test" + 10);

					pstmt.addBatch();

				}

				pstmt.executeBatch();
				pstmt.clearBatch();
			}

			pstmt.close();
			dbPool.returnConnection(conn);

			long end = System.currentTimeMillis();

			System.out.println("批量插入数据用时" + (end - start) / 1000f);

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

}

  

分享到:
评论

相关推荐

    将SQL数据库表转换成XML文件输出(脚本)

    您的数据库可能很大,数据可能很多,那您早已经想过如何将这些数据库中的一张表数据导出到XML 文件中,如何处理? 这个脚本会帮助你完成所有的功能,你只需要下载,然后当作sql语句执行即可运行。。。

    Delphi数据库字段转换、替换工具.rar

    Delphi数据库字段转换、替换工具源代码,程序的主要功能是将数据库的指定字段替换为其它字段,也就是根据一张表中对应的两组数据,替换掉另一张表中的数据。

    paradox数据库工具

    可直接把一张表内的数据复制到另一张表内,也可以把一张表的某字段的数据复制到另一张表的某字段。功能非常实用。(选择区域内数据) 2、加入输出Excel、Html、rtf、csv、txt文件格式。(选择区域内数据)

    数据转换器 Xp 完整版2002.11

    可直接把一张表内的数据复制到另一张表内,也可以把一张表的某字段的数据复制到另一张表的某字段。功能非常实用。(选择区域内数据) 2、加入输出Excel、Html、rtf、csv、txt文件格式。(选择区域内数据) 注:本...

    一个简单实用的数据库操作框架

    设计思想  把DBMS抽象成类Database,这个类负责管理数据库连接以及提供表对象。  把数据库中的一张或多张表抽象成... 把对个Row的集合抽象成RowSet,这个类中用一个vector把多个Row对象保存起来并提供一些相关操作。

    数据库连接、增删改查、关闭等操作工具类(采用反射机制)

    这是数据库连接、对数据表(任何数据表)进行增删改查等操作的工具类,采用反射机制和泛型完成,其中有个配置文件,在配置文件中修改要连接的数据库驱动、数据库连接URL、数据库用户名、密码;

    数据库系统的一些专用词汇表.txt

    关系(Relation): 一个关系就是一张二维表, 每张表有一个表名。 . 元组(Tuple): 关系表中的一行称为一个元组。元组可表示一个实体或实体之间的联系。 . 属性( Attribute): 关系表中的一个列称为关系 的一个属性,...

    C# byte数组与Image相互转换的方法

    1、把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数据库。 2、把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示。 3、从图片byte数组得到对应图片的格式,生成一张图片保存到磁盘上。 ...

    Oracle数据库Sql语句详解大全

    第七章 数据建模及数据库设计 了解系统开发的步骤 数据关系的定义 理解实体关系映射图(E-R图) 第八章 创建表 掌握创建表的语法 Oracle的数据类型 使用约束 第九章 对数据的操作 在已创建表中插入新的数据 修改...

    把excel表格里的数据导入sql数据库的两种方法

    本来最近在研究微信公众平台的,老大临时交我个任务,把excel表格里的数据导入sql数据库,我想这so easy嘛。 没想都在上面消磨了两天… 把情况介绍下:在数据库中有如下这样结构的表(A表) 我只取关键的及列里面...

    mss2sql_v5-3.zip SQL Server转换为MySQL工具

    SQL Server转换为MySQL工具...这个表里面的数据并不多,花费时间稍长,大概有10分钟,如果表大的话,可能用程序来转换会快一些,有方便的办法也请告之为谢 下面就是转换成功后的表格了,里面的数据OK,中文也没有什么问题.

    数据库系统概论部分答案.doc

    答:概念模型是现实世界到机器世界的一个中间层次, 作用:用于信息世界的建模,是现实世界到信息世界的第一层抽象,数据库设计人员进 行数据库设计的有力工具,也是数据库设计人员和用户之间进行交流的语言。...

    mysql数据库的基本操作语法

    视图就是一个表或多个表的查询结果,它是一张虚拟的表,因为它并不能存储数据。 视图的作用、优点: 限制对数据的访问 让复杂查询变得简单 提供数据的独立性 可以完成对相同数据的不同显示 创建、修改视图 create or...

    数据库设计:逻辑结构设计.pdf

    关系模型数据结构 (1)关系 一个关系也就是通常所说的一张表。 关系具有以下特征: 1.关系中不能有任意两条完全相同的记录。 2.关系中的记录是非排序的。 3.关系中记录的字段是非排序的。 4.字段名称不能相同。 5....

    数据科学与大数据技术hive安装包

    hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一...

    西南交大数据库设计实验,DDL+DML+DCL报告

    (3)自行设计2张视图(1张基于单表创建,一张基于多表创建)、2个触发器(1个用户动态约束检查,1个用户表间约束检查)、2个索引(参照11.1节,1个基于单列创建,1个基于组合列创建),各对象用自己的学号+对象名...

    保险-数据库课程设计---副本.doc

    由E_R模型转换成数据表,建立表间联系。规范表设计至4NF(如有特殊情 况未达到4NF需说明理由)。 6. 数据库实现。基于Access或SQL SERVER环境,建立数据库,建立数据表,建立表间联系,实现各种数据约束。 7. 调试...

    一种基于树形结构的Sql结果集向Json数据的转换算法.pdf

    一种基于树形结构的Sql结果集向Json数据的转换算法.pdf

    PHP实现数据库统计时间戳按天分组输出数据的方法

    本文实例讲述了PHP实现数据库统计时间戳按天分组输出数据的方法。分享给大家供大家参考,具体如下: 比如统计每天用户注册数,数据库表存了一张用户注册记录表: create table table_name(id int primary key,...

    第5章-数据库系统.docx

    A 人工管理阶段 B 文件系统阶段 C 数据库系统阶段 D 系统管理阶段 6:在一个关系中,不能有完全相同的___A______。 A 元组 B 标记 C 分量 D 域 7: E-R图是表示概念模型的有效工具之一,E-R图中使用菱形框表示 ___A__...

Global site tag (gtag.js) - Google Analytics