如何将大量数据从数据库存储到XML(速度问题,第三部分)?

时间:2010-06-08 09:30:34

标签: java xml oracle optimization

在得到一些回复之后,目前的情况是我正在使用这个技巧:http://www.ibm.com/developerworks/xml/library/x-tipbigdoc5.html(清单1.将ResultSet转换为XML),以及来自http://www.megginson.com/downloads/的XMLWriter for Java 。基本上,它从数据库中读取日期并将它们作为字符写入文件,使用列名创建开始和结束标记。在这样做时,我需要对输入流进行两处更改,即日期和数字。

// Iterate over the set
        while (rs.next()) {
            w.startElement("row");
            for (int i = 0; i < count; i++) {
                Object ob = rs.getObject(i + 1);
                if (rs.wasNull()) {
                    ob = null;
                }
                String colName = meta.getColumnLabel(i + 1);
                if (ob != null ) {
                    if (ob instanceof Timestamp) {
                        w.dataElement(colName, Util.formatDate((Timestamp)ob, dateFormat)); 
                    }
                    else if (ob instanceof BigDecimal){
                        w.dataElement(colName, Util.transformToHTML(new Integer(((BigDecimal)ob).intValue())));
                    }
                    else {
                        w.dataElement(colName, ob.toString());
                    }

                } else {
                    w.emptyElement(colName);
                }

            }
            w.endElement("row");
        }

获取结果的SQL具有to_number命令(例如to_number(sif.ID) ID)和to_date命令(例如TO_DATE (sif.datum_do, 'DD.MM.RRRR') datum_do)。问题是返回日期是时间戳,这意味着我没有得到14.02.2010而是14.02.2010 00:00:000所以我必须将其格式化为dd.mm.yyyy格式。第二个问题是数字;由于某种原因,它们在数据库中为varchar2并且可以具有需要被剥离的前导零;我猜我可以使用trim函数在我的SQL中执行此操作,因此Util.transformToHTML是不必要的(为了澄清,这是方法):

public static String transformToHTML(Integer number) {
String result = "";
try {
  result = number.toString();
} catch (Exception e) {}
return result;

}

我想知道的是 a)我可以按照我想要的格式获取日期,并跳过额外的处理,从而缩短 处理时间? b)有更好的方法吗?我们讨论的是50 MB - 250 MB文件大小类别的XML文件。

4 个答案:

答案 0 :(得分:3)

您是否尝试过SQLXML或dbms_xmlgen?它可能是更快的方式,你可以将结果作为Blob获得。 dbms_xmlgen的输出似乎与您的输出非常相似。示例(来源:http://awads.net/wp/2005/12/19/producing-xml-from-sql-using-cursor-expressions/):

select dbms_xmlgen.getxml('
  2          select department_name
  3          from departments
  4          where department_id in (20,110)
  5          ') xml
  6  from dual
  7  /

XML
--------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <DEPARTMENT_NAME>Marketing</DEPARTMENT_NAME>
 </ROW>
 <ROW>
  <DEPARTMENT_NAME>Accounting</DEPARTMENT_NAME>
 </ROW>
</ROWSET>

select  xmlelement ("company",
           xmlagg (xmlelement ("department",
           xmlelement ("name", dept.department_name),
           xmlelement ("emps",
             (select xmlagg (xmlelement ("employee",
               xmlattributes (emp.employee_id as "id"),
               xmlforest (emp.first_name as "first_name")))
             from    employees emp
             where emp.department_id = dept.department_id)
                       )
                   )
           )
       ).getClobVal() xml
from departments dept

<company>
    <department>
        <name>Marketing</name>
        <emps>
            <employee id = "201">
                <first_name>Michael</first_name>
            </employee>
            <employee id = "202">
                <first_name>Pat</first_name>
            </employee>
        </emps>
    </department>
    <department>
        <name>Accounting</name>
        <emps>
            <employee id = "205">
                <first_name>Shelley</first_name>
            </employee>
            <employee id = "206">
                <first_name>William</first_name>
            </employee>
        </emps>
    </department>
</company>

如您所见,您可以使用getclobval()将输出作为clob。

格式化日期非常简单,to_char和to_number()知道前导零是没有意义的:

  > select to_char(sysdate, 'ddmmyyyy') from dual;

TO_CHAR(
--------
08062010
> select to_number('0003') from dual;

TO_NUMBER('0003')
-----------------
                3

答案 1 :(得分:0)

对不起,如果我没有准确回答你的问题,你应该看一下castor project。它提供了一个非常好的API,用于将xml数据传输到java对象到数据库持久性,反之亦然。

答案 2 :(得分:0)

如果你正在使用MSSQL,你应该为你的日期问题尝试以下方法:

SELECT CONVERT(VARCHAR(10), sif.datum_do, 104) AS datum_do_format

对于你的第二个问题我现在没有解决方案,对不起。

答案 3 :(得分:0)

如果您可以控制XML的格式,则可以使用Simple XML。它提供了非常高性能的Java POJO到XML序列化和反序列化框架。您还可以拦截各种类型的反序列化,例如您提到的日期。通过实现转换,您只需转换日期格式即可。本教程说明了Simple的可能性。