一个很复杂的问题。请高手进,我们分享 将long startTime,endTime和S()加上Synchronized,将事务管理方式改为BEAN管理方式,然后在两个方法之间设定事务,再试试,看能不能解决问题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有看明白楼主的问题所在1)在出现这种情况下,事务会发生突然的终止。知道为什么吗?就是因为“开始时间>结束时间”? 不懂为什么事务的执行根系统时间没有关系?楼主的代码里面做了类似的判断?2)楼主得到的时间准确吗? 同步吗?线程之间有没有同步,不同的jvm之间有没有同步? 我增加开始时间 和 结束时间 只是为了调试问题所在,但是我认为是因为执行时间过长,造成事务已结束的这个问题。后来调试过程中才发现这一奇怪的问题。也就是,但凡发生事务被终止,必定是开始时间 〉结束时间。 以此,我认为是由于另外的进程在A()没有调用完成之前获取了这一sessionBean的句柄,并调用A(),而sessionContext是一个全局性的东西,我估计是这样才造成了事务的混乱。我不知道我的理解是否正确,希望能得到一个解释,同时也希望各位能给出一个解决方法。我客户端的调用是:ctx = getUserTransaction();try {ctx.begin() //todo: something call A();ctx.commit()}catch(e) { ctx.rollback();} quote:我认为是由于另外的进程在A()没有调用完成之前获取了这一sessionBean的句柄,并调用A(),而sessionContext是一个全局性的东西,我估计是这样才造成了事务的混乱。=====================================================================================既然楼主有个估计,偶还是建议先搞清楚是否是这个问题。加一些log,判断是否为同一个线程。至于是否为同一个进程,除非有多个jvm,也就是多个jre在运行,通常只有一个进程的。A(){ startTime = System.currentTimeMillis();System.out.println("开始时间:"+startTime+ " thread name:"+ Thread.currentThread().getName()); //todo: something //invoke : S();}S() { //todo : something endTime = System.currentTimeMillis(); System.out.println"结束时间:"+endTime + " thread name:"+ Thread.currentThread().getName());}如果发现是由于线程同步的问题,那就简单了,只要保证每个transaction中的操作时synchronized的就可以了。祝好运! 首先:除了ejb自身管理外,没有在client端开任何现成来进行调用第二:这个ejb处于ibm websphere容器管理中,没有加入任何其他额外的管理代码。第三:S()和A()处于同一个对象中,S只是一个私有方法而已。 svn不能连接本地ip 大家帮帮忙。。。 struts标签如何进行加减乘除运算 jbuilder打包后不能运行,jar和W.exe运行没有反应,.exe运行出现一个错误如下 作为一个后备(现在大三),想问问在这里的师兄师姐门一个关乎目标未来的问题 在JbuilderX下运行STRUTS应用,总是有错 关于JDOM解析XML 怎样触发Servlet 链,请大家帮忙! 我想得到由两个表关联所得到的一个查询结果的数据集,用CMP应该怎样做呢? junit测试出错,求助 用Tapestry的朋友请签个名,看看用这个的多不多? Struts 的Message Resources资源文件配置的问题
1)在出现这种情况下,事务会发生突然的终止。知道为什么吗?就是因为“开始时间>结束时间”?
不懂为什么事务的执行根系统时间没有关系?楼主的代码里面做了类似的判断?
2)楼主得到的时间准确吗?
同步吗?线程之间有没有同步,不同的jvm之间有没有同步?
开始时间 〉结束时间。 以此,我认为是由于另外的进程在A()没有调用完成之前获取了这一sessionBean的句柄,并调用A(),而sessionContext是一个全局性的东西,我估计是这样才造成了事务的混乱。我不知道我的理解是否正确,希望能得到一个解释,同时也希望各位能给出一个解决方法。我客户端的调用是:
ctx = getUserTransaction();
try {
ctx.begin()
//todo: something
call A();
ctx.commit()
}catch(e) {
ctx.rollback();
}
我认为是由于另外的进程在A()没有调用完成之前获取了这一sessionBean的句柄,并调用A(),而sessionContext是一个全局性的东西,我估计是这样才造成了事务的混乱。
=====================================================================================既然楼主有个估计,偶还是建议先搞清楚是否是这个问题。加一些log,判断是否为同一个线程。
至于是否为同一个进程,除非有多个jvm,也就是多个jre在运行,通常只有一个进程的。
A(){
startTime = System.currentTimeMillis();
System.out.println("开始时间:"+startTime+ " thread name:"+ Thread.currentThread().getName());
//todo: something
//invoke : S();
}
S() {
//todo : something
endTime = System.currentTimeMillis();
System.out.println"结束时间:"+endTime + " thread name:"+ Thread.currentThread().getName());
}如果发现是由于线程同步的问题,那就简单了,只要保证每个transaction中的操作时synchronized的就可以了。
祝好运!
第二:这个ejb处于ibm websphere容器管理中,没有加入任何其他额外的管理代码。
第三:S()和A()处于同一个对象中,S只是一个私有方法而已。