gpt4 book ai didi

dao - JDBI DAO实例可以重用吗?

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

final MyDAO dao = database.onDemand(MyDAO.class);

dao 实例可以重用吗?或者我们是否需要在每次使用时实例化它?

从代码来看,它似乎负责维护数据库事务。然而,在 DropWizard 中,示例是:-

final UserDAO dao = jdbi.onDemand(UserDAO.class);
environment.jersey().register(new UserResource(dao));

因此,在同一资源中,该 dao 实例将在所有路径上重用。这意味着当对同一资源(可能在两个路径中)发出两个请求时,它们都将使用相同的 dao 实例。这不会引起问题吗?

最佳答案

onDemand 将根据需要自动获取和释放连接。一般来说,这意味着它将获得一个连接来执行语句,然后立即释放它,但各种事情(例如打开事务或基于迭代器的结果)将导致连接保持打开状态,直到事务完成或迭代结果完全遍历为止。因此,即使两个请求访问同一资源,它们也会处于不同的句柄中。所以不会造成任何问题。

public abstract class Dao implements GetHandle {

public void printHandle() {
System.out.println(getHandle());
}

}

@Test
public void testHandle() {
Dao onDemandDao = dbi.onDemand(Dao.class);
Handle handle = dbi.open();
Dao handleAttachedDao = handle.attach(Dao.class);
Dao openDao = dbi.open(Dao.class);
for(int i=0; i< 5; i++ ) {
onDemandDao.printHandle();
}
for(int i=0; i< 5; i++ ) {
handleAttachedDao.printHandle();
}
for(int i=0; i< 5; i++ ) {
openDao.printHandle();
}
}

此测试的输出是,

org.skife.jdbi.v2.BasicHandle@35d114f4
org.skife.jdbi.v2.BasicHandle@3684d2c0
org.skife.jdbi.v2.BasicHandle@4be460e5
org.skife.jdbi.v2.BasicHandle@454e9d65
org.skife.jdbi.v2.BasicHandle@7805478c
org.skife.jdbi.v2.BasicHandle@6807989e
org.skife.jdbi.v2.BasicHandle@6807989e
org.skife.jdbi.v2.BasicHandle@6807989e
org.skife.jdbi.v2.BasicHandle@6807989e
org.skife.jdbi.v2.BasicHandle@6807989e
org.skife.jdbi.v2.BasicHandle@c2e33
org.skife.jdbi.v2.BasicHandle@c2e33
org.skife.jdbi.v2.BasicHandle@c2e33
org.skife.jdbi.v2.BasicHandle@c2e33
org.skife.jdbi.v2.BasicHandle@c2e33

可以看到,onDemand Dao 每次访问该方法时都会创建新的句柄。

关于dao - JDBI DAO实例可以重用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27675118/

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