use*_*625 3 dbi jdbi dropwizard
我在我的应用程序中使用 JDBI 和 Dropwizard。我使用 dbi.open 命令获取 DAO 实例,然后使用它来运行各种查询。在“finally”块中,我使用 dao.close() 方法关闭连接。我还使用 dao.inTransaction 方法在一个事务中执行多个数据库语句。
虽然该应用程序已经运行了一段时间,没有出现太多问题,但最近我们在开发和生产环境中多次看到“PoolExhausted”异常。我现在想知道使用 dbi.onDemand 是否是比使用 dbi.open 更好的方法,这样就不需要每次最后都调用 close...使用 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();
Run Code Online (Sandbox Code Playgroud)
这里获取连接和关闭连接没有区别。
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();
Run Code Online (Sandbox Code Playgroud)
在此示例中,在 onDemand 方法中,连接在 getUsers 调用之前打开,然后关闭。insertUsers 也发生了同样的情况。在外部服务调用期间,不保持连接。
在 Dbi open 方法中,连接在 getUsers 之前打开,在 insertUsers 之后关闭。在外部服务呼叫期间,也会保持连接。如果这种外部调用的成本很高,那么您最终会导致连接空闲很长时间并且无法用于其他人。
所以最好使用 onDemand 来获取 Dao 实例。
| 归档时间: |
|
| 查看次数: |
5033 次 |
| 最近记录: |