java实现GP数据库导入导出工具类,程序可以和gp在不同机器上

xiaoxiao2021-02-28  65

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; import com.xxx.SystemException; /** * gp数据导入导出工具类 * * Date: 2017年6月2日 <br> * Copyright (c) 2017 xxx.com <br> * * @author panyl */ public class GpDataUtils { private static Logger logger = LoggerFactory.getLogger(GpDataUtils.class); /** * * @param dataSource * gp数据源,可以spring注入 * @param sql * sql语句,如 select user_id from rpt.ln_rpt_list_month limit 1500000 * @param delimiter * 列分隔符,如 , * @param filePath * 输出文件绝对路径,如"E:\\temp\\test\\abc.txt * @param encode * 编码 * @param headers * 第一行列头,实现没有做业务校验 * @return 导出记录行数 * @author panyl */ public static long exportData(DataSource dataSource, String sql, String delimiter, String filePath, String encode, boolean header) { Connection con = null; OutputStream out = null; Writer writer = null; try { con = dataSource.getConnection(); CopyManager cm = new CopyManager(con.unwrap(BaseConnection.class)); StringBuffer sb = new StringBuffer(); sb.append("copy ("); sb.append(sql); sb.append(" ) TO STDOUT "); sb.append("WITH DELIMITER '"); sb.append(delimiter); sb.append("'"); if (header) { sb.append(" HEADER "); } String copySql = sb.toString(); logger.error("exportData data begin , sql is {}", copySql); long time1 = System.currentTimeMillis(); File file = new File(filePath); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } out = new FileOutputStream(file); long os = 0; if (StringUtils.isNotEmpty(encode)) {// 指定了编码 writer = new OutputStreamWriter(out, encode); os = cm.copyOut(copySql, writer); } else { os = cm.copyOut(copySql, out); } logger.error("exportData data end , sql is {},waste time = {}", copySql, System.currentTimeMillis() - time1); return os; } catch (Exception e) { logger.error("导出数据异常", e); throw new SystemException(e); } finally { if (con != null) { try { con.close(); } catch (SQLException e) { logger.error("关闭连接异常", e); } } if (writer != null) { try { writer.close(); } catch (IOException e) { logger.error("关闭连接异常", e); } } if (out != null) { try { out.close(); } catch (IOException e) { logger.error("关闭连接异常", e); } } } } /** * * @param dataSource * gp数据源,可以spring注入 * @param table * 导入的表名,表必须是已经存在的 如rpt.test_export_import * @param delimiter * 文件列分隔符,如 , * @param file * 输入文件绝对路径, 如 E:\\temp\\test\\abc.txt * @return 导入记录行数 * @author panyl */ public static long importData(DataSource dataSource, String table, String delimiter, String file) { Connection con = null; InputStream in = null; try { logger.info("import data begin "); con = dataSource.getConnection(); CopyManager cm = new CopyManager(con.unwrap(BaseConnection.class)); StringBuffer sb = new StringBuffer(); sb.append("copy "); sb.append(table); sb.append(" from STDIN "); sb.append("WITH DELIMITER '"); sb.append(delimiter); sb.append("'"); String copySql = sb.toString(); logger.info("import data begin , sql is {}", copySql); long time1 = System.currentTimeMillis(); in = new FileInputStream(file); long os = cm.copyIn(copySql, in); logger.info("import data end , sql is {},waste time = {}", copySql, System.currentTimeMillis() - time1); return os; } catch (Exception e) { logger.error("导入数据异常", e); throw new SystemException(e); } finally { if (con != null) { try { con.close(); } catch (SQLException e) { logger.error("关闭连接异常", e); } } if (in != null) { try { in.close(); } catch (IOException e) { logger.error("关闭连接异常", e); } } } } }
转载请注明原文地址: https://www.6miu.com/read-47423.html

最新回复(0)