2012-01-20 11 views
5

L'applicazione Web attualmente sviluppata supporta l'esportazione CSV da (utilizzando SELECT INTO OUTFILE) e l'importazione in (utilizzando LOAD DATA INFILE) Server MySQL per mantenere enormi set di dati che sono estremamente costosi da elaborare utilizzando SELECT e istruzioni INSERT di massa nel codice Java (set di risultati di elaborazione, roba di codifica delle stringhe, patrimonio logico aziendale, ecc.). Questi file CSV non sono basati su applicazioni, pertanto rappresentano solo il contenuto delle tabelle raw dal database MySQL. Ma per quanto ho capito questo approccio è valido solo se ho file locali, quindi sia il server delle applicazioni web che mysqld devono essere eseguiti sulla stessa macchina.JDBC: esportazione/importazione di dati raw CSV da/verso database MySQL remoto mediante flussi (SELEZIONA IN OUTFILE/LOAD DATA INFILE)

La configurazione dell'applicazione può specificare una connessione al database remoto. Ciò significa ovviamente che i file CSV caricati vengono memorizzati da qualche parte localmente nella macchina su cui è in esecuzione l'applicazione Web, quindi non posso specificare la posizione del file di dati nell'istruzione MySQL LOAD DATA INFILE. (Lo stesso scenario è per una richiesta di download CSV). Quindi, quello che sto cercando di trovare è un modo per specificare il file CSV "virtualmente" - utilizzando un flusso I/O che può essere elaborato da JDBC e MySQL, analogamente alla gestione dei BLOB, ecc.

Fa JDBC/MySQL supporta questa tecnica per i file CSV per l'importazione e l'esportazione?

Grazie in anticipo.

risposta

4

È possibile eseguire LOAD DATA INFILE utilizzando l'opzione LOCAL, che quindi caricherà il file CSV da cui è in esecuzione il client JDBC MySQL, utilizzando com.mysql.jdbc.Statement#setLocalInfileInputStream. Ad esempio:

// conn is an existing java.sql.Connection to a remote server 
try (Statement st = conn.createStatement()) { 
    String localCsvFileSpec = "C:/Users/Jamie/Desktop/foo.csv"; // on this machine 
    ((com.mysql.jdbc.Statement) st).setLocalInfileInputStream(
      new FileInputStream(localCsvFileSpec)); 
    st.execute(
      "LOAD DATA LOCAL INFILE '(placeholder)' " + 
      "INTO TABLE table01 " + 
      "COLUMNS TERMINATED BY ',' " + 
      "(id, txt) " + 
      ""); 
} 

Vedere this post per ulteriori informazioni.

Sfortunatamente, sembra che non sia possibile utilizzare SELECT INTO OUTFILE per esportare file in un punto diverso dal proprio server di database, da this answer on Stack Overflow.

+0

Questa risposta mi ha salvato la giornata! –

Problemi correlati