Closed. This question is opinion-based。它当前不接受答案。
                        
                    
                
            
        
            
        
                
                    
                
            
                
                    想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                
                    上个月关闭。
            
        

    

我正在用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关闭,则每次调用它可能都没有意义,也许是它试图恢复健康。

以电路断路器模式为例,它将解决此问题。

除此之外,我觉得这个问题太广泛了,所以SO更适合非常具体的技术问题。答案有助于克服具体的技术难题。如果您提出这样的建议,请随时提出:)

10-06 15:23