Oracle数据库客户端有一个sqlplus组件,这个组件能够让我们通过命令行的方式执行一些数据库操作。为了提高dump文件的写入效率,我们尝试使用sqlplus命令来生成dump文件。
sqlplus可以指定运行脚本,例如:
sqlplus admin/pwd@//127.0.0.1:1526/orcl@./tmp_sql/NODE_dump_sql_20180516130228316.sql
我们在这个脚本里面可以通过spool命令打开一个文件,然后将sql查询出来的结果写入这个文件。
具体代码如下:
package com.code.dump;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
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 DumpFile2 {
/** 数据库连接参数 */
static final String DB_HOST = "127.0.0.1:1526";
static final String DB_SID = "oracl";
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";
/** sqlPlus执行脚本存放路径 */
static final String SQL_PLUS_FILE_PATH = "./tmp_sql";
static Connection connection = null;
public static void main(String[] args) {
try {
long start = System.currentTimeMillis();
String sql = generateInsertSql();
generateDumpFileBySqlPlus(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 + ":" + DB_SID, DB_USER, DB_PWD);
Statement sql = connection.createStatement();
// 查询需备份表的所有列信息
ResultSet columns = sql.executeQuery(&