场景是2个服务器,通过servlet来交互数据。数据为xml数据包。
用了一个  DataProcessor类来解析数据包,然后将解析结果存入数据库中的对应表中。DataProcessor类就一个parse方法  public class DataProcessor {
     
     public void parse(String xmldata) {
        // dom4j 解析xml
        .......
        // 存数据库
        ..........
     }
     
  } 
现在的问题是:   如果servlet每收到一个对方服务器发来的数据包,我可以new 一个新的DataProcessor,来解析数据,这样我觉得效率不高。
如果把DataProcessor的弄成单实例,那么每次只调用parse函数即可。但如果Parse上次的数据还没完全结束,又来了新数据,再调用Parse函数,
会出现什么结果?java内部会自动排队吗?等上次执行完再执行本次操作?
还有没有其他方法,初次做java程序,对很多东西都不太了解,请大家解惑

解决方案 »

  1.   

    如果你能确保DataProcessor不需要任何成员变量的话,用单例模式是安全的。
      

  2.   

    不能保证一定没有成员变量。
    按照交互协议,当我收到对方发来的数据后,我还需要再发一个回执信息,通知对方刚才发的包我收到了。回执信息中需要XML解析后,得到XML中的通讯流水号,然后回执中需要把通讯流水号填进去,对方通过这个流水号来了解数据包的发送情况
      

  3.   

    这种情况,你最好还是做一个Pool,里面有N个DataProcessor实例,然后进行动态分配调用。
      

  4.   

    对java不熟悉,不知道怎么实现,用什么当pool的容器?vector还是list还是其他什么还有,如果用pool,我觉得应该是借还的方式。借的时候,pool里如果没有可用的就new一个新的DataProcessor实例,有就借一个,但得从Pool里移除,但用完了怎么还回到pool,不知道怎么实现还的功能?能详细讲讲吗,还有没其他简单点的方式
      

  5.   

    如果是你所说的,
    DataProcessor类就一个parse方法
    ——————————————————————
    每次new 一个 和 单例 我没觉得效率有什么特别大得区别如果非要找出执行中的那微不足道的差别, 那就static吧~ :)public static void parse(String xmldata)
      

  6.   


    从你这段话所描述的需求来看,完全没觉得你需要成员变量。注意,成员变量是指类中定义的,不是指函数中的局部变量,局部变量随便你用。
    new 多个对象的主要问题其实是浪费内存和浪费GC所开销的时间。
      

  7.   

    有点糊涂了,还是再次把问题重申一下(1)效率问题
         因为每天大概有不少于有8000个包需要parse,如果每个包都要 new DataProcessor,那么必须每个包都要new 一个 SAXReader 和 Document ,我发现dom4j中的document这个对象比较大,所以我希望只有 一个 Document对象和SAXReader ,所以才考虑把DataProcessor弄成单实例
      
    如果可以,我希望DataProcessor类下面这样的public class DataProcessor {
         
         private SAXReader reader = new SAXReader();
         private Document doc = null;           public void parse(String xmldata) {
            // dom4j 解析xml
             doc = reader.read(xmldata);
             .......
            // 存数据库
            ..........        doc.clearContent();
             // 发回执
            sendReceipt(netno);
         }
          
         private void sendReceipt(String netno) {
         
         }   }    
     如果搞成单实例,那么问题2来了(2) 如果上次的数据未Parse完,新的数据又来了,那么会再调用parse,结果怎么样?java内部会自动排队吗?等上次执行完再执行本次操作?
      

  8.   


    这样的话要是单例势必要对doc进行同步,即在你parse方法里synchronized(this.doc)这是节省了创建实例的效率但是线程安全的如果parse是个长的过程,其他线程都要等他,效率没有提高反而降低了吧上面他们建议用pool你说借还觉得挺好的想法吧? pool可以考虑java.util.concurrent.ConcurrentLinkedQueue,已经线程安全,
    用的时候poll()如果为null新建一个,用完了add()回去
      

  9.   

    如果在意性能,为什么用jdom?
    使用 StAX。