gpt4 book ai didi

java - 如果我将单例类用于数据库连接,一个用户可以为所有人关闭连接吗?

转载 作者:太空狗 更新时间:2023-10-29 22:44:29 25 4
gpt4 key购买 nike

我写了一个单例类来获取数据库连接。

现在我的问题是:假设有 100 个用户访问该应用程序。如果一个用户关闭连接,那么对于其他99个用户,连接是否关闭?

这是我的示例程序,它使用单例类来获取数据库连接:

public class GetConnection {

private GetConnection() { }

public Connection getConnection() {
Context ctx = new InitialContext();
DataSource ds = ctx.lookup("jndifordbconc");
Connection con = ds.getConnection();
return con;
}

public static GetConnection getInstancetoGetConnection () {
// which gives GetConnection class instance to call getConnection() on this .
}
}

请指导我。

最佳答案

只要您不在 getConnection() 调用中返回相同 Connection 实例,就没有什么可担心的。然后每个调用者都会得到自己的实例。到目前为止,您在每次 getConnection() 调用时都创建了一个全新的连接,因此不会返回一些静态或实例变量。所以它是安全的。

但是,这种方法很笨拙。它不需要是单例。助手/实用程序类也非常好。或者,如果您想要更抽象一点,可以使用抽象工厂返回的连接管理器。我只会将其更改为在类初始化期间仅获取一次数据源,而不是每次都在 getConnection() 中获取数据源。无论如何,每次都是相同的实例。保持便宜。这是一个基本的启动示例:

public class Database {

private static DataSource dataSource;

static {
try {
dataSource = new InitialContext().lookup("jndifordbconc");
}
catch (NamingException e) {
throw new ExceptionInInitializerError("'jndifordbconc' not found in JNDI", e);
}
}

public static Connection getConnection() {
return dataSource.getConnection();
}

}

根据正常的 JDBC 惯用语,将按如下方式使用。

public List<Entity> list() throws SQLException {
List<Entity> entities = new ArrayList<Entity>();

try (
Connection connection = Database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, foo, bar FROM entity");
ResultSet resultSet = statement.executeQuery();
) {
while (resultSet.next()) {
Entity entity = new Entity();
entity.setId(resultSet.getLong("id"));
entity.setFoo(resultSet.getString("foo"));
entity.setBar(resultSet.getString("bar"));
entities.add(entity);
}
}

return entities;
}

另见:

关于java - 如果我将单例类用于数据库连接,一个用户可以为所有人关闭连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6567839/

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