将大型ResultSet写入文件
我正在尝试将大的ResulSet(〜1mm行)写入单个文件。在Java 1.6中,有没有一种首选/有效的方法来做到这一点?
回答:
这取决于所使用的JDBC驱动程序。您需要指示JDBC驱动程序
ResultSet
事先将其全部加载到Java内存中,而应在每次next()
调用时逐行加载。然后,在ResultSet#next()
循环内部,您需要
将数据写入文件,而不是将其保存在文件中List
。
不清楚您使用的是哪种JDBC驱动程序,但是例如,可以指示MySQL
JDBC驱动程序按照MySQL
JDBC驱动程序文档的以下方式按行提供结果集:
结果集
默认情况下,完全检索结果集并将其存储在内存中。在大多数情况下,这是最有效的操作方式,而且由于MySQL网络协议的设计更易于实现。如果您正在使用具有大量行或较大值的ResultSet,并且无法在JVM中为所需的内存分配堆空间,则可以告诉驱动程序一次将结果流回一行。
要启用此功能,您需要按以下方式创建一个Statement实例:
stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
这是一个具体的启动示例:
try ( PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream("/records.txt")), "UTF-8"));
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
) {
statement.setFetchSize(Integer.MIN_VALUE);
try (ResultSet resultSet = statement.executeQuery("SELECT col1, col2, col3 FROM sometable")) {
while (resultSet.next()) {
writer.append(resultSet.getString("col1")).append(",")
.append(resultSet.getString("col2")).append(",")
.append(resultSet.getString("col3")).println();
}
}
}
顺便说一句,我首先要检查数据库是否没有对此的内置SQL支持,这可以更有效地完成此任务。例如,MySQL为此提供了一个SELECT INTO
OUTFILE构造。
所述
SELECT ... INTO OUTFILE
'file_name'的形式
SELECT
的选择的行写入到一个文件中。该文件是在服务器主机上创建的,因此您必须具有FILE
使用此语法的特权。file_name不能是现有文件,这尤其可以防止/etc/passwd
销毁诸如和数据库表之类的文件。从MySQL5.1.6开始,
character_set_filesystem
系统变量控制文件名的解释。
以上是 将大型ResultSet写入文件 的全部内容, 来源链接: utcz.com/qa/412127.html