【发布时间】:2014-12-10 20:09:52
【问题描述】:
数据库管理系统 - mysql
语言 - Java
我有两个数据库
数据库一 - 我只有 SELECT 访问权限。
数据库二 - 完全访问。
具体要求:-
我必须将许多表从数据库一导入到数据库二。
当前解决方案:-
-
我正在从表中选择所有行并将结果存储在 ResultSet 中。
String sql = "SELECT * FROM " + tableName +" ;"; Result Set res = runSql(sql); -
将 ResultSet 中的每一行写入 CSV 文件。
OutputStreamWriter writer = null; writer = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8"); while (res.next() ){ for (int j = 1; j <= noOfColumns.size(); j++) { if(j != 1) writer.append(","); writer.append("\""+res.getString(j)+"\""); } writer.append("\n"); } -
使用 LOAD DATA INFILE 从 CSV 文件填充数据库 2。
String sql = "LOAD DATA LOCAL INFILE '"+fileName+"' INTO TABLE "+tableName+ " CHARACTER SET UTF8 "+" COLUMNS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"\n\";"; return runSql(sql); 对所有表重复此过程。
我的问题:-
由于某些表的行数超过数百万,我可以做得更好吗? 我发现大部分时间都用于第 2 步(将 ResultSet 写入 CSV)。
【问题讨论】:
-
数据库在同一台服务器上是偶然的吗?
-
不,数据库位于不同的服务器上。而且我对数据库一知之甚少。我对数据库 One 没有任何控制权。
-
你不能导出导入功能。不是从 DB1 读取然后写入文件,而是直接将数据从 DB1 导出到文件中,然后在 DB2 中导入数据。这将节省文件写入和对结果集的迭代。
-
@NachiketKate 你能解释一下你的观点吗?我只是一个初学者。而且我也无法在 DB1 服务器中写入任何文件。
-
每个数据库都可以将大型表/数据导出到称为导出操作的文件中。文件格式可用作 csv、自定义分隔符等,也可用于导入相同的导出数据。此功能由 DB 提供,因此它通常比手动查询获取更快地工作 - 遍历结果集 - 写入文件 - 然后插入到 DB。我希望你现在明白了。
标签: java mysql performance import export-to-csv