3

我在我的应用程序中使用 JDBI 和 Dropwizard。我已经使用 dbi.open 命令来获取一个 DAO 实例,然后使用它来运行各种查询。在“finally”块中,我使用 dao.close() 方法关闭连接。我还使用 dao.inTransaction 方法在一个事务中执行多个 DB 语句。

虽然该应用程序已经运行了一段时间而没有太多问题,但最近我们在 Dev 和 Prod 环境中多次看到“PoolExhausted”异常。我现在想知道使用 dbi.onDemand 是否比使用 dbi.open 更好,这样它就可以消除每次都必须在 finally 中调用 close 的需要......使用 dbi.open 可能是任何连接泄漏背后的原因?

4

1 回答 1

4

这取决于我们在打开和关闭连接之间所做的所有事情。

public interface UserDao {
  @SqlQuery("select * from users")
  public List<User> getUsers();

  @SqlUpdate(some query..)
  public void insertUsers(someParam);

}

UserDao dao = dbi.onDemand(UserDao.class);
dao.getUsers();

UserDao dao = dbi.open(UserDao.class);
dao.getUsers();
dao.close();

这里获取连接和关闭连接没有区别。

UserDao dao = dbi.onDemand(UserDao.class);
dao.getUsers();
// calling external service to get some value.
dao.insertUsers();

UserDao dao = dbi.open(UserDao.class);
dao.getUsers();
// calling external service to get some value.
dao.insertUsers();
dao.close();

在此示例中,在 onDemand 方法中,连接在 getUsers 调用之前打开并在之后关闭。insertUsers 也是如此。在外部服务呼叫期间,不保持连接。

在 Dbi open 方法中,连接在 getUsers 之前打开,在 insertUsers 之后关闭。在外部服务呼叫期间,也保持连接。如果这个外部呼叫成本高昂,那么您最终将连接空闲这么长时间,并且不能用于其他人。

所以最好使用 onDemand 来获取 Dao 实例。

于 2015-06-29T04:22:52.770 回答