2010-09-19 4 views
8

J'ai des données qui sont diffusées à partir du disque et traitées en mémoire par une application Java et qui doivent finalement être copiées dans SQL Server. Les données peuvent être assez volumineuses (d'où le streaming) et peuvent nécessiter jusqu'à 100 000 lignes à insérer. La solution la plus rapide semble utiliser la fonctionnalité de copie en bloc de SQL Server. Cependant, je n'ai trouvé aucun moyen pour les programmes Java de le faire facilement ou presque assez rapidement.Quel est le moyen le plus efficace de copier en masse vers SQL Server à partir de Java?

Voici quelques façons que je l'ai déjà étudiés:

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

  • Utilisation de l'instruction BULK INSERT TSQL. Le problème avec ceci est que vous devez créer un fichier correctement formaté sur le disque. J'ai vu quelques petits gains de performance sur l'insertion de lot de JDBC en utilisant ceci. En outre, ceci n'est utile que localement. Ecrivez les fichiers sur le disque et utilisez l'utilitaire de ligne de commande bcp. Encore un peu plus rapide que JDBC mais pas beaucoup. Je perds également la possibilité d'utiliser une transaction avec cette méthode.

  • Utilisez le C API. Encore une fois, très efficace, mais vous devez utiliser C. Il serait un moyen d'utiliser ceci via JNI. S'il y a une librairie Java gratuite là-dedans, j'aimerais bien le savoir.

Je suis à la recherche de la solution la plus rapide. La mémoire n'est pas un problème.

Merci!

+0

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

+0

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

Répondre

1
  • Pour la réponse .NET, je recommanderais IKVM. Ensuite, votre code Java sera le code .NET et vous pouvez appeler n'importe quel code .NET.
  • Le BULK INSERT requis également que le fichier en bloc est accessible à partir de SQL Server. Ceci est seulement une option locale. Les performances de Batch Update peuvent varier entre différents pilotes JDBC.
  • Pour les appels natifs, je recommanderais d'utiliser JNA (accès natif Java). Ensuite, vous n'avez pas besoin d'écrire du code C.
+0

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

0

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 la classe SqlBulkCopy de .NET.

Questions connexes