Java 从quartz作业读取/写入数据库-事务不工作
我有两个Quartz(1.8.3)作业,通过Spring(2.5.6)配置,其中一个写入(发送)到数据库,另一个读取(检查) 其中ptm是一个TransactionManager bean,通过Spring注入。 我在日志中看到“Status was updated”记录,但当我从事务读取方法中读取该记录时,它有时会过时。此外,当我使用SQL编辑器读取此记录时,它也过时了。 我不明白,为什么交易在这种情况下不起作用,你有什么想法吗?Java 从quartz作业读取/写入数据库-事务不工作,java,spring,oracle,transactions,quartz-scheduler,Java,Spring,Oracle,Transactions,Quartz Scheduler,我有两个Quartz(1.8.3)作业,通过Spring(2.5.6)配置,其中一个写入(发送)到数据库,另一个读取(检查) 其中ptm是一个TransactionManager bean,通过Spring注入。 我在日志中看到“Status was updated”记录,但当我从事务读取方法中读取该记录时,它有时会过时。此外,当我使用SQL编辑器读取此记录时,它也过时了。 我不明白,为什么交易在这种情况下不起作用,你有什么想法吗? 谢谢。对于任何可能感兴趣的人。这对我有用 <bean n
谢谢。对于任何可能感兴趣的人。这对我有用
<bean name="applicationDataCollectorControllerJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="org.mypckage.controller.jobs.ApplicationDataCollectorController" />
<property name="jobDataAsMap">
<map>
<!--<entry key="timeout" value="1" />-->
<entry key="genericService" value-ref="genericService" />
<entry key="applicationDataCollectorService" value-ref="applicationDataCollectorService" />
<entry key="transactionManager" value-ref="transactionManager" />
</map>
</property>
</bean>
----在applicationDataCollectorService bean中-----
public void collectData(org.springframework.transaction.jta.JtaTransactionManager transactionManager){
试一试{
this.transactionManager=transactionManager;
testTransactionalSave();
}捕获(例外e){
忙=假;
e、 printStackTrace();
}
}
}
私有void testTransactionalSave()引发异常{
TransactionTemplate tt=新TransactionTemplate(transactionManager);
tt.execute(newtransactioncallbackwithoutresult(){
@凌驾
受保护的无效doInTransactionWithoutResult(TransactionStatus ts){
试一试{
应用程序参数appPara=null;
List-appParaList=genericService.getListFromHQL(“从ApplicationParameter中选择o作为o order by o.id desc”,false);
如果(appParaList!=null){
如果(appParaList.size()>0){
appPara=(ApplicationParameter)appParaList.get(0);
appPara.setLastBankStatementMailNum(appPara.getLastBankStatementMailNum()+10);
appPara=(ApplicationParameter)genericService.mergeObject(appPara);
System.out.println(“num is now=“+appPara.getLastBankStatementMailNum());
}
}
}捕获(例外情况除外){
例如printStackTrace();
}
}
});
}
注意:不要忘记将transactionManager声明为bean中的私有属性,并使用public setter和getter for spring将其连接起来。有问题吗?yemiosigbesan@gmail.com是
statusDAO
transactionnal(例如带有@transactionnal注释)?您是否仍然存在此问题?如果问题“有时”发生(但每次都打印日志消息),则很可能意味着您的持久性逻辑有缺陷(JDBC或Hibernate?)。使用所有嵌套调用检查“doInTransactionWithoutResult”函数的内容。我需要更多的代码才能更精确。如果您可以创建最小的测试隔离问题,这将有所帮助。nico_ekito,statusDAO不是事务性的,事务处于较高级别。
<tx:annotation-driven transaction-manager="TransactionManager"/>
@Override
public synchronized void sendMessage() {
try {
TransactionTemplate tt = new TransactionTemplate(ptm);
tt.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
...
statusDAO.update(status);
...
}
});
log.info("Status was updated");
} catch (Exception e) {
...
}
}
<bean name="applicationDataCollectorControllerJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="org.mypckage.controller.jobs.ApplicationDataCollectorController" />
<property name="jobDataAsMap">
<map>
<!--<entry key="timeout" value="1" />-->
<entry key="genericService" value-ref="genericService" />
<entry key="applicationDataCollectorService" value-ref="applicationDataCollectorService" />
<entry key="transactionManager" value-ref="transactionManager" />
</map>
</property>
</bean>
@Override
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
getApplicationDataCollectorService().collectData(transactionManager);
}
public void collectData( org.springframework.transaction.jta.JtaTransactionManager transactionManager) {
try {
this.transactionManager = transactionManager;
testTransactionalSave();
} catch (Exception e) {
BUSY = false;
e.printStackTrace();
}
}
}
private void testTransactionalSave() throws Exception {
TransactionTemplate tt = new TransactionTemplate(transactionManager);
tt.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus ts) {
try {
ApplicationParameter appPara = null;
List<ApplicationParameter> appParaList = genericService.getListFromHQL("select o from ApplicationParameter as o order by o.id desc", false);
if (appParaList != null) {
if (appParaList.size() > 0) {
appPara = (ApplicationParameter) appParaList.get(0);
appPara.setLastBankStatementMailNum(appPara.getLastBankStatementMailNum() + 10);
appPara = (ApplicationParameter) genericService.mergeObject(appPara);
System.out.println(" num is now = " + appPara.getLastBankStatementMailNum());
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}