将表数据备份到其它数据库中,采用多线程并行执行提高备份效率,实现多个副本、异地保存管理。
下面将 Member 表数据备份到另两个不同的数据库中。
1. 集算器编写脚本demo.dfx:
A | B | C | |
1 | =connect("mysql") | / 连接数据库 | |
2 | =A1.query@x("select * from MEMBER where ID<=250000") | / 查询表数据 | |
3 | fork | =connect("mysql2") | / 连接 mysql2 数据库 |
4 | >B3.update@a(A2, MEMBER) | / 线程执行 SQL 插入数据 | |
5 | >B3.close() | / 关闭连接 | |
6 | fork | =connect("mysql3") | / 连接 mysql3 数据库 |
7 | >B6.update@a(A2, MEMBER) | / 线程执行 SQL 插入数据 | |
8 | >B6.close() | / 关闭连接 |
提示:db.update@a()执行前清空目标表的数据,再执行 update(),效率快得多。若是要增量备份,可选择 @i 等其它选项。
Java 中调用这段脚本:
publicstaticvoid doWork() {
Connection con = null;
java.sql.Statement st;
try{
Class.forName("com.esproc.jdbc.InternalDriver");
con = DriverManager.getConnection("jdbc:esproc:local://");
// 调用脚本 demo.dfx
st=con.createStatement();
ResultSet rst = st.executeQuery("call demo");
System.out.println(rst);
} catch(Exception e){
System.out.println(e);
} finally{
// 关闭连接
if (con!= null) {
try {
con.close();
} catch(Exception e) {
System.out.println(e);
}
}
}
}
当要备份的表数据量比较大时,获取数据可采用游标方式,将 update() 中的 A2 改为游标,SPL 作类似处理。需要注意每个线程要有自己的游标,否则线程都从同一个游标取数,每个线程只会取到一部分。