gpt4 book ai didi

java - 用于连接不同数据库的枚举常量的线程安全性

转载 作者:行者123 更新时间:2023-12-02 03:02:30 24 4
gpt4 key购买 nike

Enum 中的 getConnection() 应该同步吗?

哪一个是线程安全的?

第一:

public enum DBConnection {

POSTGRESQL("jdbc:postgresql://localhost:5432/mydb", "vagrant", "vagrant"),
MYSQL("jdbc:mysql://localhost:3306/mydb", "vagrant", "vagrant");

DBConnection(String host, String user, String password) {

this.host = host;
this.user = user;
this.password = password;
}

private final String host;
private final String user;
private final String password;

private Connection connection;

public Connection getConnection() throws SQLException {

if (connection == null || connection.isClosed()) {
connection = DriverManager.getConnection(host, user, password);
}

return connection;
}}

或者第二个,同步调用和 volatile 变量:

private volatile Connection connection;

public synchronized Connection getConnection() throws SQLException {

if (connection == null || connection.isClosed()) {
connection = DriverManager.getConnection(host, user, password);
}

return connection;
}

调用连接,例如:

      try (Connection connection = DBConnection.POSTGRESQL.getConnection()) {
// Prepared statement etc
}
} catch (SQLException ignored) {}

最佳答案

Which one is thread safe?

第一个选项不是线程安全的,因为您遇到的情况可能会导致竞争条件。第二个选项是线程安全,但如果您要同步整个 getConnection 方法,则使用 volatile 是多余的。

也就是说,您最好使用连接池而不是单例数据库连接。

关于java - 用于连接不同数据库的枚举常量的线程安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42251824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com