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

如何在java中避免重复的数据库连接?,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,我有两门课。C_DB和C_测试 在C_DB中,getConnection()方法返回一个连接。如果我多次调用getConnection(),它将重新连接到数据库并返回多个连接 有什么办法可以避免这种情况吗?我想检查连接是否存在,然后返回该连接,而不是创建一个新连接。因此,只有1个到db的连接 C_DB public class C_DB { Connection con; public C_DB() { String dbLink = "jdbc:mysql:/

我有两门课。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
    }

}

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

大概是这样的:

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();

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

大概是这样的:

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();

您可以使用连接池并将其最大池大小设置为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;
    }

}

您可以使用连接池并将其最大池大小设置为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;
    }

}

我想你只需要检查连接是否为空。使用一个。我想@Ravi方法最好。。下面是一个例子。我想你只是检查连接是否为空。使用一个。我想@Ravi方法最好。。下面是一个例子,上面提到的多线程程序极易出现bug。不要这样做,使用一个连接池。上述情况在多线程程序中极易出现错误。不要这样做,请使用连接池。