转载地址:http://my.oschina.net/liuyuanyuangogo/blog/151537
pg用大对象存储二进制数据的老文档:http://jdbc.postgresql.org/documentation/80/binary-data.html
//VM配置:256M-512M
//通过lo_import(‘文件路径’)函数向oid字段插入二进制文件,通过(不会内存溢出)。
/** * * @author Liu Yuanyuan */ private void insertOid() { String driver = "org.postgresql.Driver";//"com.highgo.jdbc.Driver";//192.168.100.125 String url = "jdbc:postgresql://" + "127.0.0.1" + ":" + "5866" + "/" + "db1"; Connection conn = null; Statement stmt = null; try { Class.forName(driver); System.out.println("success find class"); conn = DriverManager.getConnection(url, "highgo", "hg"); System.out.println("success connect"); stmt = conn.createStatement(); //driectly insert String f = "d:/1.jpg"; stmt = conn.prepareStatement("INSERT INTO oidtable VALUES (11, lo_import('"+f+"'))"); //or by update //String f = "d://2.jpg"; //PreparedStatement ps = conn.prepareStatement("update oidtable set obj = lo_import('"+f+"') where id=?"); //ps.setInt(1,11); ps.executeUpdate(); } catch(Exception ex) { ex.printStackTrace(System.out); } finally { try { if(stmt!=null) stmt.close(); if(conn!=null) conn.close(); } catch(Exception ex) { ex.printStackTrace(System.out); } finally { System.out.println("finally"); } } }
//VM配置:256M-512M
//直接通过setLong()向oid插入1GB的文件,通过(2分钟之内插入完毕);
public void insertOid() { Connection conn = null; PreparedStatement ps = null; try { String driver = "org.postgresql.Driver"; String url = "jdbc:postgresql://" + "127.0.0.1" + ":" + "5432" + "/" + "db1"; Class.forName(driver); System.out.println("class"); conn = DriverManager.getConnection(url, "postgres", "pg"); System.out.println("connect"); // All LargeObject API calls must be within a transaction block conn.setAutoCommit(false); // Get the Large Object Manager to perform operations with LargeObjectManager lobj = ((org.postgresql.PGConnection) conn).getLargeObjectAPI(); // Create a new large object long oid = lobj.createLO(LargeObjectManager.READ | LargeObjectManager.WRITE); // Open the large object for writing LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE); //Now open the file File file = new File("d://1.jpg"); FileInputStream fis = new FileInputStream(file); // Copy the data from the file to the large object byte buf[] = new byte[2048]; int s, tl = 0; while ((s = fis.read(buf, 0, 2048)) > 0) { obj.write(buf, 0, s); tl += s; } // Close the large object obj.close(); // Now insert the row into imageslo ps = conn.prepareStatement("INSERT INTO lob.oidtable VALUES (?, ?)"); ps.setInt(1, 1); ps.setLong(2, oid); ps.executeUpdate(); fis.close(); // Finally, commit the transaction. conn.commit(); conn.setAutoCommit(true); } catch (Exception ex) { ex.printStackTrace(System.out); } finally { try { if (ps != null) { ps.close(); } if(conn != null) { conn.close(); } System.out.println("close all"); } catch (SQLException ex) { ex.printStackTrace(System.out); } } }
//VM配置:256M-512M
//直接通过getLong()从oid取出1GB的文件,通过(2分钟之内取出完毕);
public void getBinaryFile() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { String driver = "org.postgresql.Driver"; String url = "jdbc:postgresql://" + "127.0.0.1" + ":" + "5866" + "/" + "db1"; Class.forName(driver); System.out.println("class"); conn = DriverManager.getConnection(url, "highgo", "hg"); System.out.println("connect"); // All LargeObject API calls must be within a transaction block conn.setAutoCommit(false); // Get the Large Object Manager to perform operations with LargeObjectManager lobj = ((org.postgresql.PGConnection) conn).getLargeObjectAPI(); ps = conn.prepareStatement("SELECT obj FROM lob.oidtable WHERE id = ?"); ps.setInt(1, 1); rs = ps.executeQuery(); while (rs.next()) { // Open the large object for reading long oid = rs.getLong(1); LargeObject obj = lobj.open(oid, LargeObjectManager.READ); // Read the data // obj.read(buf, 0, obj.size());//its read method // Do something with the data read here //for example:load the file to disk OutputStream ops = new FileOutputStream(new File("d:\111.jpg")); byte buf[] = new byte[1024];//当文件很大时,用obj.size()将内存溢出,所以可以自定义一个合适的值 for (int i; (i = obj.read(buf, 0,1024)) > 0;) { ops.write(buf, 0, i); ops.flush(); } // Close the object obj.close(); ops.close(); } // Finally, commit the transaction conn.commit(); } catch (Exception ex) { ex.printStackTrace(System.out); } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if(conn != null) { conn.close(); } System.out.println("close all"); } catch (SQLException ex) { ex.printStackTrace(System.out); } } }