`
redleaf
  • 浏览: 127464 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

hibernate 读取Blob字段 OutOfMemoryError

阅读更多
数据库:mysql server 6.0
driver:mysql-connect-java-5.0.4-bin.jar
Hibernate:3.2

读mysql user表中的一个BLOB字段,出现这种错误:java.lang.OutOfMemoryError: Java heap space

下面是我的代码:

User类:

package org.redleaf;

import java.sql.Blob;

public class User {

	private int id ;
	private String name ;
	private Blob details ;
	
	public Blob getDetails() {
		return details;
	}
	public void setDetails(Blob details) {
		this.details = details;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
}



user.hbm.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
    <class name="org.redleaf.User" table="user"> 
       <id name="id" column="id">
          <generator class="native" />
       </id>
       <property name="name" column="name" />
       <property name="details" column="details" type="java.sql.Blob" lazy="true"/>
    </class>
</hibernate-mapping>



下载的servlet程序:

package org.redleaf.util;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class download extends HttpServlet {

	public download() {
		super();
	}

	public void destroy() {
		super.destroy(); 
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request,response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		org.hibernate.cfg.Configuration conf = new org.hibernate.cfg.Configuration().configure("/workspace.cfg.xml");
		org.hibernate.SessionFactory sessionFactory = conf.buildSessionFactory();
		org.hibernate.Session se = sessionFactory.openSession();
		org.redleaf.User user = (org.redleaf.User)se.get(org.redleaf.User.class, new Integer(4));//运行到这里就出错了,好像details字段并没有延迟加载
		
		String display_name = "test文件.chm";  //该文件存在数据库的details字段,有33MB
		
		response.setHeader("Content-disposition","attachment;filename=" + new String(display_name.getBytes("gbk"),"iso8859-1"));
		
		BufferedInputStream input = null;
		BufferedOutputStream output = null;
		try{
		
				java.sql.Blob details = user.getDetails();

			
				java.io.InputStream in = details.getBinaryStream(); 
			
			    input = new BufferedInputStream(in);
			    output = new BufferedOutputStream(response.getOutputStream());
			    int len = 0;
			    byte [] b = new byte[10240];
			    while((len = input.read(b)) != -1){
		    	    	output.write(b,0,len);
			    }


		}catch(Exception e){ 
		    e.printStackTrace();
		}finally{
			if(output!=null) output.close();
		    if(input!=null) input.close();
		}
		
		
		/*
		OutputStream out = response.getOutputStream();
		try{
			
			out.write(user.getDetails().getBytes(1,(int) user.getDetails().length()));
        
      
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			  out.flush();
		      out.close();
		}
		*/
	}

	public void init() throws ServletException {

	}

}


大家帮我看看,有什么办法让这个details字段从数据库里读出来不出java.lang.OutOfMemoryError: Java heap space这个错误
分享到:
评论
13 楼 linxi1105 2007-06-10  
mysql的驱动有问题,在读取的时候没有延迟,导致内存溢出。
12 楼 hexiaodong 2007-06-09  
这个问题在hibernate使用模式中有说明。
你把User分成两个类:User ,UserDetail,其中User不包括Blob字段,而UserDetail从User继承,还包括Blob字段。
在列表的时候读取User对象,在处理单个User的时候使用UserDetail对象。
11 楼 redleaf 2007-06-08  
上头不让改,说是放数据库里安全,做集群也方便,目前第一个问题就是解决不了延迟加载,如果能够延迟加载,那可能还有戏。。。
10 楼 maxima 2007-06-07  
如果能改设计,建议还是以文件形式存放吧,好处不是一点点.
9 楼 javafanwind 2007-06-07  
hgq0011 写道
你看看“http://www.iteye.com/topic/80620”是否有帮助?

我看了一下,好像是说虚拟机的问题,不知道最新的java6有没有改变和提高
8 楼 redleaf 2007-06-06  
有些资料说mysql没有延迟加载,晕死
7 楼 redleaf 2007-06-06  
我认为是hibernate在读这条数据时并没有把blob字段延迟加载,而是直接读到内存来造成的
6 楼 hgq0011 2007-06-06  
你看看“http://www.iteye.com/topic/80620”是否有帮助?
5 楼 ahuaxuan 2007-06-06  
redleaf 写道
我试过下载4MB左右的文件并没有出错,但好像大一点的文件就读不出来了,会有java.lang.OutOfMemoryError: Java heap space这个错误

在oracle里,如果超过4m就不能使用thin那个驱动了,要换一个驱动,那个以o什么来着的驱动,不知道mysql6是不是也会有这种问题
4 楼 redleaf 2007-06-06  
dennis_zane 写道
字段的延迟加载要进行字节码增强

什么意思啊?
3 楼 dennis_zane 2007-06-06  
字段的延迟加载要进行字节码增强
2 楼 redleaf 2007-06-06  
为什么details字段不会延迟加载啊?
1 楼 redleaf 2007-06-06  
我试过下载4MB左右的文件并没有出错,但好像大一点的文件就读不出来了,会有java.lang.OutOfMemoryError: Java heap space这个错误

相关推荐

    Hibernate读取blob字段

    本篇文章将深入探讨如何使用Hibernate读取数据库中的Blob字段,以及涉及到的相关知识点。 首先,我们需要理解Blob类型在数据库中的含义。Blob是Binary Large Object的缩写,它是一种可以存储大量二进制数据的数据...

    oracle中读取blob字段.doc

    ### Oracle中BLOB字段的读取与操作 #### 一、引言 在数据库系统中,BLOB(Binary Large Object)是一种用于存储大量二进制数据的数据类型,例如图像、音频或视频文件等。在Oracle数据库中,BLOB类型特别适用于处理...

    jdbc+hibernate存取blob字段

    本篇将详细介绍如何使用JDBC(Java Database Connectivity)与Hibernate框架来操作Oracle数据库中的BLOB字段。 首先,Oracle数据库的BLOB字段提供了对大对象的高效存储,它的性能优于LONG字段,尤其适合存储大容量...

    delphi读写BLOB字段

    delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段...

    hibernate对Blob类型字段进行数据添加.txt

    ### Hibernate 对 Blob 类型字段进行数据添加 #### 知识点概述 在处理数据库操作时,经常需要存储二进制大对象(Binary Large Object,简称 BLOB),例如图像、视频等非文本数据。BLOB 类型是数据库系统中用于存储...

    分块读取Blob字段数据演示(Delphi + Oracle)

    分块读取Blob字段是优化大量数据传输的有效策略,避免一次性加载大文件导致内存压力过大。 首先,`createTable.sql` 文件可能包含了创建包含Blob字段的Oracle表的SQL语句。通常,这样的语句会类似于: ```sql ...

    Java读取数据库中blob字段并插入到另一个表中

    可以从数据库中读取blob字段并插入到另一个表中,已经测试通过

    C#访问oracle数据库类,带blob字段读写

    读取Blob字段时,可以创建一个`OracleBinary`对象,然后使用`GetValue`方法获取Blob数据。写入Blob字段时,先创建`OracleParameter`对象,将其Direction设置为` ParameterDirection.Input `,OracleDbType设置为`...

    kettle通过java代码将数据库blob 字段抽取到本地文件

    kettle通过java代码将数据库blob 字段抽取到本地文件

    java读取大字段blob类型

    本文将详细介绍如何在Java中有效地读取`BLOB`类型的大字段,帮助解决程序员们常遇到的难题。 #### BLOB类型的概述 `BLOB`类型是关系型数据库中用于存储大量二进制数据的一种数据类型。它适用于存储诸如图片、声音...

    Hibernate对BLOB CLOB操作

    为了实际读取和写入BLOB和CLOB,你需要从文件系统读取数据,然后将其转换为InputStream或Reader,再使用Hibernate提供的方法。例如,你可以使用FileInputStream读取文件,然后将它转换为BLOB,类似地,使用...

    Hibernate操作Oarcle中Clob、Blob字段小结

    在Java的持久化框架Hibernate中,处理大数据类型如Oracle数据库中的Clob(Character Large Object)和Blob(Binary Large Object)字段是一项重要的任务。Clob通常用于存储大量的文本数据,而Blob则适用于二进制...

    判断blob字段是否为空

    在数据库管理与应用开发中,处理BLOB(Binary Large Object)类型字段是一项常见的需求,尤其是在存储大量二进制数据如图像、音频或视频文件时。本文将深入探讨如何判断一个BLOB字段是否为空,这是一个在数据库操作...

    java中读取ORACLE中BLOB字段存储的图片

    ### Java中读取Oracle数据库BLOB字段存储的图片方法详解 #### 一、背景与目的 在实际的应用开发过程中,经常会有将图片等二进制数据存入数据库的需求。Oracle数据库支持通过BLOB(Binary Large Object)类型来存储...

    oracle中对blob字段的处理方法

    oracle中对blob字段的处理方法,包括增加,删除,修改,更新等操作。

    C#,BLOB读取操作

    C# 中的 BLOB 读取操作 C# 中的 BLOB(Binary Large OBject)读取操作是指从数据库中读取二进制数据的过程。BLOB 是一种二进制数据类型,用于存储大规模的二进制数据,如图片、音频、视频等。在 C# 中,我们可以...

    oracle blob 字段 读写 delphi

    3. **读取BLOB字段** - 对于DBExpress,可以使用TOracleQuery组件的SQL属性执行查询,然后在OnBeforeOpen事件中处理BLOB字段,通过TOracleBlobField对象访问BLOB数据。 - 对于ADO,使用TADODBCommand对象的Execute...

    基于JSP访问ORACLE数据库BLOB字段并显示图形的解决方案.pdf

    本文介绍了一种基于JSP访问ORACLE数据库BLOB字段并显示图形的解决方案,展示了JSP技术、ORACLE数据库BLOB字段、坐标点的存储和读取、图形的显示、排样数据表设计、Samplegraph.jsp的功能、JAVA类的应用等知识点。

    Oracle blob字段上传下载

    ### Oracle Blob字段上传与下载详解 #### 一、概述 在数据库系统中,二进制大对象(Binary Large Object,简称BLOB)是一种用于存储大量二进制数据的数据类型,例如图像、音频或视频文件等。Oracle数据库支持Blob...

Global site tag (gtag.js) - Google Analytics