我给出的任务转换成一个巨大的表来定义XML文件。我将使用这项工作。

如果我只是问题的一个"SELECT*from客户",它可能返回的大量的数据,最终导致OOM.我不知道,是有一个方法我可以处理的记录立即一旦成为可用的,并且删除的记录存储器之后,在sql检索过程?

---编辑月13日,2009年

让我详细阐述我的问题。我有1台数据库服务器和1个应用程序服务器。当我问题"选择"查询中的应用程序,该数据将前从数据库服务器的应用程序服务器。

我相信(正确的我,如果我错了)结果将需要等到收到所有的记录中查询。即使我们取尺寸为4,为1000记录表,我们最终仍然有1000记录在堆存储器的应用程序服务器,这是正确的吗?获取大小,仅影响数目的往返/数据库服务器。

我的问题是,如何开始处理这4(或数字)记录之后立即抵达,以应用程序服务器,以及处置它的自立存在的应用程序服务器?

有帮助吗?

解决方案

我想你可以使用相同的解决方案,这一个。可滚动的结果集。

其他提示

随着一点点的更多信息,我可以得到更多有用的答案。

如果你正在使用MySQL:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
       java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

http://www.oracle.com/技术/技术/ JAVA / sqlj_jdbc / htdocs中/ jdbc_faq.html

java.util.Properties info = new java.util.Properties();
info.put ("user", "scott");
info.put ("password","tiger");
info.put ("defaultRowPrefetch","15");
getConnection ("jdbc:oracle:oci:@",info);

如果使用的是JDBC可以使用一个结果与您通过一个记录在一个时间迭代的光标。你需要确保那么你写你的XML到文件中一条记录的时间,而不是使用DOM构建XML。

这是我从我的经验学到一个经验法则是,你永远不会把从数据库中的所有数据,应用程序服务器。有一两件事你可以做的是实施过程页面数据。

您可以将载有1000-5000左右的记录,对它们进行处理,然后再次读取该数据为下一个页面。一个数据页

一个概念用于出口的整个的表格。 (注意到专家:我意识到它的缺点。)

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
public class FullTableExport {
    public static String toXML(String s) {
        if (s != null) {
            StringBuilder b = new StringBuilder(s.length());
            for (int i = 0, count = s.length(); i < count; i++) {
                char c = s.charAt(i);
                switch (c) {
                case '<':
                    b.append("&lt;");
                    break;
                case '>':
                    b.append("&gt;");
                    break;
                case '\'':
                    b.append("&#39;");
                    break;
                case '"':
                    b.append("&quot;");
                    break;
                case '&':
                    b.append("&amp;");
                    break;
                default:
                    b.append(c);
                }
            }
            return b.toString();
        }
        return "";
    }
    public static void main(String[] args) throws Exception {
        String table = "CUSTOMER";
        int batch = 100;

        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection conn = DriverManager.getConnection(
            "jdbc:oracle:thin:@server:orcl", "user", "pass");
        PreparedStatement pstmt = conn.prepareStatement(
            "SELECT /*+FIRST_ROWS(" + batch + ") */ * FROM " + table);
        ResultSet rs = pstmt.executeQuery();
        rs.setFetchSize(batch);
        ResultSetMetaData rsm = rs.getMetaData();
        File output = new File("result.xml");
        PrintWriter out = new PrintWriter(new BufferedWriter(
            new OutputStreamWriter(
            new FileOutputStream(output), "UTF-8")), false);
        out.printf("<?xml version='1.0' encoding='UTF-8'?>%n");
        out.printf("<table name='%s'>%n", toXML(table));
        int j = 1;
        while (rs.next()) {
            out.printf("\t<row id='%d'>%n", j++);
            for (int i = 1; i <= rsm.getColumnCount(); i++) {
                out.printf("\t\t<col name='%s'>%s</col>%n", 
                    toXML(rsm.getColumnName(i)), 
                    toXML(rs.getString(i)));
            }
            out.printf("\t</row>%n");
        }
        out.printf("</table>%n", table);
        out.flush();
    }
}

编辑 缺点(谢谢@J.S.):

  • 没有外部图书馆使用超出ojdbc
  • 没有什么是封闭的
  • 一般的异常
  • 这是一个主要方法
  • 使用的打印XML代
  • Oracle的特定SQL
  • 纯文字的密码
  • 一些列看尴尬的字符串中的代表性
  • UTF-8是国际太
  • XML结构中占很大

目前哪个阶段是OOM错误发生,它是在数据检索或处理数据以XML文件?

如果它的数据检索,得到分批数据。获取的行的总数第一,由主键顺序选择并限制选择成可咀嚼的大小的行。

如果它在创建XML文件时,发送每个客户的XML节点为System.out.println,不要在内存中保留它。经由commad线启动该程序并重定向所有输出到文件;

java MyConverter > results.txt

如您遍历所有被保存在文件中。记录

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top