`

java 并发插入数据到oracle

阅读更多

各位技术大牛,请教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();

本人对多线程不是很了解,多次尝试,没能实现多线程迁移数据,希望有高手指点。谢谢!

 

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();
            }
        }
    }
}

 

转自:http://bbs.csdn.net/topics/390456469

分享到:
评论

相关推荐

    json格式数据到入oracle数据库java源码

    在Java中,将JSON格式的数据导入Oracle数据库是一项常见的任务,这通常涉及到解析JSON、处理数据对象以及与数据库交互的步骤。以下是一些关于这个主题的重要知识点: 1. JSON解析: - Jackson库:Jackson是Java中...

    Excel树形结构数据导入Oracle数据库(Java)

    当我们面对大量结构化数据,例如Excel表格,需要将其导入到关系型数据库如Oracle时,通常会利用编程语言如Java来实现自动化处理。这篇博客“Excel树形结构数据导入Oracle数据库”提供了一个解决方案,下面将详细解析...

    oracle 触发器实时调用java 中http接口

    这种Oracle-Java集成方案的优点是实时性高,因为数据一旦插入,触发器就立即执行,无需额外的轮询或调度。然而,也需要注意潜在的问题,如性能开销、数据库阻塞和复杂性增加。因此,在实际应用中,应谨慎评估是否真...

    JAVA将一个数据中数据定时自动复制(抽取)到另一个数据库

    5. **数据复制**:获取到数据后,你需要将它们插入到目标数据库。同样,使用`PreparedStatement`可以执行INSERT语句。注意处理可能出现的并发问题,比如确保数据的一致性和避免重复插入。 6. **异常处理和日志记录*...

    excel数据导入oracle

    4. **数据导入**:数据导入到Oracle数据库通常使用JDBC(Java Database Connectivity),它是Java与数据库交互的标准API。开发者可以通过PreparedStatement或Statement对象执行SQL的`INSERT`语句,批量插入数据,...

    java通过Mysql实现类似oracle序列功能序列.rar

    - 考虑到并发问题,可能需要使用乐观锁或者悲观锁策略。乐观锁可以通过版本字段或时间戳实现,悲观锁则通过`SELECT ... FOR UPDATE`语句实现。 8. **性能优化**: - 为避免过多的数据库交互,可以考虑缓存序列号...

    Java项目:飞机订票系统(java+swing+Oracle)

    总结,这个Java项目结合Swing和Oracle数据库,构建了一个全面的飞机订票系统,实现了从购票到售后服务的全流程管理。通过合理的设计和优化,不仅满足了用户的需求,也为后台管理和数据分析提供了强大支持,体现了...

    Oracle大数据量导入(CSV导入)

    SQL*Loader是Oracle提供的一种强大工具,专门用于将数据从外部文件批量加载到数据库表中。对于CSV文件,SQL*Loader通过控制文件定义数据格式,可以高效地完成导入工作。控制文件包含了字段映射、数据转换规则等配置...

    java存储oracle中的clob类型

    在向Oracle数据库插入中文数据之前,需要将其转换为Oracle能够识别的编码格式。通常情况下,Oracle使用ISO-8859-1编码。 **示例代码:** ```java String chinese = "你好"; String encoded = ECov.gb2asc(chinese);...

    xtreme for java连接oracle spatial 空间数据库.doc

    在Java中,你可以通过`Geometry`对象来表示这些空间数据,并使用xtreme for Java的API进行插入、更新和查询操作。 6. **优化性能**:Oracle Spatial提供了索引和查询优化机制,例如R-树索引,以提高空间查询的性能...

    Java操作Oracle数据库-多线程.rar

    2. **Oracle数据库操作**:一旦建立了连接,我们可以通过`Statement`或`PreparedStatement`对象来执行SQL语句,包括查询、插入、更新和删除数据。在本示例中,还涉及到调用Oracle数据库中的函数和存储过程,这通常...

    oracle 数据导入sybase

    总的来说,通过JAVA和JDBC进行Oracle到Sybase的数据导入是一个涉及多方面技能的任务,包括数据库操作、JAVA编程、数据转换和性能优化等。熟练掌握这些技能,将有助于顺利完成这种复杂的数据迁移项目。

    java实现 BLOB图片大文件在oracle中的存储和查找

    在实际开发中,你可能还需要考虑如何处理并发访问、数据安全和备份恢复等问题。 总的来说,"java实现BLOB图片大文件在Oracle中的存储和查找"是一个很好的实践项目,它涵盖了Java编程、数据库操作和MVC设计模式等多...

    Java Programming with Oracle JDBC

    本书旨在教授读者如何在Oracle环境下利用JDBC(Java Database Connectivity)这一关键技术来访问关系型数据。 #### 二、JDBC简介 - **1.1 JDBC API**:这部分介绍了JDBC API的基本概念和组成部分,包括...

    springboot+mysql+oracle+druid 双数据库进行数据同步

    项目中未具体说明是哪种策略,但考虑到数据量大,可能更倾向于采用定时任务以减少对数据库系统的实时压力。 总的来说,这个项目展示了如何利用SpringBoot的灵活性和强大功能,结合Oracle和MySQL的特点,以及Druid的...

    百度百科多线程爬虫Java源码,数据存储采用了Oracle11g.zip

    数据存储部分,可能需要使用JDBC(Java Database Connectivity)来连接Oracle数据库,执行SQL语句进行数据的插入、更新和查询操作。 在压缩包内的文件“hakesashou”,可能是该爬虫项目的源代码文件,或者是一个...

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    在示例代码中,我们创建了一个`PreparedStatement`对象,预编译了SQL插入语句,然后在循环中填充参数并调用`addBatch()`将每条数据添加到批处理队列中。最后,通过`executeBatch()`一次性执行所有待插入的数据。 ...

    应届生 java开发工程师 测试工程师 oracle面试总结

    作为一名应届生,Java开发工程师或测试工程师,掌握Oracle数据库技术是至关重要的。Oracle作为业界广泛使用的数据库管理系统,它的知识深度和广度都是面试官考察候选人能力的重要方面。以下是一些核心的Oracle知识点...

    基于Java的实例源码-Oracle数据库工具 WARTS.zip

    这个工具提供了与Oracle数据库交互的功能,可能是为了简化数据库操作、数据查询、管理或维护。 【描述】中提到的“基于Java的实例源码-Oracle数据库工具 WARTS.zip”进一步确认了这是一个包含源代码的压缩文件,...

Global site tag (gtag.js) - Google Analytics