2011-10-27 7 views
1

私はTomcatでJavaアプリケーションを実行しています。 MySQL Clusterに接続したいと思っています。多くのSQLノードに接続しているJavaアプリケーション

クラスタには3つのSQLノードがあります。 3つのノードすべてへの接続を試してから、私に返す接続を最速にしたいと思っています!

どうすればいいですか?パフォーマンスは私にとって本当に重要です。ここで

は私がこれまで持っているものです。

コネクタクラス

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) { 
     } 
    } 

} 

近いクラス

public void run() { 
     try { 
      dbCon.close(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } catch (NullPointerException e) {} 
    } 

そして、この方法を経由して接続しようとするDbBean:

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

JDBCドライバ(またはJ2EEデータソース)がこれを処理しているとは限りませんか? –

+0

これを手動で行う必要はありません。また、オーバーヘッド/複雑さのコストは、何のメリットもありません。あなたがこれが現実のボトルネックであることがわかるまでは(私はこれを追いかけるとは思わない)さらに、あなたのクエリを最も速く処理できるようにすることがより重要になります。これは、どちらがあなたに最も速く接続できるかと同じではありません。 –

+0

@VictorSorokinこんにちは、私はドライバのボックス機能のままでこれをどのように実装することができるのか本当に分かりません。複数のSQLノードに接続しようとする設定の例がありますか?リンクができます!ありがとう! – nknj

答えて

1

J接続プールをサポートするデータベースを使用する必要があります(現代のRDBMSではこれをサポートしています)。DataSourceやc3p0などのすぐに使えるソリューションを使用してください。

たとえば、official JDBC tutorialを参照してください。

私がよく分からないことの1つは、接続プールかより高度なクラスタリングかどうかです。しかし、とにかく、私はMySQLが生産安定クラスタリングを提供することはできないと思っています。私が知る限り、OracleはJDBCドライバを使用して透過的にクラスタリングをサポートしています。

+0

これはありがたいですが、昨日何時間も見てから、これは私の問題を解決します:jdbc:mysql:loadbalance://192.168.0.3,192.168.0.4,192.168.0.5/bank このURLに接続するだけでいいです。これに対して他の最適化を行うことができます。 – nknj

+0

@Nikunj http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.htmlを参照してください。負荷分散がアプリケーション側で設定されているのは奇妙です。マスターノード(バランサー)はすべての要求を受け入れ、最適なノードにルーティングする必要があります。これはいくつかのバランス戦略によって解決されます。 – davorp

+0

@ Victor私は、接続プーリングはRDBMSと関係がないと思います。 RDBMS自体は、接続がプールされていることを認識していません。アプリケーション側(アプリケーションサーバー)の機能です。 – davorp

関連する問題