8
votes

Quel est le moyen le plus efficace de copier en vrac à SQL Server depuis Java?

J'ai des données diffusées du disque et traitées en mémoire par une application Java et qui doit enfin être copiée dans SQL Server. Les données peuvent être assez importantes (d'où le streaming) et peuvent nécessiter jusqu'à plusieurs 100 000 lignes à insérer. La solution la plus rapide semble utiliser la fonction de copie en vrac de SQL Server. Cependant, je n'ai trouvé aucun moyen pour les programmes Java de le faire facilement ou presque assez rapidement.

Voici quelques façons dont j'ai déjà étudié:

  • à l'aide de la classe SQLBulkCopy dans .NET. Ceci est très efficace depuis que vous pouvez diffuser des données directement à partir d'une source de données et directement sur SQL Server. Le problème avec cette approche est que vous devez exécuter .NET. Cela pourrait peut-être être utilisé à l'aide d'un pont Java vers .NET. Bien que, je m'interroge sur le coût des données marshalling entre les runtimes.

  • à l'aide de l'instruction TSQL d'insertion en vrac. Le problème avec ceci est que vous avez besoin de créer un fichier correctement formaté sur le disque. J'ai vu des gains de petite performance sur l'insert de lot de JDBC en utilisant ceci. En outre, cela n'est utile que localement.

  • écrire des fichiers sur disque et utilisez l'utilitaire de ligne de commande BCP. Encore un peu plus rapide que JDBC Batch Insert, mais pas beaucoup. Je perds également la capacité d'utiliser une transaction avec cette méthode.

  • Utilisez le C API . Encore une fois, très efficace, mais vous devez utiliser C. Il y aurait un moyen de l'utiliser par JNI. S'il y a une bibliothèque de Java gratuite, cela le fait, j'aimerais savoir à ce sujet.

    Je cherche la solution la plus rapide. La mémoire n'est pas un problème.

    Merci!


2 commentaires

Lorsque vous dites que la source des données est Java - pouvez-vous élaborer? Les données de la mémoire d'une application / applet de java sont-elles?


Merci pour votre réponse en Sane. J'ai fait la question un peu plus détaillée.


3 Réponses :


1
votes
  • pour la réponse .NET Je voudrais recommandé IKVM. Ensuite, votre code Java sera un code .NET et vous pouvez appeler n'importe quel code .NET.
  • L'insert en vrac requise également que le fichier en vrac est accessible depuis SQL Server. Ceci n'est qu'une option locale. Les performances de la mise à jour du lot peuvent varier entre différents pilotes JDBC.
  • Pour les appels natifs, je serais recommandé d'utiliser la JNA (Java Native Access). Ensuite, vous n'avez pas besoin d'écrire un code C.

1 commentaires

Cette réponse a des informations utiles si jamais avec une de ces solutions. Ce serait génial si quelqu'un avait déjà écrit une belle bibliothèque libre qui enveloppait l'API C dans une interface plus agréable. Je pourrais finir de le faire moi-même.



0
votes

La meilleure option pour moi était d'utiliser le pilote commercial SQL Server JDBC à partir de DataDirect avec des appels JDBC standard Addbatch / ExecuteBatch qui s'exécutent sur Linux et Windows - https://blogs.datadirect.com/2012/05/frique- to-bulk-insert-jdbc-lots-in-Microsoft-SQL-Server-oracle-sybase.html

J'ai vu des temps de charge améliorer de 7 heures à moins de 30 minutes.


0 commentaires

0
votes

Depuis la version 4.2 du pilote Microsoft JDBC pour SQL Server, il existe une classe nommée com.microsoft.sqlserver.jdbc.sqlserverbulkcopy qui fait la même chose que le sqlbulkcopy classe de .net.


0 commentaires