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){}
		}
	}

}


 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。