最近一个项目需要数据库同步所以文件都要存储到数据库中而且文件大小不限制,试了好多办法上传大文件最后用ActiveX解决了可是数据库存储还是交给Java,大概过程是这样ActiveX将用户上传的文件保存到web服务器后通知后台调用一个响应程序并将文件路径当作参数传过去java程序读取文件后将文件合并转换为byte[]存入数据库,可是问题出现了如果文件够大比如300M左右服务器就会报错OutOfMemoryError:java heap space。找了半天解决的办法只找到获得文件时用循环分段获得文件可是不管怎么样最后存入数据库时不可能用循环一点一点的插入到数据库一定是把所有byte[]拼起来再执行插入的操作。可是就在把所有byte[]拼起来的时候又出现了OutOfMemoryError:java heap space......哎,折腾了几天也没结果 哪位高人给指点一下啊 谢谢了

解决方案 »

  1.   

    300M你还用HTML方式上传?网页上传不适合传这么大数据量的
      

  2.   

    使用Java程序从数据库中读写大量的数据时出现异常:
    java.lang.OutOfMemoryError: Java heap space 
    在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。
    JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。
    解决办法:
    tomcat_home/bin下catalina.bat(windows系统)
    catalina.sh(linux系统)执行代码前加上:
    set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m windows 更改系统环境变量
    加上JAVA_OPTS=-Xms64m -Xmx512m
      

  3.   

    oracle里面是有两种文件方式存储的,有一种并不会以二进制的方式写入数据库,原是以文件方式放于某个地方,数据库里面只是会对文件路径进行一个引用``
      

  4.   

    为什么“一定是把所有byte[]拼起来再执行插入的操作”?文件在服务器上都以流的行式来操作
      

  5.   

    如果不把文件变成btye[]那要怎么样才能吧它存到数据库里呢对这些东西不太懂 
      

  6.   

    最终解决方案:
    建立两张表 一张保存文件的属性信息,文件名,类别,备注什么的 另一张存文件的内容 是一对多的关系。将得到的文件没10M分割一次存到文件内容表中,获得的时候再去按顺序拼就OK了~~~