我想知道如何使用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();
}
}
}