我的應用程序由運行在JBOSS 5.1(Java 6,Spring 3.1)中的一組Web服務組成。 Web服務代碼調用DAO函數來更新數據庫,出於性能方面的原因,我想使該調用異步(更新對Web服務響應不重要)。我在這裏有什麼選擇?JBoss 5.1中的異步數據庫更新
此共識似乎是爲了避免自己管理線程並讓應用服務器執行此操作。 JBOSS 5.1(Java 6,Spring 3.1)有哪些選項?某種JMS解決方案?或者使用JBOSS ThreadPool?還是MDB?
我的應用程序由運行在JBOSS 5.1(Java 6,Spring 3.1)中的一組Web服務組成。 Web服務代碼調用DAO函數來更新數據庫,出於性能方面的原因,我想使該調用異步(更新對Web服務響應不重要)。我在這裏有什麼選擇?JBoss 5.1中的異步數據庫更新
此共識似乎是爲了避免自己管理線程並讓應用服務器執行此操作。 JBOSS 5.1(Java 6,Spring 3.1)有哪些選項?某種JMS解決方案?或者使用JBOSS ThreadPool?還是MDB?
JMS(MDB是最簡單的方法)確實有效,當您在Java EE 6下使用Java EE平臺時,我建議您這樣做,尤其是因爲您立即擁有排隊支持以抑制執行應該是必要的。無論您定位的是哪個版本的Java EE,Plus JMS都可以繼續工作。
我也濫用EJB計時器服務來異步調用EJB方法,但這非常難看。
如果在JBoss中不支持異步任務,您可以設置一個彈簧線程池來處理您的DAO調用。
例
<bean id="myExecutioner" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="${executor.ws.poolsize}"/>
<property name="maxPoolSize" value="${executor.ws.poolsize}"/>
<property name="keepAliveSeconds" value="120"/>
<property name="threadNamePrefix" value="WsExecTask-"/>
<property name="allowCoreThreadTimeOut" value="true"/>
<property name="rejectedExecutionHandler" value="#{new java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy()}"/>
</bean>
然後在您的web服務剛絲上面定義的執行程序並傳遞一個Runnable對象包木窗您的DAO調用execute()方法。
如果您決定使用此解決方案,請務必閱讀ThreadPoolTaskExecutor描述並理解拒絕處理程序部分。
我不會推薦這個。你將不得不在容器外部管理你的數據庫連接,或者混淆容器的持久管理,這可能會讓人感到尷尬和沮喪 –
JMS是一個很好的選擇,儘管如果你只是想把東西轉儲到數據庫(用於記錄等)。如果它正在進行日誌記錄,則可能需要查看日誌框架的數據庫appender(如log4j)。 –