想使用SpringAOP来简化javaSwing中各种基础结构功能的开发,来降低藕合性。做法如下:某设定表读取在程序中使用缓存机制,为了方便同步数据库与缓存,
使用AOP编写了一个Aspect来监控DAO中的insert和update操作,
并实时同步更新程序中的缓存值。当此Aspect在单线程中跑时一切正常,一旦同时开启另一个线程来作业
就会出现问题,传入到DAO中的Connection会被莫名的关闭,直接导致程序Crash.
去搜索线程和AOP等资料,也没有找到有用的信息,麻烦各位大大能给予指导。在此谢过!

解决方案 »

  1.   

    补充说明:在程序中全局使用一个静态方法来装载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莫名被关闭掉。
      

  2.   

    三木学长这个问题我还真没遇到过,没有用Aop去操作Swing
    不过一般关闭连接的可能也不是很多,或许是在开启另一个线程时导致了对相同文件的挣抢
    引起了死锁吧.关闭连接也是必然的.
    ps:猜测而已
      

  3.   

    看看你的conn是设置成了单件模式的吗?
      

  4.   

    感谢楼上二位的帮助,当前已经查明原因,是因为getContext是static,所以每次getBean所得到的实体物件bean都是同一个,当在单线程中执行时可能是没有问题,当开启新线程时,同一个bean被二个线程调用,且另一个线程中的bean执行完后就把conn关闭掉了,导致主线程中的bean实体的conn一并失效。
    我现在在想怎么能让每次获得的实体bean都是单独的实体,而不是同一个呢,因为程序的DAO已经封装死了,不可能继承于clonable对象,有点麻烦,或者看有没有其它更好的方法。
      

  5.   

    如果不使用static,每次调用getBean方法都需要装载一次applicationContext.xml文件,这太不划算了。
    看看各位大有没有好些的方法,SpringWeb中是怎么来控制和处理,当在server startup时加载xml配置档,在使用时直接用context.getBean就OK了,他每次获得的应该都是新的物件,否则要是同一个物件程序肯定挂掉了,得找一找Spring高后来帮忙挖掘挖掘。
      

  6.   

    以上问题的解决方法是:不使用Static,而是每次使用时重新装载Context,这种做法执行效率太差。
    此问题最终的解决方式是暂取消SpringAOP在Swing中的就用,执行效率暂时还不可接受,到研究更加透彻时再在Swing中启用AOP。
    谢谢各位! 结贴!