存储过程-增量同步ftp文本文件到数据库的过程

一、编写ftp文本文件的下载导入功能

1.编写开启线程,一张表可开一个线程,可以提高效率

 //@Scheduled(cron = "0 0 0 * * ?")
    public void downloadFile(String rundate) throws IOException, SQLException, ClassNotFoundException {
        logger.info("**********进入定时任务****************");

        Thread t1 = new DataThread("ftp_file1_names");
//        Thread t2 = new DataThread("ftp_file2_names");
//        Thread t3 = new DataThread("ftp_file3_names");

        t1.start();
//        t2.start();
//        t3.start();
        //阻塞Main线程,完毕后继续执行后续的逻辑
        try {
            t1.join();
//            t2.join();
//            t3.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
        tableTotable();
        deleteFile();
    }

2.编写线程类

package com.yihuisoft.job.service;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import com.yihuisoft.job.service.utils.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author :huxinkuo
 * @version :V1.0
 * @Description:线程启动定时任务(担心线程锁影响效率,将所有方法均放入run()中)
 * @date :2017年11月27日 下午8:23:03
 */

public class DataThread extends Thread {

    private static final Logger logger = LoggerFactory.getLogger(DataThread.class);


    // 通过CommonUtil.getTftpDownloadPath() 方法获取到项目中的WebContent/download/.
    private static final String localPath = "E:/ftpDownload";


    //private  String fileTempTransPath;


    private PreparedStatement insertAttrPst = null;

    public DataThread(String name) {
        super(name);
    }

    public void run() {
        String job = "pwms.LZDataImport";//任务名称
        //String trg = "DataImportTrg";//触发器
        //记录线程开始时间
        String beginTime = DateUtil.format(new Date());
        //ftp相对路径
        String fileTempTransPath = ParamProvider.getParamValue("import_file_path");
        //数据库jdbc路径
        String jdbcUrl = "jdbc:oracle:thin:@" + ParamProvider.getParamValue("import_jdbcUrl");
        //String jdbcUrl = "jdbc:oracle:thin:@98.11.51.32:1521/uwp";
        //数据库用户名
        String jdbcUser = ParamProvider.getParamValue("import_jdbcUser");
        //String jdbcUser = "fdms_lanzhou";
        //数据库密码
        String jdbcPassword = ParamProvider.getParamValue("import_jdbcPassword");
        //ftp ip路径
        String url = ParamProvider.getParamValue("import_ftp_server");
        //ftp 端口
        int port = Integer.parseInt(ParamProvider.getParamValue("import_ftp_port"));
        //ftp用户名
        String username = ParamProvider.getParamValue("import_ftp_user");
        //ftp密码
        String password = ParamProvider.getParamValue("import_ftp_pwd");
        //文件下载路径
        String workPath = localPath + fileTempTransPath;

        //获取文件数组,通过|拆分表
        String fileNameStr = ParamProvider.getParamValue(this.getName());
        String fileNameIns = ParamProvider.getParamValue("import_uwp_fileNameIns");
        String[] fileNames = StringUtils.split(fileNameStr, "|");
        for (String checkName : fileNames) {
            String table = checkName.substring(0, checkName.length() - 4);

            if (checkName.indexOf(".dat") != -1) {
                int deleteNum = 0;
                try {
                    String sql = "truncate table " + table;
                    Class.forName("oracle.jdbc.driver.OracleDriver");
                    Connection con = (Connection) DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
                    // 关闭事务自动提交
                    con.setAutoCommit(false);

                    Statement st = con.createStatement();
                    deleteNum = st.executeUpdate(sql);
                    st.close();
                    con.close();
                    logger.info("删除 " + checkName + " 数据成功!数据量: " + deleteNum);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            List<String> dirList = new ArrayList<String>();
            //计算前一天的时间格式,作为文件名,
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            calendar.add(Calendar.DAY_OF_MONTH, -2);
            String startTime = DateUtil.format(new Date());
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
            String dir = simpleDateFormat.format(calendar.getTime());

            //TODO 此处写死 测试  上线时注释掉  
            //dirName = "20171101";
            //根据文件名称查询文件夹名称
            if (fileNameIns.indexOf(checkName) != -1) {
                try {
                    String sql = "SELECT DIR_NAME FROM TABLE_DEFAULT WHERE FILE_NAME = '" + checkName + "' ORDER BY DIR_NAME";

                    Class.forName("oracle.jdbc.driver.OracleDriver");
                    Connection con = (Connection) DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
                    // 关闭事务自动提交
                    con.setAutoCommit(false);
                    PreparedStatement pstmt = con.prepareStatement(sql);
                    ResultSet rs = pstmt.executeQuery();
                    while (rs.next()) {
                        dirList.add(rs.getString(1));
                    }
                    pstmt.close();
                    con.close();
  
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值