java 对象序列化存储oracle

java 对象序列化存储oracle:

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import oracle.sql.BLOB;

/**
 *
 * handle serial object with oracle dbStore<br/>
 * eg: create table TEST_OBJECTSTORE ( CLASSNAME VARCHAR2(256), CONTENT BLOB )
 * @author Administrator
 *
 */
public class ObjectSerialStore {

	private String tableName;
	private String classNameColumn;
	private String serialObjColumn;

	/**
	 * construct
	 *
	 * @param tableName
	 * @param classNameColumn
	 * @param serialObjColumn
	 */
	public ObjectSerialStore(String tableName, String classNameColumn,
			String serialObjColumn) {
		this.tableName = tableName;
		this.classNameColumn = classNameColumn;
		this.serialObjColumn = serialObjColumn;
	}

	/**
	 * store the serial Object
	 *
	 * @param dbConn  close after use
	 * @param className serialObj.getClass().getName() or OBJ.class.getName()
	 * @param serialObj
	 */
	public final void storeSerialObject(Connection dbConn, String className,
			Object serialObj) {

		Statement stmt = null;
		ResultSet rs = null;

		try {
			ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
			ObjectOutputStream objOuts = new ObjectOutputStream(byteArray);
			objOuts.writeObject(serialObj);

			final byte[] objBytes = byteArray.toByteArray();

			dbConn.setAutoCommit(false);
			stmt = dbConn.createStatement();

			stmt.executeUpdate("insert into " + this.tableName + " ("
					+ this.classNameColumn + ", " + this.serialObjColumn
					+ ") values ('" + className + "', empty_blob())");

			rs = stmt.executeQuery("select " + this.serialObjColumn + " from "
					+ this.tableName + " where " + this.classNameColumn + "='"
					+ className + "' for update");

			if (rs.next()) {
				BLOB blob = (BLOB) rs.getBlob(this.serialObjColumn);
				@SuppressWarnings("deprecation")
				OutputStream outStream = blob.getBinaryOutputStream();
				outStream.write(objBytes, 0, objBytes.length);
				outStream.flush();
				outStream.close();
			}

			dbConn.commit();

			byteArray.close();
			objOuts.close();
		} catch (Exception e) {
			System.out.println("The error when serial obj:"+e.getMessage());
		} finally {
			close(rs,stmt,dbConn);
		}

	}

	/**
	 * update the serial Object
	 * @param dbConn close after use
	 * @param className serialObj.getClass().getName() or OBJ.class.getName()
	 * @param serialObj
	 */
	public final void updateSerialObject(Connection dbConn, String className,
			Object serialObj){
		Statement stmt = null;
		ResultSet rs = null;

		try {
			ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
			ObjectOutputStream objOuts = new ObjectOutputStream(byteArray);
			objOuts.writeObject(serialObj);

			final byte[] objBytes = byteArray.toByteArray();

			dbConn.setAutoCommit(false);
			stmt = dbConn.createStatement();

			stmt.executeUpdate("update "+this.tableName+" set "+this.serialObjColumn+"=empty_blob() where "+this.classNameColumn+"='"+className+"'");

			rs = stmt.executeQuery("select " + this.serialObjColumn + " from "
					+ this.tableName + " where " + this.classNameColumn + "='"
					+ className + "' for update nowait");

			if (rs.next()) {
				BLOB blob = (BLOB) rs.getBlob(this.serialObjColumn);
				@SuppressWarnings("deprecation")
				OutputStream outStream = blob.getBinaryOutputStream();
				outStream.write(objBytes, 0, objBytes.length);
				outStream.flush();
				outStream.close();
			}

			dbConn.commit();

			byteArray.close();
			objOuts.close();
		} catch (Exception e) {
			System.out.println("The error when update serial obj:"+e.getMessage());
		} finally {
			close(rs,stmt,dbConn);
		}

	}

