J'ai une application Java s'exécutant sur tomcat. Je veux le connecter à mon cluster MySQL.Application Java se connectant à de nombreux noeuds SQL
Dans le cluster, j'ai trois nœuds SQL. Je veux tenter une connexion à tous les trois nœuds et ensuite prendre la connexion qui me revient le plus vite!
Comment puis-je faire cela? La performance est vraiment importante pour moi.
Voici ce que j'ai jusqu'ici:
Une classe connecteur
public class Connecter extends Thread {
String dbURL;
String dbDriver = "com.mysql.jdbc.Driver";
Connection dbCon = null;
public Connecter(String dbURL) {
this.dbURL = dbURL;
}
@Override
public void run() {
try {
Class.forName(dbDriver);
try {
dbCon = DriverManager.getConnection(dbURL, "root", "");
} catch (SQLException ex) {
}
} catch (ClassNotFoundException ex) {
}
}
}
Une classe plus
public void run() {
try {
dbCon.close();
} catch (SQLException ex) {
ex.printStackTrace();
} catch (NullPointerException e) {}
}
Et DbBean tente de se connecter via cette méthode:
String dbURL1 = "jdbc:mysql://192.168.0.3/bank";
String dbURL2 = "jdbc:mysql://192.168.0.4/bank";
String dbURL3 = "jdbc:mysql://192.168.0.5/bank";
String dbDriver = "com.mysql.jdbc.Driver";
private Connection dbCon;
public boolean connect() throws ClassNotFoundException, SQLException, InterruptedException {
Class.forName(dbDriver);
Connecter one = new Connecter(dbURL1);
Connecter two = new Connecter(dbURL2);
Connecter three = new Connecter(dbURL3);
Closer a = new Closer (one.dbCon);
Closer b = new Closer (two.dbCon);
Closer c = new Closer (three.dbCon);
one.start();
two.start();
three.start();
while(one.isAlive() && two.isAlive() && three.isAlive()){
Thread.sleep(10);
}
if(one.dbCon != null) {
this.dbCon = one.dbCon;
two.interrupt();
b.start();
three.interrupt();
c.start();
return true;
} else {
one.interrupt();
a.start();
}
if(two.dbCon != null) {
this.dbCon = two.dbCon;
one.interrupt();
a.start();
three.interrupt();
c.start();
return true;
} else {
two.interrupt();
b.start();
}
if(three.dbCon != null) {
this.dbCon = three.dbCon;
one.interrupt();
a.start();
two.interrupt();
b.start();
return true;
} else {
three.interrupt();
c.start();
}
return false;
}
Votre pilote JDBC (ou J2EE DataSource) n'est-il pas censé prendre soin de cela pour vous? –
Vous ne devriez pas avoir besoin de faire cela manuellement, et le coût de l'overhead/complexité ne vaudra aucun avantage. Jusqu'à ce que vous avez identifié qu'il s'agit d'un goulot d'étranglement * réel * (ce qui semble peu probable à première vue), je ne pense pas que je poursuivrais cela. En outre, il serait plus important d'essayer de faire en sorte que la machine réponde le plus rapidement possible à votre requête, ce qui n'est pas la même chose que celle qui vous permet d'obtenir la connexion la plus rapide. –
@VictorSorokin Salut, je suis vraiment désemparé de savoir comment je peux mettre en œuvre cette fonctionnalité avec le pilote hors de la boîte. Avez-vous des exemples d'une configuration qui me fait essayer de me connecter à plusieurs nœuds SQL? Un lien fera l'affaire! Merci! – nknj