Java项目生成oracle数据库dump文件(一)

本文介绍了在Java项目中,为了解决缓存压力,对数据库中完成交易的数据进行归档的操作。通过生成包含insert语句的dump文件来保存这些数据。程序首先获取表的列信息,拼接成insert语句,然后写入到dump文件中。虽然这种方法逻辑可控,但由于IO操作和插入语句拼接,效率较低,不适合处理CLOB、BLOB等特殊类型数据。后续文章将探讨如何优化这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        近期开发的项目是一个基金管理的项目,由于交易数据比较大,为了提高响应速度,在数据访问层增加了缓存机制。但是,随着系统运行了一段时间,由于缓存加载的数据量扩大,系统内存占用越来越高。为了减轻系统压力,需要增加归档功能,即通过归档操作,将数据库里面符合特定条件(如:交易完成)的数据进行清理。但是,由于基金交易数据的特殊性,这些被清理的数据仍需要保存,而且必要的情况下还要支持数据的恢复。这篇文章就是这个功能开发完成的产物。

        最开始,由于dump文件格式的不确定,加上要用Java代码生成,我们考虑生成dump文件的内容为需要归档的数据的insert语句。首先,我们通过需要归档的表名,查询user_tab_columns可以拿到该表的所有列信息(主要是列名和数据类型),然后根据表名和列信息拼成insert语句,最后加上归档条件。根据该思路,我们有了下面的代码。

package com.code.dump;

import java.io.File;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class DumpFile {
	/** 数据库连接参数 */
	static final String DB_HOST = "127.0.0.1:1526";
	static final String DB_SID = "orcl";
	static final String DB_USER = "admin";
	static final String DB_PWD = "pwd";
	static final String TABLE_NAME = "NODE";
	/** 拼接的sql每行字符数,超过ROW_CHAR_COUNT就换行,防止sql过长 */
	static final int ROW_CHAR_COUNT = 1000;
	/** dump文件保存路径 */
	static final String DUMP_FILE_PATH = "./dump_file";
	static Connection connection = null;

	public static void main(String[] args) {
		try {
			long start = System.currentTimeMillis();
			String sql = generateInsertSql();
			generateDumpFileByFile(sql);
			System.out.println("---------------------------\n"+"all cost time is " + (System.currentTimeMillis() - start) + " ms"+"\n-----------------------------\n");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (connection != null) {
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/** 生成使用的sql语句 */
	static String generateInsertSql() throws Exception {
		// 存储需要备份的表的列的信息(column_name,data_type)
		List<ColumnInfo> cols = new ArrayList<ColumnInfo>();
		// 创建oracle数据库连接
		Class.forName("oracle.jdbc.driver.OracleDriver");
		connection = DriverManager.getConnection("jdbc:oracle:thin:@" + DB_HOST + ":" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值