2011-06-21 23 views
3

我想知道如何使用Guice Stripes管理數據庫連接的最佳實踐。 理想我想執行以下操作:使用Stripes管理數據庫連接,Guice

一個DB連接每個線程/ http請求用於(可能具有吉斯結合與ServletScope.REQUEST範圍連接到提供者) 所有查詢在一個事務中進行的,然後在最後提交或回滾。

我的問題是:什麼應該創建/關閉我的數據庫連接?

使用Stripes攔截器打開和關閉連接是不是一個好主意?

我有一個Manager類的大型連接,它們都爲我的數據庫中的各個表執行自定義SQL查詢。目前,所有這些經理類別都具有類似以下的方法:

public abstract class MyManagerBase implements IMyManager { 
    @Inject 
    public void setConnection(Connection conn) { 
    this.conn = conn; 
    } 
} 

管理員自己對此進行分類並且不創建或關閉連接。

我有行動豆這樣的:

public class MyActionBean implements ActionBean { 
    @Inject IMyManager myManager; 

    @DefaultHandler 
    public Resolution save() { 
    myManager.doStuff(...); 
    } 

    ... 
} 

我有一個Guice的配置是這樣的:

public class MyConfigModule extends AbstractModule { 

@Override 
protected void configure() { 

    install(new ServletModule()); 
    bind(IMyManager.class).to(MyManagerImpl.class); 
    bind(Connection.class).toProvider(MyConnectionProvider.class).in(ServletScopes.REQUEST); 
}  

到目前爲止,我在想什麼是使用攔截器注入經理,並在同一時間,爲所有http請求連接到所有管理器。

我的攔截試圖尋找這樣至今:

@Override 
public Resolution intercept(ExecutionContext executionContext) throws Exception { 
Connection conn = null; 

switch(executionContext.getLifecycleStage()) { 
    case ActionBeanResolution: 
    log.debug("Intercepting: ActionBeanResolution"); 
    // Inject dependencies into ActionBeans 
    injector.injectMembers(executionContext.getActionBeanContext());  
    Resolution resolution = executionContext.proceed(); 
    injector.injectMembers(executionContext.getActionBean()); 

    return resolution; 
    case RequestComplete: 
    log.debug("Intercepting: RequestComplete"); 

    executionContext.getActionBean(); 

    Connection conn = injector.getInstance(Connection.class); 

    conn.commit(); 
    conn.close(); 
    } 
} 
} 

回答

4

它是一個壞主意,用條紋攔截器來打開和關閉連接?

沒有一點都沒有,使用一個Servlet過濾器或條紋攔截器爲每個請求圖案執行所述會話一個相當普遍的方法(每操作會話的確是一個反模式)。儘管這並不意味着您也需要開始和停止交易。例如,你可以在動作bean中做顯式提交。

對於注射Stripes Action Beans,有比使用攔截器更優雅的方法。 web.xml中的條帶配置提供了一種用ActionResolver.Class參數配置您自己的Action Bean工廠的方法。由於工廠確實實例化了Action Bean,因此它也可以注入構造函數參數。自己實現這一點並不困難。

但是你不必自己實現這個,有一個優秀的Stripes插件可以處理注入Action Bean,Action Bean Context和Interceptors:Stripes Guice。使用非常簡單見:how-to: guice managed action beans

1

我們在使用Stripes攔截器來處理連接時遇到了一些問題 - 我認爲這與攔截器有時候不會觸發有時候請求沒有經過ActionBean,雖然我記不得了。相反,我們最終編寫了一個Filter來處理資源管理,而不是依賴攔截器。

Kdeveloper是在正確的軌道上,但是,建議您使用Guice構建您的ActionBeans而不是調用injector.injectMembers()。我們使用stripes-guicer,這對我們來說非常有效。

相關問題