An example of Large Objects and JDBC

Поиск
Список
Период
Сортировка
От David Huttleston Jr
Тема An example of Large Objects and JDBC
Дата
Msg-id 200010070440.XAA03622@proxy.hddesign.com
обсуждение исходный текст
Список pgsql-interfaces
Hey All, With all the discussion of large objects and JDBC I thought a fully functional
example would be handy.  Please forgive the length of this post, I wanted to
include enough documentation to be useful. Listed below is the Shelf class, then below that is a demo class which
shows it in action.  Obviously make sure the Postgres JDBC driver is in your
classpath before testing. Note: in my recent reply to Gabriel I attached a Shelf class.  This one is simpler
and better documented.  Throw the other one out.
Have Fun, Dave

/* Shelf encapsulates the process of serializing a class    to a table in a postgresql database.
 author: David Huttleston Jr 11/15/1999 mailto: dhjr@hddesign.com license: free feedback: I'd love some, especially any
correctionsor improvements.
 
 The table whose name is passed in the constructor must have fields called "id"  and "object".  It's fine if the table
hasother fields.
 
 NOTE: Because transactions are used, each Shelf instance must have exclusive access to its connection. ie con must not
beshared.
 
 The schema below is an example of a good shelf table:
 CREATE TABLE "tbl_objectshelf" (   "id" int4 PRIMARY KEY,   "object" oid );*/

import java.sql.*;
import java.io.*;
import java.util.*;

public class Shelf
{ public Shelf(   String driver,   String dsn,   String username,   String password,   String table   ) throws
SQLException,ClassNotFoundException {   this.setConnection(driver, dsn, username, password, table ); }
 
 public Shelf(Connection newCon, String table)   throws SQLException {   this.setConnection(newCon, table); }
 public void setConnection(   String driver,   String dsn,   String username,   String password,   String table   )
throwsSQLException, ClassNotFoundException {     Class.forName(driver);     Connection con =
DriverManager.getConnection(dsn,username, password );     this.setConnection(con,table); }
 
 public void setConnection(Connection newCon, String table) throws SQLException {   con = newCon;
con.setAutoCommit(false);
   String sqlPut = "insert into \"" + table + "\" (id, object) values (?,?)";   psPut = con.prepareStatement(sqlPut);
   String sqlGet = "select object from \"" + table + "\" where id = ?";   psGet = con.prepareStatement(sqlGet); }
 public void putObject(Integer key, Object object)   throws SQLException, IOException {     // create temporary sink to
storeobject     ByteArrayOutputStream baos = new ByteArrayOutputStream();
 
     // fill temporary sink with serialized object     ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
     // create source out of the temporary sink     byte[] sink = baos.toByteArray();
     // NOTE: pg jdbc driver does not support streams yet     // ByteArrayInputStream bais = new
ByteArrayInputStream(sink);
     // send everything to the database     con.clearWarnings();     psPut.clearParameters();     psPut.setInt(1,
key.intValue());    psPut.setBytes(2, sink);
 
     // NOTE: pg jdbc driver does not support streams yet     // psPut.setBinaryStream(2, bais, sink.length);
     psPut.executeUpdate();     con.commit();     // NOTE: if an exception is thrown     //   the commit will not be
reachedand the     //   transaction will be rolled back by default }
 
 public Object getObject(Integer id)   throws SQLException, IOException, ClassNotFoundException {
con.clearWarnings();  psGet.clearParameters();   psGet.setString(1, id.toString() );   ResultSet rs =
psGet.executeQuery();  Object obj = null;
 
   if (rs != null)   {     if ( rs.first() )     {       InputStream is = rs.getBinaryStream(1);
ObjectInputStreamois = new ObjectInputStream(is);       obj = ois.readObject();       ois.close();       is.close();
}     rs.close();   }   return obj; }
 
 public void close() throws java.lang.Throwable {   psPut.close();   psGet.close();   con.close(); }
 protected void finalize() throws java.lang.Throwable {   this.close();   super.finalize(); }
 Connection con; PreparedStatement psPut; PreparedStatement psGet;
}

/* TestShelf is a demo of the Shelf class
 NOTE: run this schema in myDatabase to create tbl_objectshelf CREATE TABLE "tbl_objectshelf" (   "id" int4 PRIMARY
KEY,  "object" oid );
 
*/

import java.util.*;

public class TestShelf
{ public static void main(String[] args) {   try   {     Shelf shelf = new Shelf(       "org.postgresql.Driver",
"jdbc:postgresql://localhost/myDatabase",      "myUserName",       "myPassword",       "tbl_objectshelf"       );
 
     // build an sample object to save on the shelf     ArrayList stuff = new ArrayList();     stuff.add( new
Integer(1));     stuff.add( new String("my 2nd thing") );
 
     // create an integer to use as primary key     //   you must change this integer each time you run     //   this
example,otherwise postgres will complain about     //   a duplicate primary key     Integer key = new Integer(2);
 
     // save stuff on the shelf     shelf.putObject(key, stuff);
     // restore the stuff into a new ArrayList     // since Shelf.getObject() returns a generic object     // you must
explicitlycast it into the proper form     ArrayList restoredStuff = (ArrayList) shelf.getObject(key);
 
     // prove that the stuff is restored     System.out.println(       " The second item within stuff: " +
(String)restoredStuff.get(1)       );   } catch(Exception x) { x.printStackTrace(); } }
 
}



В списке pgsql-interfaces по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: C++ interfaces
Следующее
От: "George P. Esperanza"
Дата:
Сообщение: ODBC problem