2011-10-27 4 views
1

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; 
} 
+1

Votre pilote JDBC (ou J2EE DataSource) n'est-il pas censé prendre soin de cela pour vous? –

+0

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. –

+0

@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

Répondre

1

J Utilisez une base de données qui prend en charge le regroupement de connexions (tous les SGBDR modernes prennent en charge cette fonctionnalité) et utilisez une solution prête à l'emploi, telle que DataSource ou c3p0. Voir, par exemple, official JDBC tutorial. Une chose dont je ne suis pas sûr, c'est si vous voulez un pool de connexions ou un clustering plus avancé. Mais, de toute façon, je doute que MySQL puisse fournir un clustering stable en production et, pour autant que je sache, Oracle supporte le clustering de façon transparente, grâce à son driver JDBC.

+0

Merci pour cela, mais après avoir regardé pendant des heures hier cela résout mon problème: jdbc: mysql: loadbalance: //192.168.0.3,192.168.0.4,192.168.0.5/bank J'ai juste besoin de se connecter à cette URL. D'autres optimisations peuvent être faites à ceci. Voir http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html – nknj

+0

@Nikunj Il est étrange que l'équilibrage de charge soit configuré du côté de l'application. Le nœud maître (équilibreur) doit accepter chaque requête et l'acheminer vers le nœud optimal - résolu par une stratégie d'équilibrage. – davorp

+0

@Victor Je pense que le regroupement de connexions n'a rien à voir avec le SGBDR. Le SGBDR lui-même ne sait pas que ses connexions sont en cours de regroupement - c'est une fonctionnalité côté application (serveur d'application). – davorp

Questions connexes