`
jeasony
  • 浏览: 200128 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

hibernate 读取Blob字段 OutOfMemoryError

阅读更多

关键字: 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类:

  1. package org.redleaf;   
  2.   
  3. import java.sql.Blob;   
  4.   
  5. public class User {   
  6.   
  7.     private int id ;   
  8.     private String name ;   
  9.     private Blob details ;   
  10.        
  11.     public Blob getDetails() {   
  12.         return details;   
  13.     }   
  14.     public void setDetails(Blob details) {   
  15.         this.details = details;   
  16.     }   
  17.     public int getId() {   
  18.         return id;   
  19.     }   
  20.     public void setId(int id) {   
  21.         this.id = id;   
  22.     }   
  23.     public String getName() {   
  24.         return name;   
  25.     }   
  26.     public void setName(String name) {   
  27.         this.name = name;   
  28.     }   
  29.        
  30.        
  31. }  
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 文件:

Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >   
  3. <hibernate-mapping>   
  4.     <class name="org.redleaf.User" table="user">    
  5.        <id name="id" column="id">   
  6.           <generator class="native" />   
  7.        </id>   
  8.        <property name="name" column="name" />   
  9.        <property name="details" column="details" type="java.sql.Blob" lazy="true"/>   
  10.     </class>   
  11. </hibernate-mapping>  
<?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程序:

Java代码 复制代码
  1. package org.redleaf.util;   
  2.   
  3. import java.io.IOException;   
  4. import java.io.PrintWriter;   
  5. import java.io.*;   
  6. import javax.servlet.ServletException;   
  7. import javax.servlet.http.HttpServlet;   
  8. import javax.servlet.http.HttpServletRequest;   
  9. import javax.servlet.http.HttpServletResponse;   
  10.   
  11. public class download extends HttpServlet {   
  12.   
  13.     public download() {   
  14.         super();   
  15.     }   
  16.   
  17.     public void destroy() {   
  18.         super.destroy();    
  19.     }   
  20.   
  21.     public void doGet(HttpServletRequest request, HttpServletResponse response)   
  22.             throws ServletException, IOException {   
  23.   
  24.         doPost(request,response);   
  25.     }   
  26.   
  27.     public void doPost(HttpServletRequest request, HttpServletResponse response)   
  28.             throws ServletException, IOException {   
  29.            
  30.         org.hibernate.cfg.Configuration conf = new org.hibernate.cfg.Configuration().configure("/workspace.cfg.xml");   
  31.         org.hibernate.SessionFactory sessionFactory = conf.buildSessionFactory();   
  32.         org.hibernate.Session se = sessionFactory.openSession();   
  33.         org.redleaf.User user = (org.redleaf.User)se.get(org.redleaf.User.classnew Integer(4));//运行到这里就出错了,好像details字段并没有延迟加载   
  34.            
  35.         String display_name = "test文件.chm";  //该文件存在数据库的details字段,有33MB   
  36.            
  37.         response.setHeader("Content-disposition","attachment;filename=" + new String(display_name.getBytes("gbk"),"iso8859-1"));   
  38.            
  39.         BufferedInputStream input = null;   
  40.         BufferedOutputStream output = null;   
  41.         try{   
  42.            
  43.                 java.sql.Blob details = user.getDetails();   
  44.   
  45.                
  46.                 java.io.InputStream in = details.getBinaryStream();    
  47.                
  48.                 input = new BufferedInputStream(in);   
  49.                 output = new BufferedOutputStream(response.getOutputStream());   
  50.                 int len = 0;   
  51.                 byte [] b = new byte[10240];   
  52.                 while((len = input.read(b)) != -1){   
  53.                         output.write(b,0,len);   
  54.                 }   
  55.   
  56.   
  57.         }catch(Exception e){    
  58.             e.printStackTrace();   
  59.         }finally{   
  60.             if(output!=null) output.close();   
  61.             if(input!=null) input.close();   
  62.         }   
  63.            
  64.            
  65.         /*  
  66.         OutputStream out = response.getOutputStream();  
  67.         try{  
  68.               
  69.             out.write(user.getDetails().getBytes(1,(int) user.getDetails().length()));  
  70.           
  71.         
  72.         }catch(Exception e){  
  73.             e.printStackTrace();  
  74.         }finally{  
  75.               out.flush();  
  76.               out.close();  
  77.         }  
  78.         */  
  79.     }   
  80.   
  81.     public void init() throws ServletException {   
  82.   
  83.     }   
  84.   
  85. }  
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这个错误
分享到:
评论

相关推荐

    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操作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)类型来存储...

    java对oracle数据库中blob字段的处理

    Java对Oracle数据库中BLOB字段的处理涉及多个层面,包括读取、写入、更新以及跨数据库操作等。 ### Java处理Oracle BLOB字段的基本方法 #### 1. 读取BLOB字段 在Java中,读取Oracle数据库中的BLOB字段通常通过`...

    oracle中对blob字段的处理方法

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

    oracle blob 字段 读写 delphi

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

    使用hibernate对oracle读取blob

    本文将详细介绍如何使用Hibernate和JDBC读取和存储Oracle数据库中的Blob对象。 ### 1. Hibernate Blob操作 在Hibernate中,Blob对象通常与Java的`java.sql.Blob`接口相对应。在实体类中,你可以定义一个Blob类型的...

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

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

    C#,BLOB读取操作

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

Global site tag (gtag.js) - Google Analytics