gpt4 book ai didi

java - 从 ConnectionPools 获取和释放 JDBC 连接的频率?

转载 作者:行者123 更新时间:2023-12-02 13:14:14 26 4
gpt4 key购买 nike

我正在重构一个最初在 20 世纪 90 年代中期设计的遗留系统。那时候,JDBC 连接是一种稀缺资源,没有可靠的连接池实现,因此连接会被尽可能长时间地保留。这导致了如下结构:

class ClientHandler {
Connection conn=DriverManager.createConnection(...);
Statement stmt=conn.createStatement();
Statement stmt2=conn.createStatement();

public ReplyType handleCommand(RequestType req) {
if (req.requestType==RequestType.LOGIN)
return new LoginManager(stmt,stmt2).login(req.requestData);
...
}
}

class LoginManager {
Statement stmt,stmt2;
public LoginManager(Statement stmtx,Statement stmt2x) { stmt=stmtx; stmt2=stmt2x; }
public login(RequestData data) {
ResultSet rs=stmt.executeQuery("select count(*) from users where name="+data.getName()+" and pw="+data.getPassword());
if (!rs.next()) throw new IllegalStateException();
if (rs.getInt(1)==0)
throw new WhateverException("error.wrongpassword");
}
}

这只是一个示例,用于说明此结构中的数据库连接

  • 提早开放

  • 长时间保持打开状态

  • 传递给每个必须访问数据库的人

现在,在重构过程中,我想删除这种操作模式。考虑到连接池和操作尽可能无状态,我可以想象删除数据库连接的每次传递,并简单地在我需要它们时获取数据库连接(从池中),然后将它们扔掉(放回到池中)。范围相同。与上面相同的代码可以这样重写(Java 7 try-with-resource 风格):

class ClientHandler {

public ReplyType handleCommand(RequestType req) {
if (req.requestType==RequestType.LOGIN)
return new LoginManager().login(req.requestData);
...
}
}

class LoginManager {
public login(RequestData data) {
try (Connection conn=StaticConnectionPoolBridge.createConnection) {
ResultSet rs=conn.createStatement().executeQuery("select count(*) from users where name="+data.getName()+" and pw="+data.getPassword());
if (!rs.next()) throw new IllegalStateException();
if (rs.getInt(1)==0)
throw new WhateverException("error.wrongpassword");
}
}
}

我的问题:以这种方式重构是否明智?我的意思是,连接池旨在使数据库连接创建成为一种轻量级操作。但它是否如此轻量级,以至于您可以以如此精细的方式获取和丢弃?或者我应该尝试将连接池的获取-释放周期数限制为某个不太大的数字,例如通过将获得的连接和语句至少移动到一些(实用)方法?在此类系统中使用连接池是否有任何经验规则?

FWIW:整个系统的 Backbone 是 Play 2.3,它内部使用 BoneCP 连接池。当然,所讨论的系统在数据库访问代码中具有一些抽象层,我在这里省略了这些抽象层以使示例代码尽可能简单。

最佳答案

从连接池获取和释放连接非常轻量级,因为您最终要做的唯一一件事就是将该连接放回队列中。在这些操作中您根本不会与数据库对话。

关于java - 从 ConnectionPools 获取和释放 JDBC 连接的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32201142/

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