美文网首页
记录一次从一个数据库取数据存入到另一个数据库中的操作过程

记录一次从一个数据库取数据存入到另一个数据库中的操作过程

作者: employeeeee | 来源:发表于2019-12-17 11:03 被阅读0次

    项目开发过程中 服务器出现了一些问题 很多的程序都不能用了 其中就有一个功能需要从一个sql server的数据库中取数据 再录入到oracle的库中 过程中也出现了一些小问题 记录一下

    1. 因为是对两个不同的数据库进行操作 所以先要将两个库的jar包引入,需要注意jdk1.8需要使用sqljdbc4.jar,使用sqljdbc.jar会报错。


      image.png
    2. 创建连接类DB2

    import java.sql.*;
    
    
    public class DB2 {
        protected final String URL2="jdbc:sqlserver://172.xx.xxx.xx:xxxx;DatabaseName=xxxx";
        protected final String URL="jdbc:oracle:thin:@xxx.xx.xxx.xx:1521:ORCL";
        protected final String USER="xxxx";
        protected final String USER2="xx";
        protected final String USER3="xx";
        protected final String PWD="xxxx";
        protected final String PWD2="xxxxx";
        protected final String PWD3="xxxx";
        protected Connection conn;
        protected PreparedStatement ps;
        protected ResultSet rs;
    
        public Connection getconn(){
            try {
    //          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn=DriverManager.getConnection(URL,USER,PWD);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return conn;
        }
        public void getconn2(){
            try {
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                conn=DriverManager.getConnection(URL2,USER2,PWD2);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public void getconn3(){
            try {
    //          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn=DriverManager.getConnection(URL,USER3,PWD3);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public void close(){
            try {
                if(rs!=null){
                    rs.close();
                }
                if(ps!=null){
                    ps.close();
                }
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    }
    
    

    其中把自己对应的数据库信息录入就可以 可以看到第一个getconn方法是有返回值的。是因为想给insert方法添加上事务。后边会具体说。

    1. 然后新建了一个任务类
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.Timer;
    import java.util.TimerTask;
    
    /**
     * Created with IntelliJ IDEA.
     * User: employeeeee
     * Date: 2019/12/16
     * Time: 11:13
     * Description: No Description
     */
    public class Task {
    
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        public void delete(){
            DB2 db=new DB2();
            db.getconn();
            String sql="delete from  t_realdata where systype=7";
            try{
                db.ps=db.conn.prepareStatement(sql);
                db.ps.executeUpdate();
            }catch(SQLException e){
                e.printStackTrace();
            }
            db.close();
        }
    
        public void seletAllWellVC(DB2 db2) {
            int count = 6000;
            DecimalFormat fg = new DecimalFormat("#,###,00");
            DB2 db = new DB2();
            db.getconn2();
            String sql = "select t.id,t.Point_name,t.value,t.Date_,zhsw.dbo.fun_getPY(t.Point_code) as Point_code from zhsw.dbo.t_data_huaxu t where point_name like '%*_%' ESCAPE '*' and point_name like '%井%电压'\n" +
                    "union all\n" +
                    "select t.id,t.Point_name,t.value,t.Date_,zhsw.dbo.fun_getPY(t.Point_code) as Point_code  from zhsw.dbo.t_data_huaxu t where point_name like '%*_%' ESCAPE '*' and point_name like '%井%电流'";
            try {
                db.ps = db.conn.prepareStatement(sql);
                db.rs = db.ps.executeQuery();
                while (db.rs.next()) {
                    count++;
                    String code = db.rs.getString("Point_code");
                    String datatime = db.rs.getString("Date_");
                    datatime = datatime.substring(0, 19);
                    double flow = db.rs.getDouble("value");
                    insert(count,code,datatime,flow,db2);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            db.close();
        }
    
       public void insert(Integer count,String code,String datatime,double flow,DB2 db){
           String sqls="insert into t_realdata(ID,POINTCODE,VALUE,INSERTTIME,SYSTYPE) values(?,?,?,TO_DATE(?,'YYYY-MM-DD HH24:MI:SS'),7)";
           try{
               db.ps=db.conn.prepareStatement(sqls);
               db.ps.setInt(1,count);
               db.ps.setString(2,code);
               db.ps.setString(3,flow+"");
               db.ps.setString(4,datatime);
               db.ps.executeUpdate();
              //如果不加会导致游标报错
               db.ps.close();
           }catch(SQLException e){
               e.printStackTrace();
           }
        }
    
        public Task(){
            Timer timer = new Timer();
            DB2 db=new DB2();
            Connection connection = db.getconn();
            try {
                connection.setAutoCommit(false);
                int delay = 1000;//ms
                // 一秒一运行
                int period = 1000*60;//ms
                timer.schedule(new TimerTask() {
                    int i = 1;
                    public void run() {
                        delete();
                        seletAllWellVC(db);
                        try {
                            //事务提交
                            connection.commit();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                        i++;
                        System.out.println(i);
                    }
                }, delay, period);
            } catch (SQLException e) {
                try {
                    connection.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }
    
        }
    }
    
    

    只写了两个方法,一个是查询方法,一个是存储的方法。
    存储的方法还是有点问题的,因为把insert写到了循环的方法中。如果不在insert的方法之后添加一个ps的close的话就会出现游标的报错。
    而且最开始的时候没有添加事务 会导致数据没有录入完成就进行了删除 导致会出现id重复的报错,建议还是把方法修改为批量加入的方法。当然也是要加上事务的。
    并且写了一个定时任务 一分钟执行一次 保证实时数据的展示。
    然后通过main方法执行就可以了

    /**
     * Created with IntelliJ IDEA.
     * User: employeeeee
     * Date: 2019/12/16
     * Time: 11:23
     * Description: No Description
     */
    public class Main {
        public static void main(String[] args) {
            new Task();
        }
    }
    
    
    1. 最后打jar包的时候 出现了
      java.lang.SecurityException: Invalid signature file digest for Manifest main attributes的报错
      最后通过
    zip -d your.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'  
    

    解决问题

    相关文章

      网友评论

          本文标题:记录一次从一个数据库取数据存入到另一个数据库中的操作过程

          本文链接:https://www.haomeiwen.com/subject/rwtsnctx.html