您的位置:程序门 -> java -> j2se / 扩展类



javaswing多线程和spring aop结合产生问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


javaswing多线程和spring aop结合产生问题[已结贴,结贴人:huguolu]
发表于:2007-10-12 09:36:02 楼主
想使用springaop来简化javaswing中各种基础结构功能的开发,来降低藕合性。

做法如下:某设定表读取在程序中使用缓存机制,为了方便同步数据库与缓存,
使用aop编写了一个aspect来监控dao中的insert和update操作,
并实时同步更新程序中的缓存值。当此aspect在单线程中跑时一切正常,一旦同时开启另一个线程来作业
就会出现问题,传入到dao中的connection会被莫名的关闭,直接导致程序crash.
去搜索线程和aop等资料,也没有找到有用的信息,麻烦各位大大能给予指导。在此谢过!
发表于:2007-10-12 09:59:281楼 得分:0
补充说明:在程序中全局使用一个静态方法来装载applicationcontext.xml配置文件。
获得bean也是使用静态方法获取,
private   static   applicationcontext   context   =   new   filesystemxmlapplicationcontext("/src/com/pics/system/xml/applicationcontext.xml");

    public   static   applicationcontext   getcontext()
    {
    return   context;
    }
然后在其它bean中来调用此context来获得相应的bean,如下:
settingdao   =   (daointerface)sys.getcontext().getbean("settingdao");
settingdao.setconnection(conn);
在程序crash时,就是此conn莫名被关闭掉。
发表于:2007-10-12 09:59:412楼 得分:10
发表于:2007-10-12 10:58:133楼 得分:60
三木学长这个问题我还真没遇到过,没有用aop去操作swing
不过一般关闭连接的可能也不是很多,或许是在开启另一个线程时导致了对相同文件的挣抢
引起了死锁吧.关闭连接也是必然的.
ps:猜测而已
发表于:2007-10-12 11:36:584楼 得分:30
看看你的conn是设置成了单件模式的吗?
发表于:2007-10-12 15:50:175楼 得分:0
感谢楼上二位的帮助,当前已经查明原因,是因为getcontext是static,所以每次getbean所得到的实体物件bean都是同一个,当在单线程中执行时可能是没有问题,当开启新线程时,同一个bean被二个线程调用,且另一个线程中的bean执行完后就把conn关闭掉了,导致主线程中的bean实体的conn一并失效。
我现在在想怎么能让每次获得的实体bean都是单独的实体,而不是同一个呢,因为程序的dao已经封装死了,不可能继承于clonable对象,有点麻烦,或者看有没有其它更好的方法。
发表于:2007-10-12 16:02:296楼 得分:0
如果不使用static,每次调用getbean方法都需要装载一次applicationcontext.xml文件,这太不划算了。
看看各位大有没有好些的方法,springweb中是怎么来控制和处理,当在server   startup时加载xml配置档,在使用时直接用context.getbean就ok了,他每次获得的应该都是新的物件,否则要是同一个物件程序肯定挂掉了,得找一找spring高后来帮忙挖掘挖掘。
发表于:2007-10-14 14:07:527楼 得分:0
以上问题的解决方法是:不使用static,而是每次使用时重新装载context,这种做法执行效率太差。
此问题最终的解决方式是暂取消springaop在swing中的就用,执行效率暂时还不可接受,到研究更加透彻时再在swing中启用aop。
谢谢各位!   结贴!


快速检索

最新资讯
热门点击