2010-11-09 8 views
2

Je construis une application au travail et j'ai besoin de conseils. J'ai un problème quelque peu unique dans lequel j'ai besoin de recueillir des données logées dans un serveur MS SQL Server, et de le transplanter sur un serveur mySQL toutes les 15 minutes. Je l'ai déjà fait en C# avec un DataGrid, mais j'essaie maintenant de construire une version Java que je peux utiliser sur un serveur Ubuntu, mais je ne trouve pas de modèle similaire pour Java.Java MS SQL -> conversion mySQL

Juste pour donner un peu de fond

Lorsque je tire les données de la MS SQL Server, il a toujours 9 colonnes, mais il pourrait avoir entre 0 - 1000 lignes.

Avant de m'insérer aveuglément dans le serveur mySQL, je manipule certaines données.

  • Je convertir une colonne de temps de CST sur la base d'une colonne STATE
  • je bande certains caractères pour éviter l'injection SQL

J'ai essayé d'utiliser le ResultSet, mais je rencontre des problèmes avec « avant seul le résultat définit les "règles".

Quelle serait la meilleure structure de données pour contenir cette information, la manipuler, puis l'analyser pour l'insérer plus tard dans mySQL?

+0

C'est une tâche SQL Server SSIS typique. – robbbert

+1

Pourquoi rayez-vous les caractères des données que vous obtenez de la base de données MS SQL? Si vous les obtenez à partir d'une base de données, cela aurait dû être fait avant de l'enregistrer pour la première fois. –

Répondre

2

Cela ressemble à un travail pour PreparedStatements!

Définie ici: http://download.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html

Exemple rapide: http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html

PreparedStatements vous permet de traiter en lots des ensembles de données avant de les pousser dans la base de données cible. Ils vous permettent également d'utiliser la méthode PreparedStatement.setString qui gère les caractères d'échappement pour vous.

Pour la conversion de temps, je voudrais récupérer la valeur STATE de la ligne, puis récupérer la valeur de temps. Avant d'appeler PreparedStatement.setDate, convertissez l'heure en CST si nécessaire.

Je ne pense pas que vous auriez besoin de toute la surcharge qu'un outil ORM nécessite.

+0

D'accord, mon ORM est une alternative assez lourde, mais je l'ai utilisé dans le passé quand je savais que j'allais échanger beaucoup entre les vendeurs DB. +1 :-) –

1

Vous pourriez envisager d'utiliser une technologie ORM comme Hibernate. Cela peut sembler un peu lourd au premier abord, mais cela signifie que vous pouvez facilement gérer les divers mappages de tables pour diverses bases de données, tout en ayant la puissance de la librairie RegEx de Java pour toutes les exigences de manipulation. Vous aurez donc une classe Java qui représente la table source (avec son mapping Hibernate) et une autre classe Java qui représente la table cible et enfin une classe utilitaire de conversion qui manipule ces données. Hibernate prend en charge le SQL CRUD pour vous, donc pas besoin de vous inquiéter de SQL spécifique à la base de données (tant que vous obtenez le mappage correct).

Il réduit également le problème d'injection SQL

+0

Faites-moi savoir si vous voulez plus de détails concrets –