现项目中有需求,要从其他项目中导入100MB的xml到oracle数据库中去,我用SAXReader试了,但都outofMemory了,请各位高手不吝赐教

解决方案 »

  1.   

    有可能你使用SAXReader只是把XML的内容读出来,拼成字符串,然后保存?一般保存一个文件到数据库,是使用stream的方式: 
        PreparedStatment.setCharacterStream或者PreparedStatment.setBinaryStream
      

  2.   

    各位高手,我只是菜鸟,能不能具体的说一下或者把代码发布一下,怎样用poi分段插入啊?
      

  3.   

    为什么要把这么大的一个文件存进DB里呢??意义何在?
    文件还是存在硬盘上,在DB里存入该文件的地址,这样做是否更合理?
      

  4.   

    使用 SAXReader 时 ,读一点 写一点, 不要讲读取的数据保存在内存中,最后一次性写入。
      

  5.   

    我看成急,国庆节前100分,请教高手如何将100RMB的xml导入oracle了......100MB的东西,就不要存到数据库中了,和图片一样,将地址存进去就好了
      

  6.   

    那还不简单,把xml文件地址存在数据库中,获取到数据后解析不就完了,不知楼主在纠结什么,要是全部都放在数据库中,估计访问速度不是一般的差劲。
      

  7.   

    是这样的,有两个系统,然后A系统要用到B系统的数据,A是用的oracle数据库,B是用的mysql的数据库,现在A系统要用B系统的数据,就将B系统的mysql中的一个表的数据导出生成一个xml文件,倒出来后100MB,汗,客户规定了发给A系统的数据文件为xml格式,如果为txt的话,早就解决了,汗,然后,我在A系统中处理这个100MB的xml文件,试了很多办法,都不行,所以在网上求教高手,
      

  8.   

    是这样的,有A系统和B系统,A系统用的oracle数据库,B系统用的mysql数据库,现在A系统需要B系统的数据,而且客户规定:发给A系统的数据文件格式为xml的,于是从B系统的数据库导出一个表的数据,xml格式的,结果是100MB的,如果是txt的才30Mb的,早解决了,现在这个100MB的文件,试了很多办法,都不能导入A数据库,所以在网上求教各位高手,
      

  9.   

    可以从几个方面处理:
    1.增加java的内存:
    java -Xms16m -Xmx64m  your_app
    2.将你的XML文件手工分拆成几个小文件,再由你的应用处理。
    3.当做普通文本文件,一行行读取出来,自己解析成对应数据。
      

  10.   

    如果还报OutOfMemory错误,再继续加大点:
    java -Xms128m -Xmx256m your_app
      

  11.   

    如果你的xml是一段段,有规律的内容。你把一段读好后,就存入数据库提交。 只要那一块不是很大,用SAX或JDK1.6出的StAX都是支持一块块读的, 理论上读多大的都没啥问题,只要你不是读了还全放内存里。我读过2G-4G的XML,都没有问题。如果可以你把你核心代码贴出来看看,你不会是把读出了一块放List什么里,最后想遍历list再存数据库吧?
    当然我开始的假设不成立,你的xml里有二进制的什么东东,不是一块块的。 一块就很大那么只能把当二进制读来存DB里。
      

  12.   

    你可以把这么大的xml写进clob字段中,最大可达4g,所以写入绝对不是问题。问题是:你要用的时候,怎么解析,这个就有点头疼了。建议你专门为这个数据写一个解析的类,把所有解析后的信息再插入另外一张表,这样绝对是一劳永逸!以后只需要倒倒数据,剩下的就去数据库查询。所以无非就是倒数据和其他两个库之间来回倒不太一样,剩下的转换成我们熟悉的问题就方便多了。当然,要写好这个解析,你自己的费点劲儿了,思路很重要,不然后面很受伤。
      

  13.   

    晕 这个写一个导入工具不就OK了么 什么格式的xml
      

  14.   

    就是数据库迁移啊 让他吧mysql的数据库直接发过来更简单
      

  15.   

    楼主的100M xml文件在生成之前能不能把xml自动生成几份。xml文件肯定是有系统生成的那就分开生成就是了。。
      

  16.   


    utf-8格式的啊,
    我在想用什么导入,怎样写这个导入工具,因为我每次试各种办法,都是在读的时候就挂了outofmemoryerror
      

  17.   


    楼上的,我也想分,但这100MB的数据还只是两个区县的数据,以后,这个系统每个月会过来18个区县的xml文件,试问我怎么分?难道分成180个文件吗?
      

  18.   

    用kettle抽取xml文档数据到数据库啊
      

  19.   

    那还不简单,把xml文件地址存在数据库中,获取到数据后解析不就完了,不知楼主在纠结什么,要是全部都放在数据库中,估计访问速度不是一般的差劲。
      

  20.   

    用Spring Batch吧,很简单的
      

  21.   

    不管怎么存库,outofmemoryerror应该是一次性加载 100M出现的问题啊,你先确定这点啊,感觉14楼说的在理。你可以把xml文件解析成sql文件,调试outofmemoryerror,然后sql可以直接入库了
      

  22.   

    关键是xml文件太大了,如何解析
      

  23.   


    ++提供的几个方法都可以
    1、如果内存足够,就使劲加吧
    2、UE或者EditPlus都可以打开大文本文件,打开之后分段复制内容存到小文件里
    3、XML可以用Excel打开,另存为*.xls之后,用PL/SQL工具可以直接导入到Oracle
    +4、如果数据格式很乱,也可以自己开发程序解析XML,内存溢出的问题参考1、2即可
      

  24.   

    SAX不用将整个文档加载到内存,基于事件驱动的API(Observer模式),为什么还会内在溢出的?
      

  25.   

    不是啊,其实saxReader它的方法read还是会一下子将整个文件读进去啊,SaxReader.read(),求解?
      

  26.   


    估计楼主你是误解了基于事件驱动的开发模式吧。基于流式处理的还有 StAX 也很不错,可以试试看,这里有教程和例子:
    http://www.ibm.com/developerworks/cn/xml/x-stax1.html
      

  27.   

    各位高手,最新一个问题,我用read读取的时候,在onend这个方法执行一个读取xml时,报错:
    No more pseudo attributes are allowed,请问这是因为什么啊?
      

  28.   

    用Spring Batch吧,很简单的