各位技术大牛,请教java 多线程问题由于项目需要,需要从oracle中dept将表记录迁移到dept2中,dept和dept2表结构一样。
设想:查询:
Statement stmt = conn.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet rs = stmt.executeQuery("select * from dept");通过 rs.last();得到记录的总个数,然后通过这个总个数,多线程实现迁移所有的记录。插入:
PreparedStatement pstmt = null;
        String psql = "insert into dept2 values(?,?,?)";
        pstmt = conn.prepareStatement(psql);其中的index为rs结果集的索引值,当index=1,表示rs.next()的第一个值
                    rs.absolute(index);
                    pstmt.setInt(1, rs.getInt(1));
                    pstmt.setString(2, rs.getString(2));
                    pstmt.setString(3, rs.getString(3));                    pstmt.addBatch();本人对多线程不是很了解,多次尝试,没能实现多线程迁移数据,希望有高手指点。谢谢!
                   
Java并发多线程迁移数据

解决方案 »

  1.   

    可以用一个多线程技术,比如Timer,ScheudeExcuter这样的技术,或则线程池,结合ibatis等持久化小框架。
      

  2.   

    你这么简单的一个业务需要用到多线程吗?
    既然两张表的结构都一样,一条最简单的sql语句不就行了
    insert into dept2 select * from dept
      

  3.   

    方法1:你可以单线程一条一条的查询插入
    方法2:你可以insert into dept2 select * from dept一句sql搞定
    方法3:你可以根据ID多线程插入,例如:你总共100万(id是1-1000000),你可以按照ID划分一个区域,1-10万一个线程,10-20万一个线程,30-40万一个线程等等,这个就要看你实际业务来决定实现方式了,这样不就可以多线程插入了。
      

  4.   

    你要想练习多线程,就别把JDBC扯进来,你要想达到迁移数据的目的,跳开JDBC,直接在数据库中操作。
      

  5.   

    为啥要用java来做呢?如果在同一个表空间下Insert into dept2 select * from dept 不行?
      

  6.   

    有没有创建过一个dept2的字段
      

  7.   


    其实是用Java做一个数据迁移工具,我之前举的例子是一种简单的模拟,就是需要达到这种并发插入数据的效果。不过谢谢回复。
      

  8.   


    迁移涉及的是垮数据库,例如:从oracle导入到mysql等。而不是单数据库操作。不能采用先从oracle将数据导入到txt文档,再通过txt导入到mysql。需要先查询oracle中的记录,再通过JDBC连接Mysql,插入记录到Mysql
      

  9.   

    public class ConcurrentTestPreparedStmt
    {    public static int     totalRowNum;    public static int     index = 1;    public static boolean isFinish;    public static void main(String[] args) throws Exception
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");        String url = "jdbc:oracle:thin:@192.168.5.201:1521:orcl";
            String user = "scott";
            String password = "tiger";        String sql = "select * from dept";        Connection conn = DriverManager.getConnection(url, user, password);        /**
             * 读取
             */
            Statement stmt = conn.createStatement(
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rs = stmt.executeQuery(sql);        /**
             * 写入
             * 使用批处理
             */
            PreparedStatement pstmt = null;
            String psql = "insert into testpstmt values(?,?,?)";
            pstmt = conn.prepareStatement(psql);
            //rs.next 只要为true,说明表中记录数        rs.last();
            totalRowNum = rs.getRow();        int i = 0;
            //问题所在,当 i<2时,表示两个线程,执行时,往目的表中插入了同样一行记录。
            while (i < 1 && !isFinish)
            {
                TaskThread t = new ConcurrentTestPreparedStmt().new TaskThread(
                    pstmt, rs);
                new Thread(t).start();
                i++;
            }        //如果没完成,则主线程等待
            while (!isFinish)
            {
                Thread.sleep(500);
            }
            pstmt.executeBatch();
            conn.commit();        System.out.println("SUCCESS");    }    public synchronized int incrementIndex()
        {
            return index++;
        }    public synchronized int getExecuteNum()
        {
            return index;
        }    /**
         * 并发迁移类
         * @author ttan
         */
        class TaskThread implements Runnable
        {
            PreparedStatement pstmt = null;
            ResultSet         rs    = null;        public TaskThread(PreparedStatement pstmt, ResultSet rs)
            {
                this.rs = rs;
                this.pstmt = pstmt;
            }        @Override
            public void run()
            {            int index = incrementIndex();
                //指定到具体的行数
                try
                {
                    while (index <= totalRowNum)
                    {
                        System.out.println("index = " + index);
                        rs.absolute(index);
                        pstmt.setInt(1, rs.getInt(1));
                        pstmt.setString(2, rs.getString(2));
                        pstmt.setString(3, rs.getString(3));                    pstmt.addBatch();                    index = incrementIndex();
                    }                if (getExecuteNum() > totalRowNum)
                    {
                        isFinish = true;
                        return;
                    }            }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }各位大侠,这是我写的小测试例子,但是当while(i<2),采用两个线程时,不能达到期望结果。欢迎批评指正。