dbi - JDBI:dbi.onDemand 是否比使用 dbi.open 更受欢迎?

标签 dbi dropwizard jdbi

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

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

最佳答案

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

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

关于dbi - JDBI:dbi.onDemand 是否比使用 dbi.open 更受欢迎?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104251/

相关文章:

java - 如何在非接口(interface)非抽象类中使用JDBI @Transaction注解?

performance - SQLite:selectall_arrayref 速度问题

java - Dropwizard Json pretty-print 查询参数

java - 在 DropWizard 中禁用 Swagger Bundle

java - Dropwizard - 在服务器启动时在类中运行 init 方法

jdbi - 如何结合 JDBI @GetGeneratedKeys 和 Mapper

java - 使用 jdbi3 启动 Sprinboot 时出现 AbstractMethod 错误

sql - select count(*) 不适用于 perl DBI

mysql - 使用DBI启用SQL跟踪时,如何防止语句多次输出?

perl - 在 Perl DBI 模块中获取完整的错误消息