我都不知道用什么术语怎么描述这个问题。比如三台机器 dbserver1, app1,app2
dbserver1是纯数据库服务器,app1,app2上想跑着两个相同的程序。从dbserver1.db.table上扫描数据,进行处理。目的不仅仅多机负载,更重要的是实现了系统稳定功能,如果app1死了,app2还在。
细节问题,两个进程扫描同一个表,必然就有进程间同步问题,等等,好多细节问题呢,
这些细节问题如果我自己实现可能很费劲,而且不具备可复用性,维护也不具有可持续性。
就以上这个非常细节的问题,有什么现成的解决方案或者框架? EJB是做这个的吗。

解决方案 »

  1.   

    这个和ejb无关
    1、用一个apache服务器连接两个以上的tomcat,做负载均衡;apache只处理静态的文件,基本上设置好后没出问题的可能;tomcat布署相同的应用,任意一个tomcat出问题了不会影响apache。
    2、你的应用在操作数据库时,如果需要修改数据,记得加锁(sql是支持对数据记录加锁的)。
      

  2.   

    1 我的是应用程序,不是web项目。但这个关系不大。2 我用的类型是mysql,而且是MyISAM的,MyISAM支持锁吗。就算支持锁,也跟我想要的框架无关。我设想的框架是这样的,可以在多台机器上启动相同的程序,并且可以支持框架级别的同步处理等等的。有类似的东西吗。如果没有的话,我只能通过消息队列或者其他进程间通信的方式来控制多进程的对关键区的锁了。我很希望有成熟的这种框架的存在。
      

  3.   

    你说的一个apcach两个tomcat,也无法在构架上实现逻辑层的事务同步的,只适用与浏览器请求的一次运行。如果有个servlet是后台持续运行来支持某种定时功能的,如果两个tomcat都启动了这个sevlet,那么还是要进行跨进程的锁或者同步了。
      

  4.   

    是啊,如果没有现成的成熟的解决方案。我也只能搞一个消息队列,比如jms,activemq之类的传递一下消息,进行多进程间的数据同步了。
      

  5.   

    假如让程序每10秒扫描一次,创建一个表A(ip,time)
    每次扫描时,如果表A中最新的数据时间与当前时间小于10秒,则不再进行后面的操作,此线程等1秒种再循环。
    如果大于10秒,在A表中存入记录当前程序的ip,当前时间
    读取能在10秒内处理完的数据,并处理之。这样两台机器总是只有一个线程在运行了。
      

  6.   

    你到底有没有仔细看楼主的问题?就算你保证程序只有一个线程运行,但是问题他现在是两台机器,两个程序,两个进程。这就不是一个线程问题,或者说不仅仅是个线程问题。
    再说了,java的web应用就一定是一个多线程的运用,你如何保证只有一个线程运行?难道你自己弄个j2ee框架出来,还是说你自己开发一个类似于tomcat的中间件?
    好吧,就算你说的不是web应用,那么至少你需要图形化界面吧?不然你怎么与用户交互,tu图形化界面的AWT框架与swing框架就是一大堆线程,一个按钮事件就是一个线程,你如何保证只有一个线程运行,更何况绝大多数情况下,运用程序都是多线程的,只不过需要自己新建线程的机会很少,很多都是由框架与容器去建立线程而已。更何况很多运用只能多线程的方式去解决,你又如何去保证只有一个线程运行?我对你的天真感到无语。
      

  7.   

    那时候我已经解决了。基于数据库的update操作的原子排他性,做了一个线程进程机器间的同步功能。
    原理如下:
     
     程序启动的时候,产生一个 进程或者线程或者机器 ownerid,ip+threadid+timestamp+rand()while(true)
    {
     select ownerid from restable where resid='资源名称'
       if(rs("ownerid")=="")
       {
           update restable set ownerid=$ownerid where resid=xxxx and ownerid=''
           
           下面检查一下是否真正被update到
           select ownerid from restable where resid=xxx
           
           if (rs("ownerid")==$ownerid)
           {
                获得到资源
                break;
           }
        }
     else if(rs("ownerid")==ownerid)
      {
          通知ownerid可以获取资源进行操作
          break;
      }
     else if(rs("ownerid")!=ownerid)
     {
        sleep();
     }
    }
    原理是这样,细节有调整。我已经应用了好长时间了,没发现问题。
    spiniper,你可以再跟你们技术总监讨论一下这个到底是否可以。