将大型ResultSet写入文件 - java

我正在尝试将大的ResulSet(〜1mm行)写入单个文件。在Java 1.6中,有没有一种首选/有效的方法来做到这一点?

参考方案

这取决于所使用的JDBC驱动程序。您需要指示JDBC驱动程序而不是事先将整个ResultSet加载到Java内存中,而是在每个next()调用中逐行加载。然后,在ResultSet#next()循环内,您需要立即将数据写入文件中,而不是将其保存在List或其他内容中。
目前尚不清楚您使用的是哪种JDBC驱动程序,但是例如,可以指示MySQL JDBC驱动程序按照MySQL JDBC driver documentation按照以下方式逐行提供结果集:

结果集
默认情况下,完全检索结果集并将其存储在内存中。在大多数情况下,这是最有效的操作方式,而且由于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 construct。
SELECT ... INTO OUTFILE 'file_name'SELECT形式将选定的行写入文件。该文件是在服务器主机上创建的,因此您必须具有FILE特权才能使用此语法。 file_name不能是现有文件,这尤其可以防止/etc/passwd和数据库表等文件被破坏。从MySQL 5.1.6开始,character_set_filesystem系统变量控制文件名的解释。

Java:在PreparedStatement(JDBC)中将null传递为long - java

我有一个变量是Long val = null; 而且我正在寻找一种将其传递给PreparedStatement语句对象的方法,以便将数据库中的字段值设置为null。statement.setLong(1,val); 它对Long无效,而对Long则无效。任何输入的想法或建议。谢谢 !!! 参考方案 您应该使用setNull method。statement.…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

JDBC ResultSet总行 - java

我正在我的应用程序中实现分页。为此,我运行查询并获取ResultSet。现在,我想获得此ResultSet中用于分页计算的记录总数。我怎么能得到这个?我不想执行额外的SQL,而这会给我总行数。 参考方案 另一个选择是将计数聚合添加为查询中的子查询列。如果您的数据库有点聪明,它将只执行一次。您应该能够使用自己喜欢的数据库中的查询分析器轻松地检查这一点。SELE…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java:从文件系统加载资源 - java

我的项目设定我有以下项目设置:\program.jar \images\logo.png 在我的代码中,我使用相对URL "images/logo.png"引用图像。问题如果我在目录中使用以下命令运行此程序:c:\projects\program_dir\bin\>java -jar program.jar 然后一切正常,Java能…