b_l_east 2012-04-10 10:44
浏览 523
已采纳

Java Mysql blob 存取大文件时内存溢出如何解决?

今天模拟一些数据,需要将一些大文件我用的是755M(可以更大)存入到Mysql的一个longblob字段中。

我使用了pstmt.setBinaryStream(2, fis, f.length());的方式,但总是抛出异常。

貌似Mysql 的JDBC总是先将stream中的数据读成byte[]然后再往数据库中存,所以总是内存溢出,不知哪位高人可有解决方案?!

我的代码:

 

      ApplicationContext contxt = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        DataSource ds = contxt.getBean("dataSource", DataSource.class);
        
        Connection con = ds.getConnection();
        PreparedStatement pstmt = con.prepareStatement("insert into saved_file values(?, ?)");
        
        File f = new File("D:\\test\\office_755M.iso"); // 测试用的文件,确定大小
        for (int i = 1; i < 11; i++) {
            System.out.println("添加: " + i + "...");
            pstmt.setInt(1, i);
            FileInputStream fis = new FileInputStream(f);
            pstmt.setBinaryStream(2, fis, f.length());
            int rt = pstmt.executeUpdate();
            fis.close();
            System.out.println("添加结果: " + rt);
        }
        pstmt.close();
        con.close();

抛出异常:

 

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.mysql.jdbc.Buffer.ensureCapacity(Buffer.java:156)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2544)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2401)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at com.wondersgroup.cache.test.DBDataPrepare.main(DBDataPrepare.java:31)
  • 写回答

1条回答 默认 最新

  • dominic_2009 2012-04-11 00:06
    关注

    修改JDK的Xms Xmx,增加你JVM的内存使用量,不修改默认都比较小。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格