2014-12-28 41 views
5
final MyDAO dao = database.onDemand(MyDAO.class); 

可以重复使用dao实例吗?或者我们是否需要为每个用途实例化它?可以重用JDBI DAO实例吗?

从代码看起来它负责维护一个数据库事务。然而,在DropWizard的例子是: -

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

所以,在相同的资源道的这个实例将在所有路径重用。这意味着,当两个请求是对同一资源(可能在两个路径),然后他们都会使用相同的道实例。这不会造成问题吗?

回答

4

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(); 
    } 
} 

该测试的输出,

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
org.skife.jdbi.v2.Basi[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

可以看到,按需道每次创建时获得的方法新的手柄。