0 0

java将oracle一个表空间的数据同步到另一个表空间的数据,来看看有没有问题5

代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class Bak {
	
	public static String shengchanku = "aaa";//生产库登录名
	public static String shengchanku_pw = "1";//生产库密码
	public static String shengchanku_serviceName = "127.0.0.1";//生产库服务名
	
	public static String ceshiku = "aaatest";//测试库登录名
	public static String ceshiku_pw = "1";//测试库密码
	public static String ceshiku_serviceName = "127.0.0.1";//测试库服务名
	
	/**
	 * @param args
	 * @throws SQLException
	 */
	public static void main(String[] args){
		Date d = new Date();
		long start = d.getTime();
		String msg = "";
		Connection conn = null;
		try {
			conn = getConnection();
		} catch (Exception e1) {
			msg = "获取生产库链接失败";
		}
		Connection connTest = null;
		try {
			connTest = getTestConnection();
		} catch (Exception e1) {
			msg = "获取测试库链接失败";
		}
		if("".equals(msg)){
			try {
				//开启事务
				conn.setAutoCommit(false);
				
				//查询出生产库所有表的名称
				List<String> list_table_names = new ArrayList<String>();
				Statement stmt = conn.createStatement();
				ResultSet rs = stmt.executeQuery("select table_name from user_tables");
				while(rs.next()){
					list_table_names.add(rs.getString(1));
				}
				rs.close();
				stmt.close();
				
				//查询测试库所有表的名称
				List<String> list_table_names_test = new ArrayList<String>();
				stmt = connTest.createStatement();
				rs = stmt.executeQuery("select table_name from user_tables");
				while(rs.next()){
					list_table_names_test.add(rs.getString(1));
				}
				
				//拼接往测试库每个表插数据的sql
				String table_name = "";
				List<String> sql_create = new ArrayList<String>();
				for(int i =0;i<list_table_names.size();i++){
					table_name = list_table_names.get(i);
					sql_create.add("create table "+ceshiku+"."+table_name+" AS SELECT * FROM "+shengchanku+"."+table_name+"");
				}
				
				//拼接删除测试库表的sql
				List<String> sql_drop = new ArrayList<String>();
				for(int i =0;i<list_table_names_test.size();i++){
					table_name = list_table_names_test.get(i);
					sql_drop.add("drop table "+ceshiku+"." + table_name);
				}
				
				//删除测试库的数据
				stmt = conn.createStatement();
				for(int i = 0 ;i<sql_drop.size();i++){
					stmt.addBatch(sql_drop.get(i));
				}
				
				//执行删除sql
				int[] result = stmt.executeBatch();
				System.out.println("执行删除表:" + result.length);
				stmt.close();

				//重新创建测试库的数据
				stmt = connTest.createStatement();
				for(int i = 0 ;i<sql_create.size();i++){
					stmt.addBatch(sql_create.get(i));
				}
				
				//执行创建sql
				result = stmt.executeBatch();
				System.out.println("执行创建表:" + result.length);
				stmt.close();
				
				//提交事务
				conn.setAutoCommit(true);
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				try {
					conn.close();
					connTest.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}else{
			System.out.println(msg);
		}
		
		d = new Date();
		long end = d.getTime();

		System.out.println("执行时间:" + (end-start) + "毫秒");
	}
	
	//获取生产库链接
	public static Connection getConnection() throws Exception{
		Connection ct = null;
		Class.forName("oracle.jdbc.driver.OracleDriver");
		ct = DriverManager.getConnection("jdbc:oracle:thin:"+shengchanku+"/"+shengchanku_pw+"@"+shengchanku_serviceName+":1521:orcl");
		return ct;
	}
	
	//获取测试库链接
	public static Connection getTestConnection() throws Exception{
		Connection ct = null;
		Class.forName("oracle.jdbc.driver.OracleDriver");
		ct = DriverManager.getConnection("jdbc:oracle:thin:"+ceshiku+"/"+ceshiku_pw+"@"+ceshiku_serviceName+":1521:orcl");
		return ct;
	}

}



大伙来看看这样写有没有什么问题,性能如何,我执行时间大概10秒多,数据量不是很大,不过有个附件表,表空间数据全部导出来大概有300多M

问题补充:两个用户对应两个不同的表空间,但在同一个库里
2013年3月28日 09:31

1个答案 按时间排序 按投票排序

0 0

采纳的答案

看不出什么大问题。只是小问题好多,哈。

setAutoCommit是指是否自动提交,不是开启事务。
你的SQL文貌似都不能回滚的,应该不需要动这个。

另外,这个处理不是

引用
将oracle一个表空间的数据同步到另一个表空间的数据

应该是用户(或者schema),而不是表空间。
表空间是指物理意义上的数据文件。

-------------------

Class.forName("oracle.jdbc.driver.OracleDriver");
调用一遍就好了。

拼SQL文同时直接做批处理就好了,为什么又循环一次。
任意个connection建立失败时,在catch块里直接return掉,就可以省去那个最大的
if("".equals(msg)){  
...
}

嵌套

2013年3月28日 17:38

相关推荐

    mysql导数据到oracle

    标题“mysql导数据到oracle”涉及的是数据库迁移或数据同步的过程,从MySQL数据库系统将数据迁移到Oracle数据库系统。在IT行业中,这种操作通常用于升级数据库系统、整合多个数据库或者在不同平台间转移数据。 描述...

    kettle ETL随机启动mysql-oracle间数据同步教程

    - **数据流线**:定义各个转换步骤之间的数据流,即数据如何从一个步骤流向另一个步骤。 - **数据转换**:对数据进行处理,如字段选择、字段转换、中文乱码处理等。 - **表输出**:将处理后的数据加载到目标...

    数据库同步系统_javaoracle_CC08FB424F88_92444.c.c_B51.955-2004_44efbf3ab

    标题“数据库同步系统_javaoracle_CC08FB424F88_92444.c.c_B51.955-2004_44efbf3ab”暗示了这是一个关于数据库同步系统的项目,它可能使用Java和Oracle数据库技术。其中的标签进一步细化了相关技术,如“CC08FB424...

    springboot-multi-datasource_oracle_hardbqi_数据传输_jumpa2p_多数据源数据传输

    "jumpa2p"可能是一个自定义的库或工具,它在数据传输过程中起到关键作用,可能是用于在Oracle和MySQL之间进行数据迁移或同步。然而,由于缺乏详细信息,我们只能猜测其功能,具体实现方式需要查看项目的源代码或相关...

    2011版魔乐MLDN李兴华主讲_1-Oracle简介.rar

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,由美国甲骨文公司(Oracle Corporation)开发和维护。...对于希望从事IT行业,特别是数据库管理或者Java开发的人员来说,这是一个非常有价值的资料集合。

    Solr数据库连接[SQL,Oracle]

    在Solr中,有时我们需要与传统的关系型数据库如SQL Server或Oracle进行交互,以获取数据或者同步数据库中的信息到Solr索引中。本文将详细介绍如何在Solr中建立与SQL Server和Oracle的连接,并解决可能出现的连接问题...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    2. oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat 3. 运行该批处理程序将自动完成oracle卸载工作,最后手动删除\app文件夹(可能需要重启才能删除) 4. 运行...

    mysql+oracle数据库驱动程序

    这可能是因为系统中有部分数据存储在MySQL中,另一部分数据存储在Oracle中,或者需要实现数据迁移、同步等功能。为了确保程序的稳定性和兼容性,开发者需要对两种数据库的特性有深入理解,例如SQL语法差异、事务管理...

    Java学习笔记(必看经典)

    这份“Java学习笔记(必看经典)”涵盖了Java语言的基础到进阶内容,对于想要深入理解Java的开发者来说是一份宝贵的资源。 首先,Java语言基础包括语法结构、数据类型、变量、运算符、流程控制等。Java支持两种主要的...

    Java学习笔记(必看经典).doc

    这份“Java学习笔记(必看经典).doc”文档将涵盖Java的核心概念和重要知识点,对于初学者和有经验的开发者来说都是宝贵的参考资料。 首先,Java的基础部分通常包括以下几个方面: 1. **Java语法基础**:这是所有...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    超级有影响力霸气的Java面试题大全文档

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    oracle总结文档

    Oracle数据库系统是一个复杂而强大的关系型数据库管理系统,其在企业级应用中占据着重要的地位。本文将对Oracle的几个核心概念和技术进行详细解释。 首先,我们来看一下Oracle的内存结构,特别是SGA(System Global...

    Java全能速查宝典

    2. **封装性**:封装是OOP的一个核心特性,指的是将数据和操作数据的方法绑定在一起,隐藏对象的属性和实现细节,仅对外提供接口。 3. **继承性**:一个类可以继承另一个类的属性和方法,从而实现代码重用和功能扩展...

    JAVA新手必看的学习资料

    "JAVA新手必看的学习资料"这一资源显然是一个为Java初学者量身定制的教程集合,旨在帮助新手快速入门并深入理解Java编程基础。 首先,Java是一种广泛使用的面向对象的编程语言,它以其平台独立性、高效性和强大的...

    JAVA自学之路

    经常的进行知识难点的查询,如果一个问题牵扯的面比较广,就干脆到网上搜索一些相关的专题,比如“java 乱码 mysql” “oracle 创建用户”等等,如果有必要,不要犯懒,勤动手写一些小小的测试程序,来弄明白知识点...

    MaxCompute数据开发实战—数据进入MaxCompute的N种方式.pdf

    - **DataX**:DataX是一个开源的异构数据源间的数据同步工具,支持包括MySQL、Oracle、SQLServer、PostgreSQL、HDFS、Hive、ADS、HBase、OTS、OSS、MaxCompute等多种数据源之间的数据同步。DataX的执行机制基于Java...

    Java开发中几个可以常去看的外国网站

    - 对于想要深入了解 Java 平台最新特性和最佳实践的开发者来说,这是一个宝贵的资源。 - 经常更新的内容确保开发者能够紧跟技术发展的步伐。 #### 2. **Java 官方网站 (http://java.sun.com)** - **简介**:这是...

    JAVA编程人员必看

    "JAVA编程人员必看"这一标题暗示了本资料将涵盖Java编程的基础到高级概念,是学习者提升技能的重要资源。 【面向对象编程】 Java的核心特性之一是面向对象编程(OOP)。在Java中,一切皆为对象,类是创建对象的...

Global site tag (gtag.js) - Google Analytics