`
lijing727
  • 浏览: 16121 次
  • 性别: 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文件格式。(选择区域内数据)

    Java实体类字段生成工具类-将数据库表列字段转为Java实体类驼峰字段

    1、在Java开发中,常常需要将数据库表列字段换成Java实体类字段。但是手动实现这个转换过程比较慢,且容易出错,影响开发效率。为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表...

    数据转换器 Xp 完整版2002.11

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

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

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

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

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

    kettle8 模拟表输入查询表名,然后在另一个表输入中使用变量使用

    kettle8 模拟表输入查询表名,然后在另一个表输入中使用变量使用kettle8 模拟表输入查询表名,然后在另一个表输入中使用变量使用

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

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

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

    路径表示法设有一个path字段记录了从树的根节点到当前节点的完整路径。这种方法的优点是能够快速查找节点,但缺点在于一旦某个节点的位置发生变化时,就要维护该节点及其子节点的路径,对于操作频繁的树这是非常繁琐...

    Oracle数据库Sql语句详解大全

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

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

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

    kettle对数据分表插入

    kettle对数据分表插入 数据库Oracle etl工具 kettle 通过java脚本,hash算法,实现分表数据写入

    数据库知识点记录数据库知识点记录

    2. 一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。例如,拿转账来说,假设用户 A 和用户 B 两者的钱加起来一共是 20000,那么不管 A 和 B 之间如何转账,...

    PowerDesigner数据库建模.docx

    * 提供了强大的数据转换功能,能够将数据模型转换成 SQL 语句 PowerDesigner 的应用场景包括: * 数据库设计和开发 * 数据 warehouse 设计和开发 * 业务流程设计和优化 * 项目管理和控制 PowerDesigner 是一个...

    数据库基础与应用综合练习题及答案.doc

    19. 一个关系就是一张表,每个关系有一个关系名,每个关系在计算机中作为一个文件存储起来。 20. 关系中的元组和属性分别对应二维表中的行和列。 21. 属性的取值范围称为该属性的域。 22. 关系中的属性或属性组合...

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

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

    大数据时代基于Hadoop的一个数据仓库工具hive

    Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行。其优点是学习成本低,可以通过类 SQL 语句快速...

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

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

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

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

Global site tag (gtag.js) - Google Analytics