	/**
	 * get the serial Object from db
	 *
	 * @param dbConn close after use
	 * @param className serialObj.getClass().getName() or OBJ.class.getName()
	 * @return
	 */
	public final Object getSerialObject(Connection dbConn, String className) {
		Statement stmt = null;
		ResultSet rs = null;

		Object returnObj = null;

		try{
			stmt = dbConn.createStatement();
			rs = stmt.executeQuery("select "+this.serialObjColumn+" from "+this.tableName+" where "+this.classNameColumn+"='"+className+"'");

			BLOB blob = null;
			if(rs.next()){
				blob = (BLOB) rs.getBlob(this.serialObjColumn);
			}

			InputStream is = blob.getBinaryStream();
			BufferedInputStream bufferIs = new BufferedInputStream(is);

			byte[] byteArrays = new byte[blob.getBufferSize()];
			while(-1 != bufferIs.read(byteArrays, 0, byteArrays.length));

			ObjectInputStream objInput = new ObjectInputStream(new ByteArrayInputStream(byteArrays));
			returnObj = objInput.readObject();

			is.close();
			bufferIs.close();
			objInput.close();

		}catch(Exception e){
			System.out.println("The error when deserial obj:"+e.getMessage());
		}finally{
			close(rs,stmt,dbConn);
		}

		return returnObj;

	}

	private void close(ResultSet rs,Statement stmt,Connection conn){
		if(rs != null){
			try{
				rs.close();
			}catch(Exception e){}
		}

		if(stmt != null){
			try{
				stmt.close();
			}catch(Exception e){}
		}

		if(conn != null){
			try{
				conn.close();
			}catch(Exception e){}
		}
	}

}
时间: 2024-07-29 10:54:48

java 对象序列化存储oracle的相关文章

Java对象序列化剖析

对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口或java.io.Externalizable接口,前者为一个标记接口,即不存在任何需要实现的方法,仅仅为一种对象可序列化的标识,且序列化和反序列化的方式为系统默认方式:而后者其实内部也实现了Serializable,并且包含两个方法writeExternal()和readExternal()分别用

java对象序列化小结

百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据.确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission.在默认策略下,通过 Internet 下载

【java】理解java对象序列化

关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Thinking in Java, Effective Java,JavaWorld,developerWorks中的相关文章和其它网络资料,也加入了自己的实践经验与理解,文.码并茂,希望对大家有所帮助.(2012.02.14最后更新) 1. 什么是Java对象序列化 Java平台允许我们在内存中创建可

(转)关于 Java 对象序列化您不知道的 5 件事

关于 Java 对象序列化您不知道的 5 件事 转自:http://developer.51cto.com/art/201506/479979.htm 数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数程序员对于 Java 平台都是浅尝则止,只学习了足以完成手头上任务的知识而已.在本 系列 中,Ted Neward 深入挖掘 Java 平台的核心功

深入理解Java对象序列化

关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Thinking in Java, Effective Java,JavaWorld,developerWorks中的相关文章和其它网络资料,也加入了自己的实践经验与理解,文.码并茂,希望对大家有所帮助.(持续更新中,2012.02.13最后更新) 1. 什么是Java对象序列化 Java平台允许我们在

疯狂Java学习笔记(84)----------关于 Java 对象序列化您不知道的 5 件事

数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数程序员对于 Java 平台都是浅尝则止,只学习了足以完成手头上任务的知识而已.在本 系列 中,Ted Neward 深入挖掘 Java 平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程挑战. 大约一年前,一个负责管理应用程序所有用户设置的开发人员,决定将用户设置存储在一个 Hashta

Java对象序列化/反序列化的注意事项(转)

Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久化的,将运行中的对象状态保存下来(最直接的方式就是保存到文件系统中),在需要的时候可以还原,即使是在Java虚拟机退出的情况下. 对象序列化机制是Java内建的一种对象持久化方式,可以很容易实现在JVM中的活动对象与字节数组(流)之间进行转换,使用得Java对象可以被存储,可以被网络传输,在网络的一

疯狂Java学习笔记(84)----------大约 Java 对象序列化,你不知道 5 事

几年前,.当一个软件团队一起用 Java 书面申请.我认识比一般程序猿多知道一点关于 Java 对象序列化的知识所带来的优点. 关于本系列 您认为自己懂 Java 编程?其实,大多数程序猿对于 Java 平台都是浅尝则止,仅仅学习了足以完毕手头上任务的知识而已.在本 系列 中,Ted Neward 深入挖掘 Java 平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程挑战. 大约一年前,一个负责管理应用程序全部用户设置的开发者,决定将用户设置存储在一个 Hashtable中,然后将这

关于 Java 对象序列化您不知道的 5 件事

数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数程序员对于 Java 平台都是浅尝则止,只学习了足以完成手头上任务的知识而已.在本 系列 中,Ted Neward 深入挖掘 Java 平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程挑战. 大约一年前,一个负责管理应用程序所有用户设置的开发人员,决定将用户设置存储在一个 Hashta