前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java实现Oracle到MySQL的表迁移

Java实现Oracle到MySQL的表迁移

作者头像
百川AI
发布2021-10-19 15:57:18
2K0
发布2021-10-19 15:57:18
举报
文章被收录于专栏:我还不懂对话

第一次写博客,希望能帮到别人,同时愿意相互进行一些讨论,互相进步。

    最近在做有关项目的时候,由于服务器数据库被其他人算法读取,导致我读取的时候很慢,于是乎打算将自己需要的表导入到本地的mysql数据库进行处理,刚开始当然是不想写代码,尝试用kettle实现表迁移,但是无奈数据量较大,可kettle内存溢出。痛下决心自己实现。基本思路就是先从数据库中抽取出数据存储到ResultSet的一个集合中,一个next,存到一个List>,为避免内存溢出,设置数组大小超过一个阈值就写入数据库,然后清空又重新读取,在写入。其实这个也是借鉴于kettle的提交Size;

首先是分别建立MySQL和Oracle的链接方法。

Oracle数据连接

代码语言:javascript
复制
public static Connection getConnection(){
Connection conn = null;
String DRIVER="oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:XE";// 127.0.0.1是本机地址,XE是精简版Oracle的默认数据库名
String user = "user";// 用户名,系统默认的账户名
String password = "***";// 你安装时选设置的密码
try {
Class.forName(DRIVER);// 加载数据库驱动程序
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url, user, password);// 获得Connection对象
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

其实mysql方法和Oracle一样的,只是换成mysql的驱动和数据库罢了:

代码语言:javascript
复制
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/spider";
String user = "root";
String password = "***";

然后是抽取数据了:

代码语言:javascript
复制
public static List> tableInput() throws FileNotFoundException,
SQLException {
List> FindList = new ArrayList>();
Connection con = Oracle_con.getConnection();
PreparedStatement pre = null;
ResultSet resultSet = null;
String sql = "SELECT ID,MEDID,COMMODITYNAME,JBBM,JBMC,JZHOSPITALID,DOCTORNAME FROM DISEASE_DRUG_ASSOCIATE_test";
try {
pre = con.prepareStatement(sql);
resultSet = pre.executeQuery();
String[] columu = {"ID","MEDID","COMMODITYNAME","JBBM","JBMC","JZHOSPITALID","DOCTORNAME"};
int i=0;
while (resultSet.next()) {
List minList = new ArrayList();
for(String each:columu){
minList.add(resultSet.getString(each));
}
FindList.add(minList);
i++;
if(i%10000==0){ //设置的每次提交大小为10000
executeManySql(FindList);
FindList.removeAll(FindList);
System.out.println(i);
}
}
executeManySql(FindList);//最后别忘了提交剩余的
return FindList;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pre.close();// 关闭Statement
} catch (SQLException e) {
e.printStackTrace();
}
try {
con.close();// 关闭Connection
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}

executeManySql(FindList)函数如下,因为数据量比较大,所以我设置的每次提交大小为10000,这样就不会内存溢出了。

代码语言:javascript
复制
public static void executeManySql(List> FindList) throws SQLException {
    Connection con = mysqlConnection.getConnection();
    con.setAutoCommit(false);
    Statement stat = null;

    PreparedStatement pst = (PreparedStatement) con
            .prepareStatement("insert into disease_drug_associate_view values (?,?,?,?,?,?,?)");
    for (List minList: FindList) {
        for(int i=0;i

同时我还设置了计时的函数,可以看到这个从数据抽取到完成数据迁移的时间。

代码语言:javascript
复制
public static void main(String[] args) throws FileNotFoundException,
SQLException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
TimeZone t = sdf.getTimeZone();
t.setRawOffset(0);
sdf.setTimeZone(t);
Long startTime = System.currentTimeMillis();
//此段为要放置测取时间的函数
mysqlConnection.executeSql("TRUNCATE table disease_drug_associate_view");
List> newDrug = tableInput();

Long endTime = System.currentTimeMillis();
System.out.println("用时:" + sdf.format(new Date(endTime - startTime)));
}

其实用时真不好说,这个和程序本身、抽取数据的主机以及本机的硬盘读取速度有比较大的关系。

最终我抽取的数据是84800000,将近2G的数据,机械硬盘,用时:00:57:13:313,五十七分钟还是可以了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/03/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档