Какой самый эффективный способ массового копирования на SQL Server из Java? - PullRequest
8 голосов
/ 19 сентября 2010

У меня есть данные, которые передаются с диска и обрабатываются в памяти приложением Java и, наконец, должны быть скопированы в SQL Server. Данные могут быть довольно большими (следовательно, потоковыми) и могут потребовать до нескольких 100 000 строк для вставки. Кажется, самое быстрое решение - использовать функцию массового копирования SQL Server. Однако я не нашел способа для программ Java сделать это легко или почти достаточно быстро.

Вот несколько способов, которые я уже исследовал:

  • Использование класса SqlBulkCopy в .NET. Это очень эффективно, поскольку вы можете передавать данные прямо из источника данных прямо на SQL Server. Проблема с этим подходом заключается в том, что вам нужно запустить .NET. Возможно, это можно использовать с помощью моста Java в .NET. Хотя меня интересует стоимость сортировки данных между средами выполнения.

  • Использование оператора BULK INSERT TSQL. Проблема в том, что вам нужно создать правильно отформатированный файл на диске. Я видел небольшой прирост производительности по сравнению с пакетной вставкой JDBC, используя это. Кроме того, это полезно только локально.

  • Записать файлы на диск и использовать утилиту командной строки bcp. Все еще немного быстрее, чем пакетная вставка JDBC, но не намного. Я также теряю возможность использовать транзакцию с этим методом.

  • Используйте C API . Опять же, очень эффективно, но вам нужно использовать C. Был бы способ использовать это через JNI. Если есть какая-то бесплатная библиотека Java, которая делает это, я хотел бы знать об этом.

Я ищу самое быстрое решение. Память не проблема.

Спасибо!

Ответы [ 3 ]

1 голос
/ 19 сентября 2010
  • Для ответа .NET я бы порекомендовал IKVM.Тогда ваш Java-код будет представлять собой .NET-код, и вы сможете вызывать любой .NET-код.
  • BULK INSERT также требует, чтобы массовый файл был доступен из SQL Server.Это только локальный вариант.Производительность от пакетного обновления может быть разной для разных драйверов JDBC.
  • Для собственных вызовов я бы порекомендовал использовать JNA (собственный доступ Java).Тогда вам не нужно писать какой-либо C-код.
0 голосов
/ 18 мая 2016

Начиная с версии 4.2 драйвера Microsoft JDBC для SQL Server, существует класс с именем com.microsoft.sqlserver.jdbc.SQLServerBulkCopy, который делает то же самое, что и класс SqlBulkCopy .NET.

0 голосов
/ 22 июля 2015

Лучшим вариантом для меня было использование коммерческого драйвера JDBC для SQL Server из DataDirect со стандартными вызовами JDBC addBatch / executeBatch, которые работают в Linux и Windows - https://blogs.datadirect.com/2012/05/how-to-bulk-insert-jdbc-batches-into-microsoft-sql-server-oracle-sybase.html

Я видел, как время загрузки улучшилосьОт 7 часов до 30 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...