Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将大型XML行与数据库表记录进行比较-自定义要求 问题_Java_Database_Xml Parsing_Compare_Stax - Fatal编程技术网

Java 将大型XML行与数据库表记录进行比较-自定义要求 问题

Java 将大型XML行与数据库表记录进行比较-自定义要求 问题,java,database,xml-parsing,compare,stax,Java,Database,Xml Parsing,Compare,Stax,我们有一个类似XML(它有一些需要过滤的非unicode)的数据 更多信息 XML文件超过9 Gig,可通过FTP获得 数据库表列名可能不同于XML列标记名 可能需要添加/定义一些规则来筛选行 问题: 解析这个巨大的XML并找出数据库表中是否存在该记录的合适方法是什么?有可用的开源工具吗 我在尝试什么 使用带有无效字符fiter(FilterReader)的默认实现(XMLInputFactory)编写了StAX解析器 计划将XML拆分为块 让并发线程处理每个块 每个线程都将生成一个查询,以检

我们有一个类似XML(它有一些需要过滤的非unicode)的数据

更多信息
  • XML文件超过9 Gig,可通过FTP获得
  • 数据库表列名可能不同于XML列标记名
  • 可能需要添加/定义一些规则来筛选行
  • 问题: 解析这个巨大的XML并找出数据库表中是否存在该记录的合适方法是什么?有可用的开源工具吗

    我在尝试什么
    • 使用带有无效字符fiter(FilterReader)的默认实现(XMLInputFactory)编写了StAX解析器
    • 计划将XML拆分为块
    • 让并发线程处理每个块
    • 每个线程都将生成一个查询,以检查数据库中是否存在该查询(我知道它的荒谬之处)
    • 创建一个连接池,并由每个线程执行这些查询
    我知道这是我正在做的最糟糕的事情,需要几年才能完成,我真的需要一些建议,比如是否使用任何ORM来简化检查并加快XML解析


    像这样的建议对我很有帮助。

    是的。我认为你使用StAX是对的。您肯定想要流式传输,而StAX似乎有最简单的用于流式传输XML的API。我不会马上去ORM。大多数ORM都支持往返数据。这样可以节省进行机械变换的工作。当您拥有非常结构化的数据,但两个模式之间的映射并不十分复杂时,这就很好了。这里您正在尝试将数据从一种格式导入到另一种格式。听起来您的大型数据集有一个相当简单的模式,但映射是更复杂的部分。使用自定义代码。Pawel关于临时桌子的建议听起来不错。尝试在同时对整个数据集(旧数据集和导入数据集)进行操作的存储过程中尽可能多地进行处理。您不想一直将这些行从数据库来回传输到应用程序。

    是的。我认为你使用StAX是对的。您肯定想要流式传输,而StAX似乎有最简单的用于流式传输XML的API。我不会马上去ORM。大多数ORM都支持往返数据。这样可以节省进行机械变换的工作。当您拥有非常结构化的数据,但两个模式之间的映射并不十分复杂时,这就很好了。这里您正在尝试将数据从一种格式导入到另一种格式。听起来您的大型数据集有一个相当简单的模式,但映射是更复杂的部分。使用自定义代码。Pawel关于临时桌子的建议听起来不错。尝试在同时对整个数据集(旧数据集和导入数据集)进行操作的存储过程中尽可能多地进行处理。您不想一直将这些行从数据库来回传输到应用程序。

    您可以尝试apache digester:您可以编写自己的类并将其推送到digester堆栈上。然后,根据regex规则(您指定),digester将使用标记及其值作为参数调用此对象上的不同方法。在那里,您可以将它们映射到数据库表,甚至可以将它们插入到数据库中。digester使用SAX,因此它应该能够处理这个巨大的文件,但是您可能需要比来自稍微不同的世界(.NET)的我更多的内存,在我的世界中,我将执行以下操作。我将使用XmlReader(以避免将文档加载到内存中)读取文件,然后以可以导入数据库的形式编写另一个文件。我将使用SqlServer中的bulkInsert之类的工具/命令将数据导入临时表/数据库。我将运行SQL查询来比较这两个表/数据库。另外,如何定义数据库中是否存在记录?所有列都必须匹配还是只匹配键?如果某个键匹配,但某些列不匹配怎么办?我认为ORM在这种情况下不会有帮助。您可以尝试apache digester:您可以编写自己的类并将其推送到digester堆栈上。然后,根据regex规则(您指定),digester将使用标记及其值作为参数调用此对象上的不同方法。在那里,您可以将它们映射到数据库表,甚至可以将它们插入到数据库中。digester使用SAX,因此它应该能够处理这个巨大的文件,但是您可能需要比来自稍微不同的世界(.NET)的我更多的内存,在我的世界中,我将执行以下操作。我将使用XmlReader(以避免将文档加载到内存中)读取文件,然后以可以导入数据库的形式编写另一个文件。我将使用SqlServer中的bulkInsert之类的工具/命令将数据导入临时表/数据库。我将运行SQL查询来比较这两个表/数据库。另外,如何定义数据库中是否存在记录?所有列都必须匹配还是只匹配键?如果某个键匹配,但某些列不匹配怎么办?我认为ORM在这种情况下不会有帮助。
    <row><div>1234</div><dept>ABCD</dept></row>
    <row><div>5678</div><dept>EFGH</dept></row>
    
    div_c  qdept
    1234   ABCD
    5678   EFGH