xiaotudou86 2013-03-28 09:31
浏览 266
已采纳

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

代码如下:
[code="java"]
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;
}

}

[/code]

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

  • 写回答

1条回答 默认 最新

  • clxy大叔 2013-03-28 17:38
    关注

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

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

    另外,这个处理不是
    [quote]将oracle一个表空间的数据同步到另一个表空间的数据[/quote]
    应该是用户(或者schema),而不是表空间。
    表空间是指物理意义上的数据文件。


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

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

    ...
    }
    [/code]
    嵌套

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)