Java >> Java tutorial >  >> Tag >> Jdbc

Indsæt filposter i postgres db ved hjælp af clojure jdbc tager lang tid sammenlignet med python psycopg2

Det skyldes sandsynligvis, at du ikke bruger batching i din Clojure-version. Du indsætter rækker én efter én, der hver udløser commit.

Hvis du vil gøre det i Clojure, skal du partition rækker fra CSV-filer og insert! hver chunk som én batch commit. Du skal bruge den sidste arity-version, der accepterer flere col-val-vec s. Eksempelkode (ikke markeret, bare for at vise ideen):

(defn row->col-spec [row]
  [(v 0) (v 1) (v 2) (str<->int (v 3))])

(with-open [csv-file (reader "/path/to/foo.txt")]
  (try
    (->> csv-file
         (clojure-csv.core/parse-csv)
         (map row->col-spec)
         (partition 50)
         (map (fn [batch] clojure.java.jdbc/insert! db :records ["col1" "col2" "col3" "col4"] batch))
         (dorun))
    (catch Exception e
      (println e))))

Hvis du ikke behøver at gøre det i Clojure, så brug psql 's COPY kommando synes at være den nemmeste og hurtigste mulighed:

COPY records FROM '/path/to/foo.txt' WITH (FORMAT csv, DELIMITER ',',  NULL 'NULL');

Java tag