Je travaille sur une application où j'ai besoin de connecter N nombre de systèmes de base de données [n gammes n'importe où entre 1 et 350]. P>
L'idée est - l'utilisateur sera présenté avec une liste de bases de données et sera invitée à sélectionner tout ou partie des bases de données de la liste. p>
Une fois les bases de données sélectionnées, je dois vous connecter à chacune des bases de données et exécuter une procédure stockée. P>
Je prévois d'utiliser un ancien JDBC uni et d'obtenir une connexion pour chacun d'eux une fois [ou en les exécutant dans plusieurs threads] et exécutez la procédure de magasin et fermez la connexion. P>
Et tout cela devrait arriver dans une transaction. Quelle est la meilleure façon de faire cela? P>
Si non JDBC ... toute autre manière efficace? p>
mise à jour - p>
La procédure stockée est réellement impliquée dans la mise en œuvre de certains SQL - par exemple à la mise à jour d'une colonne, une autorisation de subvention pour un utilisateur, etc. P>
5 Réponses :
Je créerais une threadpool avec une quantité maximale maximale raisonnable, entre dix et vingt threads peut-être, avec l'aide de Exécuteurs # Newfixedthreadpool () code>
et appelez les tâches d'exécution distinctes de la connexion et de l'exécution de DB distinctes. En tant que appelable code>
en utilisant ExecuTertorservice # invokeAll () code>
. Vous souhaitez jouer avec le fileduc et le profil qui donne la meilleure performance après tout. P>
Chaque Appelable code> La mise en œuvre doit prendre les détails de la connexion et le nom de SP comme l'argument du constructeur afin de pouvoir réutiliser la même implémentation pour différents appels de DB. P>
servleContextExtener code> est utile ici. P>
Cela ressemble à un grand désordre, mais c'est votre problème. P>
Vous avez besoin d'une piscine de connexion par base de données. Je ne conseillerais pas que vous essayiez de gérer vous-même le cycle de vie de la connexion. Laissez le serveur d'applications pour vous pour vous. P>
Si vous souhaitez qu'un groupe de bases de données participe à une grande transaction, vous devez utiliser les pilotes JDBC XA pour tous em> d'entre eux. Vous aurez également besoin d'un gestionnaire de transactions JTA pour superviser la transaction pour vous. P>
Les procédures stockées ne peuvent contenir aucune logique pour gérer les transactions; Vous devez laisser JTA le faire. p>
Vous ne dites pas quelle est la procédure stockée. S'il n'a pas besoin de renvoyer quoi que ce soit, une conception alternative pourrait être JMS, une file d'attente et un pool d'écouteurs. Je serais inquiet de filer si j'étais toi. Je trouverais un moyen de laisser le conteneur faire ce genre de choses compliquée pour MeiSi, je pouvais. P>
Je suppose que toutes les URL de connexion de base de données sont conservées dans une base de données centrale. Je pense que nous ne voulons pas créer de données de données sur le serveur d'applications [comme mentionné, j'ai environ 1 - 350 sources de données] ..... Dans quel cas je suppose que je dois gérer le cycle de vie de connexion moi-même?
Comme Duffymo indiquait dans son commentaire, vous ne pourrez effectuer que des transactions sur plusieurs bases de données si vous avez un coordonnateur de transactions et une commission de deux phases. P>
Pour cela, vous aurez besoin d'une pile J2EE qui gérera JTA. Si vous courez dans Tomcat ou un autre conteneur qui n'a pas de JTA, il existe plusieurs options que vous pouvez télécharger et installer. P>
Bien sûr, vous devrez laisser le conteneur, pas la base de données / la procédure stockée gérer la transaction commettre et les retournements. P>
S'il est acceptable que vous utilisiez deux connexions, utilisez la piscine de connexion C3P0 pour gérer eux. Pour connecter deux bases de données, je déclare: puis deux méthodes similaires: p>
Faites-le simplement dans un cycle pour vos 350 bases de données. Extrayez les paramètres de chaque base de données de votre base de données principale si nécessaire pour nettoyer le code.
public static Connection getconnection(String db,String host){ try { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://"+**Pass Your Host Here Like Localhost**+"/"+Pass Your DB Name** +"?useUnicode=yes&characterEncoding=UTF- 8","root","root"); return con; } catch (ClassNotFoundException | SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } }
Le code d'écriture en réponse est sympa, mais écrit une explication aussi de la raison pour laquelle ce code fonctionne sera de mieux de l'avis
Quel type d'application? Desktop ou Web?
C'est une application Web.
Ma compréhension est que vous n'avez pas besoin de le faire dans une seule transaction, est-ce vrai? Sinon beaucoup plus besoin d'être pris en compte.
Je prévois de le faire dans une seule transaction ... pas sûr de la complexité!