连接到许多 SQL 节点的 Java 应用程序

标签 java sql multithreading performance

我有一个在 tomcat 上运行的 java 应用程序。 我想将它连接到我的 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) {
        }
    }

}

更近距离的类(class)

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

最佳答案

只需使用支持连接池的数据库(任何现代 RDBMS 都支持此功能)并使用开箱即用的解决方案,例如 DataSource 或 c3p0。

例如,参见 official JDBC tutorial .

我不确定的一件事是,您是否需要连接池或更高级的集群。但是,无论如何,我怀疑 MySQL 能否提供生产稳定的集群,而且据我所知,Oracle 通过其 JDBC 驱动程序透明地支持集群。

关于连接到许多 SQL 节点的 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919186/

相关文章:

java - 使用 Java 在 Elasticsearch 中执行 Update By Query 时的 NPE

sql - 从选择中选择计数(*)

java - java中的线程不工作

c# windows 控件,显示多线程软件中文件的下载进度状态

java - 不必要地使用 volatile 关键字——这很危险吗?

java - 从另一个类中检索存储在泛型类中的对象

java - 如何访问 gwt :property properties from code?

java - Keep-alive 如何与 ThreadPoolExecutor 一起工作?

android - 用于检索实体键和值总和的 Room SQL 查询

sql - 从SQL中的3个表中选择信息