各位技术大牛,请教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(); } } } }
相关推荐
在Java中,将JSON格式的数据导入Oracle数据库是一项常见的任务,这通常涉及到解析JSON、处理数据对象以及与数据库交互的步骤。以下是一些关于这个主题的重要知识点: 1. JSON解析: - Jackson库:Jackson是Java中...
当我们面对大量结构化数据,例如Excel表格,需要将其导入到关系型数据库如Oracle时,通常会利用编程语言如Java来实现自动化处理。这篇博客“Excel树形结构数据导入Oracle数据库”提供了一个解决方案,下面将详细解析...
这种Oracle-Java集成方案的优点是实时性高,因为数据一旦插入,触发器就立即执行,无需额外的轮询或调度。然而,也需要注意潜在的问题,如性能开销、数据库阻塞和复杂性增加。因此,在实际应用中,应谨慎评估是否真...
5. **数据复制**:获取到数据后,你需要将它们插入到目标数据库。同样,使用`PreparedStatement`可以执行INSERT语句。注意处理可能出现的并发问题,比如确保数据的一致性和避免重复插入。 6. **异常处理和日志记录*...
4. **数据导入**:数据导入到Oracle数据库通常使用JDBC(Java Database Connectivity),它是Java与数据库交互的标准API。开发者可以通过PreparedStatement或Statement对象执行SQL的`INSERT`语句,批量插入数据,...
- 考虑到并发问题,可能需要使用乐观锁或者悲观锁策略。乐观锁可以通过版本字段或时间戳实现,悲观锁则通过`SELECT ... FOR UPDATE`语句实现。 8. **性能优化**: - 为避免过多的数据库交互,可以考虑缓存序列号...
总结,这个Java项目结合Swing和Oracle数据库,构建了一个全面的飞机订票系统,实现了从购票到售后服务的全流程管理。通过合理的设计和优化,不仅满足了用户的需求,也为后台管理和数据分析提供了强大支持,体现了...
SQL*Loader是Oracle提供的一种强大工具,专门用于将数据从外部文件批量加载到数据库表中。对于CSV文件,SQL*Loader通过控制文件定义数据格式,可以高效地完成导入工作。控制文件包含了字段映射、数据转换规则等配置...
在向Oracle数据库插入中文数据之前,需要将其转换为Oracle能够识别的编码格式。通常情况下,Oracle使用ISO-8859-1编码。 **示例代码:** ```java String chinese = "你好"; String encoded = ECov.gb2asc(chinese);...
在Java中,你可以通过`Geometry`对象来表示这些空间数据,并使用xtreme for Java的API进行插入、更新和查询操作。 6. **优化性能**:Oracle Spatial提供了索引和查询优化机制,例如R-树索引,以提高空间查询的性能...
2. **Oracle数据库操作**:一旦建立了连接,我们可以通过`Statement`或`PreparedStatement`对象来执行SQL语句,包括查询、插入、更新和删除数据。在本示例中,还涉及到调用Oracle数据库中的函数和存储过程,这通常...
总的来说,通过JAVA和JDBC进行Oracle到Sybase的数据导入是一个涉及多方面技能的任务,包括数据库操作、JAVA编程、数据转换和性能优化等。熟练掌握这些技能,将有助于顺利完成这种复杂的数据迁移项目。
在实际开发中,你可能还需要考虑如何处理并发访问、数据安全和备份恢复等问题。 总的来说,"java实现BLOB图片大文件在Oracle中的存储和查找"是一个很好的实践项目,它涵盖了Java编程、数据库操作和MVC设计模式等多...
本书旨在教授读者如何在Oracle环境下利用JDBC(Java Database Connectivity)这一关键技术来访问关系型数据。 #### 二、JDBC简介 - **1.1 JDBC API**:这部分介绍了JDBC API的基本概念和组成部分,包括...
项目中未具体说明是哪种策略,但考虑到数据量大,可能更倾向于采用定时任务以减少对数据库系统的实时压力。 总的来说,这个项目展示了如何利用SpringBoot的灵活性和强大功能,结合Oracle和MySQL的特点,以及Druid的...
数据存储部分,可能需要使用JDBC(Java Database Connectivity)来连接Oracle数据库,执行SQL语句进行数据的插入、更新和查询操作。 在压缩包内的文件“hakesashou”,可能是该爬虫项目的源代码文件,或者是一个...
在示例代码中,我们创建了一个`PreparedStatement`对象,预编译了SQL插入语句,然后在循环中填充参数并调用`addBatch()`将每条数据添加到批处理队列中。最后,通过`executeBatch()`一次性执行所有待插入的数据。 ...
作为一名应届生,Java开发工程师或测试工程师,掌握Oracle数据库技术是至关重要的。Oracle作为业界广泛使用的数据库管理系统,它的知识深度和广度都是面试官考察候选人能力的重要方面。以下是一些核心的Oracle知识点...
这个工具提供了与Oracle数据库交互的功能,可能是为了简化数据库操作、数据查询、管理或维护。 【描述】中提到的“基于Java的实例源码-Oracle数据库工具 WARTS.zip”进一步确认了这是一个包含源代码的压缩文件,...