JDBI:dbi.onDemand比使用dbi.open更受欢迎吗?

时间:2015-06-28 20:09:48

标签: dbi dropwizard jdbi

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

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

1 个答案:

答案 0 :(得分:3)

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

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实例。

相关问题