как скопировать данные из файла в PostgreSQL с помощью JDBC?

Я хочу скопировать данные из файла в БД PostgreSQL с помощью JDBC. Я использовал объект оператора JDBC для копирования файла в БД. Это очень медленно.

Я узнал, что мы также можем использовать команду копирования для копирования файла в БД. Но как я могу сделать это с JDBC. Поможет даже хороший справочный материал с примером копирования в JDBC.

ПС: заранее спасибо


person Reddy    schedule 05.08.2011    source источник
comment
Покажите нам код, и мы объясним, почему он работает медленно. В частности, вы используете пакетные обновления? Вы используете готовые операторы?   -  person JB Nizet    schedule 05.08.2011
comment
да, я делаю пакетные обновления.   -  person Reddy    schedule 05.08.2011


Ответы (2)


Это работает...

import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;

import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

public class PgSqlJdbcCopyStreamsExample {

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

        if(args.length!=4) {
            System.out.println("Please specify database URL, user, password and file on the command line.");
            System.out.println("Like this: jdbc:postgresql://localhost:5432/test test password file");
        } else {

            System.err.println("Loading driver");
            Class.forName("org.postgresql.Driver");

            System.err.println("Connecting to " + args[0]);
            Connection con = DriverManager.getConnection(args[0],args[1],args[2]);

            System.err.println("Copying text data rows from stdin");

            CopyManager copyManager = new CopyManager((BaseConnection) con);

            FileReader fileReader = new FileReader(args[3]);
            copyManager.copyIn("COPY t FROM STDIN", fileReader );

            System.err.println("Done.");
        }
    }
}
person aliasmrchips    schedule 05.08.2011
comment
pedal-dialect позволяет использовать команду копирования непосредственно с объектами JPA. - person Καrτhικ; 06.01.2015
comment
Актерский состав (BaseConnection) con может не работать; в некоторых случаях соединение оборачивается каким-либо другим типом соединения (например, при использовании пулов соединений или шпионов). Что сработало для меня, так это использовать con.unwrap(BaseConnection.class) вместо этого. - person avivr; 12.02.2018
comment
Спасибо! Кажется, это единственный способ сделать это через JDBC. - person Frankie Drake; 24.05.2018

(на основе ответа aliasmrchips' :), если у вас есть Groovy (например, я использую его в ANT), вы можете сделать это следующим образом (заменив специфику Oracle на Postgres):

// exec.groovy
this.class.classLoader.rootLoader.addURL('${postgres-jdbc-driver-path}')
PgScript.load()

// PgScript.groovy
// (we cannot use the org.postgres.* classes in exec.groovy already!)
import java.io.FileReader
import java.sql.DriverManager
import org.postgresql.copy.CopyManager
import org.postgresql.core.BaseConnection

class PgScript {
    static void load() {        

        DriverManager.getConnection (
            '${jdbc-db-url}', '${db-usr}', '${db-usr-pass}'
        ).withCloseable {conn ->
            new CopyManager((BaseConnection) conn).
                copyIn('COPY t FROM STDIN', new FileReader('${sqlfile}'))
        }
    }
}

Также на основе этого статья на javaworld.com.

person Andreas Covidiot    schedule 23.02.2016