2010-09-19 14 views
8

I dati sono in streaming dal disco ed elaborati in memoria da un'applicazione Java e che devono infine essere copiati in SQL Server. I dati possono essere abbastanza grandi (quindi lo streaming) e possono richiedere fino a diverse 100.000 righe da inserire. La soluzione più veloce sembra utilizzare la funzionalità di copia bulk di SQL Server. Tuttavia, non ho trovato alcun modo per i programmi Java di farlo in modo facile o quasi abbastanza veloce.Qual è il modo più efficiente per eseguire il bulk-copy su SQL Server da Java?

Ecco alcuni modi che ho già indagato:

  • Uso della classe SqlBulkCopy in .NET. Questo è molto efficiente dal momento che è possibile eseguire lo streaming dei dati direttamente da un'origine dati e direttamente a SQL Server. Il problema con questo approccio è che devi eseguire .NET. Forse questo potrebbe essere usato usando un bridge Java to .NET. Sebbene, mi chiedo del costo dei dati di marshalling tra runtime.

  • Utilizzo dell'istruzione BULK INSERT TSQL. Il problema con questo è che è necessario creare un file correttamente formattato sul disco. Ho visto alcuni piccoli guadagni in termini di prestazioni rispetto all'inserimento batch di JDBC utilizzando questo. Inoltre, questo è utile solo localmente.

  • Scrive i file sul disco e utilizza l'utilità della riga di comando bcp. Ancora un po 'più veloce rispetto al batch di JDBC, ma non così tanto. Inoltre, perdo la possibilità di utilizzare una transazione con questo metodo.

  • Utilizzare C API. Di nuovo, molto efficiente, ma devi usare C. Ci sarebbe un modo per usarlo attraverso JNI. Se c'è qualche libreria Java gratuita là fuori che fa questo, mi piacerebbe saperlo.

Sto cercando la soluzione più veloce. La memoria non è un problema.

Grazie!

+0

Quando si dice che la fonte dei dati è Java, è possibile elaborare? I dati sono in memoria di un'applicazione/applet Java? – InSane

+0

Grazie per la tua risposta In Sane. Ho fatto la domanda un po 'più dettagliata. –

risposta

1
  • Per la risposta .NET, avrei raccomandato IKVM. Quindi il tuo codice Java sarà codice .NET e potrai chiamare qualsiasi codice .NET.
  • BULK INSERT richiede anche che il file di massa sia accessibile da SQL Server. Questa è solo un'opzione locale. Le prestazioni di Batch Update possono variare tra i diversi driver JDBC.
  • Per le chiamate native, si consiglia di utilizzare JNA (accesso nativo Java). Quindi non è necessario scrivere alcun codice C.
+0

Questa risposta ha alcune informazioni utili se mai vado con una di quelle soluzioni. Sarebbe bello se qualcuno avesse già scritto una bella libreria gratuita che avvolgesse l'API C in un'interfaccia più gradevole. Potrei finire a farlo da solo. –

0

Dalla versione 4.2 del driver Microsoft JDBC per SQL Server, esiste una classe denominata com.microsoft.sqlserver.jdbc.SQLServerBulkCopy che fa la stessa cosa della classe SqlBulkCopy di .NET.

Problemi correlati