Java-приложение, соединяющееся со многими узлами SQL - PullRequest
1 голос
/ 27 октября 2011

У меня есть приложение Java, работающее на Tomcat. Я хочу подключить его к моему кластеру MySQL.

В кластере у меня есть три узла SQL. Я хочу попытаться установить соединение со всеми тремя узлами, а затем быстро установить соединение, которое вернуло меня!

Как я могу это сделать? Производительность действительно важна для меня.

Вот что у меня есть:

Соединитель класса

    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 Ответ

1 голос
/ 27 октября 2011

Просто используйте базу данных, которая поддерживает пул соединений (любая современная СУБД поддерживает это), и используйте готовое решение, такое как DataSource или c3p0.

См., Например, официальный учебник JDBC .

В одном я не уверен, хотите ли вы пул соединений или более сложную кластеризацию. Но, в любом случае, я сомневаюсь, что MySQL может обеспечить стабильную производственную кластеризацию, и, насколько мне известно, Oracle поддерживает прозрачную кластеризацию с помощью своего драйвера JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...