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

È possibile riutilizzare le istanze dao? O abbiamo bisogno di istanziarlo per ogni uso?È possibile riutilizzare l'istanza DAO JDBI?

Dal codice sembra che sia responsabile del mantenimento di una transazione DB. Tuttavia, in DropWizard esempi sono: -

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

Così, nella stessa risorsa sarà riutilizzato in tutti i percorsi questa istanza di dao. Ciò significa che quando vengono fatte due richieste alla stessa risorsa (magari in due percorsi), entrambe utilizzeranno la stessa istanza dao. Questo non causerà problemi?

risposta

4

onDemand otterrà e rilascia automaticamente la connessione, come è necessario. Generalmente ciò significa che otterrà una connessione per eseguire una dichiarazione e quindi rilasciarla immediatamente, ma varie cose come transazioni aperte o risultati basati su iteratore porteranno alla connessione che rimarrà aperta fino al completamento della transazione o al completamento del risultato iterato. Quindi, anche se quando due richieste accedono alla stessa risorsa, saranno gestite in modo diverso. Quindi non causerà alcun problema.

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

L'uscita per questo test è,

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

Si può vedere, onDemand Dao ogni volta crea nuova maniglia quando l'accesso al metodo.