Help: OutOfMemoryError - Mailing list pgsql-jdbc

From Dongsheng Song
Subject Help: OutOfMemoryError
Date
Msg-id 200109240437.f8O4bJh08335@postgresql.org
Whole thread Raw
List pgsql-jdbc
When I use export a lager table, the java application throws exception 'OutOfMemoryError',
How can I do ? this is the source:

/*
    export table
 */

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

public class ExpTbl_MS {

    private static String db_res[][] = {
        { "com.ashna.jturbo.driver.Driver", "jdbc:JTurbo://egcs:1433/egcs/charset=GBK" },
        { "net.avenir.jdbc2.Driver", "jdbc:AvenirDriver://172.16.1.156:1433/fpb" },
        { "org.gjt.mm.mysql.Driver",
"jdbc:mysql://egcs:3306/fpb?useUnicode=true&characterEncoding=gb2312&autoReconnect=true"}, 
        { "org.postgresql.Driver", "jdbc:postgresql://orchis:5432/fpb" },
        { "oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@202.100.100.201:1521:ORA" },
        { "COM.ibm.db2.jdbc.net.DB2Driver", "jdbc:db2://egcs:6789/fpb" },
        { "sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:sql" },
        { "com.ms.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:sql" },
    };


    public static void main(String[] args) throws Exception {

        int i = 0, j;
        String db_drv = "com.ashna.jturbo.driver.Driver";
        String db_url = "jdbc:JTurbo://172.16.19.2:1433/agriec/charset=GBK";
        String db_usr = "sa";
        String db_pwd = "zm";
        String db_exp = "ExpTbl_MS.dmp";

        while(i < args.length) {
            if(args[i].startsWith("db_drv=")) {
                db_drv = args[i].substring(7);
            } else if(args[i].startsWith("db_url=")) {
                db_url = args[i].substring(7);
            } else if(args[i].startsWith("db_usr=")) {
                db_usr = args[i].substring(7);
            } else if(args[i].startsWith("db_pwd=")) {
                db_pwd = args[i].substring(7);
            } else if(args[i].startsWith("db_exp=")) {
                db_exp = args[i].substring(7);
            } else {
                break;
            }
            i++;
        }

        Class.forName(db_drv);

        Connection db_cn = DriverManager.getConnection(db_url, db_usr, db_pwd);

        //Statement db_st = db_cn.createStatement();
        Statement db_st = db_cn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_READ_ONLY);
        for(j = 0; i < args.length; i++) {
            try {
                System.out.print("starting export table '" + args[i] + "' ");
                export(db_st, args[i], (db_exp + "." + j));
                System.out.println(" OK");
            } catch(Exception se) {
                System.out.println(" Fail(" + se.getMessage() + ")");
            }
            System.out.println("\n");
        }

        db_st.close();
        db_cn.close();
    }

    public static void export(Statement db_st, String tableName, String of)
        throws SQLException, IOException {

        ObjectOutputStream os = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(of), 512 * 1024));
        ResultSet db_rs = db_st.executeQuery("select * from " + tableName);
        ResultSetMetaData db_rsmd = db_rs.getMetaData();
        int i, j, n = db_rsmd.getColumnCount();
        Object obj;

        os.writeInt(0);
        os.writeObject(tableName);
        os.writeInt(n);
        for(i = 1; i <= n; i++) {
            os.writeObject(db_rsmd.getColumnName(i));
            os.writeObject(db_rsmd.getColumnTypeName(i));
            os.writeInt(db_rsmd.getColumnDisplaySize(i));
            os.writeInt(db_rsmd.getPrecision(i));
            os.writeInt(db_rsmd.getScale(i));
            os.writeInt(db_rsmd.isNullable(i));
        }

        for(j = 0; db_rs.next(); j++) {
            for(i = 1; i <= n; i++) {
                obj = db_rs.getObject(i);
                if(obj == null || db_rs.wasNull()) {
                    os.writeObject(null);
                } else if(obj instanceof byte[]) {
                    os.writeObject(obj);
                } else if(obj instanceof java.sql.Timestamp ||
                        obj instanceof java.sql.Date ||
                        obj instanceof java.sql.Time
                        ) {
                    os.writeObject(new java.lang.Long(((java.util.Date)obj).getTime()));
                } else if(obj instanceof java.sql.Blob) {
                    Blob blob = (Blob)obj;
                    os.writeObject(blob.getBytes(1L, (int)blob.length()));
                    blob = null;
                } else if(obj instanceof java.sql.Clob) {
                    Clob clob = (Clob)obj;
                    os.writeObject(clob.getSubString(1L, (int)clob.length()));
                    clob = null;
                } else if(obj instanceof java.io.InputStream) {
                    System.err.print("Unknown, ");
                } else {
                    os.writeObject(obj.toString());
                }
                obj = null;
            }
            if(j % 1000 == 0) {
                System.out.print('.');
                System.gc();
                System.runFinalization();
                System.gc();
                os.flush();
            }
        }
    }
}


pgsql-jdbc by date:

Previous
From: "Vianen, Jeroen van"
Date:
Subject: Fix for broken JDBC's getColumn() (take 2)
Next
From: Matt Fair
Date:
Subject: Re: blobs in a client/server environment