域事件中访问存储层的问题

10-08-22 yxh1122
我使用域事件来处理对象模型之间的关联关系,比如A对象中有B对象的一个列表,也就是说A和B是一对多的关系

public A{

private String modelId;

private List<B> blist;

private getBlist(){

if(B == null && BModelDevt != null && this.BId != null){

EventMessage message = BModelDevt.getBlist(this.modelId);

blist = (List<B>)message.getEventResult();

}

}

}

在获取A对象后通过域事件获取A所关联的B对象的列表,运行时能够通过,可是页面执行完成后,通过域事件访问数据库占用的数据库连接一直不能释放,导致程序运行一段时间后数据库连接池没有可用的数据库连接,从而报不能获取数据库连接的错误,更严重的是会经常出现数据库死锁的现象,我查看了jdon的代码,在CloseSessionInViewFilter这个过滤器中已经执行了session的关闭,可是数据库连接仍然没有释放。是不是过滤器中的关闭session不能够对域事件中的session拦截,从而导致该问题,如果是这样我该如何处理呢

                   

3
yxh1122
2010-08-27 10:48
终于找到原因了,领域事件和启动域事件的线程不是一个,在jdon框架中,每个线程有单独的变量,线程用到的hibernate session和事务都是单独的,因此不同的线程使用的session不用,因此request线程在关闭session后,领域事件线程的session并不能关掉。

可以针对领域事件建立一个拦截器,拦截器中执行关闭领域事件线程的关闭session操作,在每个领域事件的处理方法上引用拦截器,当事件处理程序完成对数据库的操作时,就由拦截器关闭session。

不过此方法的局性在于,域事件处理程序最好不要更改数据,因为域事件的事务和request线程的事务是独立的,request线程事务回滚并不会影响领域事件线程的事务

banq
2010-08-27 11:01
2010年08月27日 10:48 "yxh1122"的内容
域事件处理程序最好不要更改数据,因为域事件的事务和request线程的事务是独立的,request线程事务回滚并不会影响领域事件线程的事务 ...

说的很好,算是一个最佳实践吧,这应该带来了一个新的编程模型,就是事件驱动,而不是线程驱动,过去我们都是线程驱动编程模型。

线程编程模型问题就是同步,都依赖一个线程实现,刚性很强,一个线程要完成很多事情,也就是耦合了很多事情,造成紧耦合的罪魁祸首,现在到了并行计算时代,一切可异步,一切可切分,那么原来只能在一个线程中运行的很多步骤,就可以切分到多个线程同时运行。

jf虽然没有Scala/AKKA或者hadoop那样做得完美,只是一个小尝试,开启一个小窗口而已。所以,显得比较土,对事务处理需要开发者自己小心来处理。没有Scala/AKKA那样内存事务那样完美。

关键,是开发者思路要更改为事件驱动开发EDA,这个过程也是很艰难的,国内大部分都是依赖数据库同步开发,转变到JF开发思路上,至少10年。

相关文章:

多线程已死

[该贴被banq于2010-08-30 08:02修改过]

猜你喜欢