在java中,在与数据库的连接之间切换的最佳方式是什么?

在java中,在与数据库的连接之间切换的最佳方式是什么?,java,jdbc,Java,Jdbc,我正在用java开发一个应用程序,它必须不断地执行对远程数据库的查询,但是,如果这种连接失败,必须在本地sqlite数据库上执行相同的查询。 我试过这样做: public static Connection connect() { Connection c = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); c = DriverManager.getCon

我正在用java开发一个应用程序,它必须不断地执行对远程数据库的查询,但是,如果这种连接失败,必须在本地sqlite数据库上执行相同的查询。 我试过这样做:

public static Connection connect() {
        Connection c = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            c = DriverManager.getConnection("jdbc:mysql://192.168.1.30/database", "root", "");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (com.mysql.cj.jdbc.exceptions.CommunicationsException e) {
            //Here I get the connection to sqlite in case of exception
            c = SQLiteDb.sqliteInit();
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return c;

    }

有没有其他更干净的方法来处理这些情况?

首先,您应该使用连接池,否则每次操作都会创建一个超级昂贵的新连接。 Java有许多可用的连接池。例如,Hikari提供了一个非常好的连接池,还有C3P0和DBCP

现在,有一个称为数据源的抽象,它可能会根据您使用的基础设施而使用

我不建议使用普通的JDBC,因为它的级别低而且容易出错。 看看JOOQ或MyBatis

现在,为了满足您对回退的需求,您可以保留两个带有连接池的数据源,并以一种在调用mysql失败时使用sql lite的方式组织流。然而,请注意,如果mysql宕机,那么每次给它打电话可能是没有意义的,也许它是在试图恢复

以断路器模式为例,它将解决这个问题

除此之外,我觉得这个问题太宽泛了,所以更倾向于非常具体的技术问题。这些答案有助于克服一个具体的技术难题。如果你有这样的想法,请随时提问: