有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mysql如何在java中避免重复的数据库连接?

我有两门课。C_DB和C_测试

在C_DB中,getConnection()方法返回一个连接。如果我多次调用getConnection(),它将重新连接到数据库并返回多个连接

有什么办法可以避免这种情况吗?我想检查连接是否存在,然后返回该连接,而不是创建一个新连接。因此,只有1个到db的连接

C_DB

public class C_DB {
    Connection con;

    public C_DB() {
        String dbLink = "jdbc:mysql://localhost:3306/database";
        String dbUser = "root";
        String dbPass = "";

        try {
            con = DriverManager.getConnection(dbLink, dbUser, dbPass);
        } catch (SQLException e) {
            throw new IllegalStateException("DB Errors: ", e);
        }
    }

    public Connection getConnection() {
        return con;
    }
}

C_检验

public class C_Test {

    public static void main(String[] args) throws Exception {
        Connection con1 = new C_DB().getConnection(); // new connection
        Connection con2 = new C_DB().getConnection(); // new duplicate connection
        Connection con3 = new C_DB().getConnection(); // new duplicate connection
    }

}

共 (2) 个答案

  1. # 1 楼答案

    您应该使用Singleton设计模式来避免多个实例

    比如:

    public class C_DB {
    
        private static final Connection con;
        private static final C_DB singleInstance;
    
        private C_DB() {
            String dbLink = "jdbc:mysql://localhost:3306/database";
            String dbUser = "root";
            String dbPass = "";
    
            try {
                con = DriverManager.getConnection(dbLink, dbUser, dbPass);
            } catch (SQLException e) {
                throw new IllegalStateException("DB Errors: ", e);
            }
        }
    
        public static C_DB getInstance() {
            if (singleInstance == null) {
                synchronized (C_DB.class) {
                    if (singleInstance == null) {
                        singleInstance = new C_DB();
                    }
                }
            }
    
            return singleInstance;
        }
    
        public Connection getConnection() {
            return con;
        }
    }
    

    并通过以下方式获取连接:

    Connection con = C_DB.getInstance().getConnection();
    
  2. # 2 楼答案

    您可以使用连接池,并将其最大池大小设置为1,正如@Elliott在评论中指出的,或者您可以实现类似的功能

    public class C_DB {
    
        private static C_DB instance;
    
        private Connection con;
    
        private C_DB() {
            String dbLink = "jdbc:mysql://localhost:3306/database";
            String dbUser = "root";
            String dbPass = "";
            try {
                con = DriverManager.getConnection(dbLink, dbUser, dbPass);
            } catch (SQLException e) {
                throw new IllegalStateException("DB Errors: ", e);
            }
        }
    
        public static Connection getConnection(){
            if(instance == null){
               instance = new C_DB();
            }
            return instance.con;
        }
    
    }