Как я могу хранить большой объем данных из базы данных в XML (проблема скорости, часть третья)? - PullRequest
1 голос
/ 08 июня 2010

После получения некоторых ответов текущая ситуация такова, что я использую этот совет: http://www.ibm.com/developerworks/xml/library/x-tipbigdoc5.html (Листинг 1. Превращение ResultSets в XML) и XMLWriter для Java из http://www.megginson.com/downloads/ , По сути, он считывает дату из базы данных и записывает их в файл в виде символов, используя имена столбцов для создания открывающих и закрывающих тегов. При этом мне нужно внести два изменения в поток ввода, а именно в даты и числа.

// 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 и могут иметь начальные нули, которые необходимо удалить; Я предполагаю, что я мог бы сделать это в моем SQL с помощью функции trim, поэтому Util.transformToHTML не требуется (для пояснения, вот метод):

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

} * * тысяча двадцать-один

Что я хотел бы знать, так это а) Могу ли я получить дату в нужном мне формате и пропустить дополнительную обработку, сокращая время обработки? б) Есть ли лучший способ сделать это? Мы говорим о файлах XML, которые находятся в категории размером от 50 МБ до 250 МБ.

Ответы [ 4 ]

3 голосов
/ 08 июня 2010

Вы пробовали 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>

Как видите, вы можете получить вывод в виде clob с помощью getclobval ().

Форматирование даты довольно тривиально, поскольку to_char и to_number () знают, что начальные нули не имеют смысла:

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

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

TO_NUMBER('0003')
-----------------
                3
0 голосов
/ 08 июня 2010

Если у вас есть контроль над форматом XML, вы можете использовать Простой XML. Он предлагает очень высокопроизводительную инфраструктуру сериализации и десериализации Java POJO to XML. Вы также можете перехватить десериализацию различных типов, например даты, которые вы упомянули. Реализуя преобразование, вы можете просто преобразовать форматы даты. Учебник иллюстрирует, что здесь возможно Простой .

0 голосов
/ 08 июня 2010

Если вы используете MSSQL, попробуйте следующее для вашей даты выпуска:

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

По твоей второй проблеме у меня сейчас нет решения, прости.

0 голосов
/ 08 июня 2010

Извините, если я не дам точного ответа на ваш вопрос, но вам стоит взглянуть на проект castor . Он предоставляет очень хороший API для передачи xml-данных в java-объекты для сохранения базы данных и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...