我都不知道用什么术语怎么描述这个问题。比如三台机器 dbserver1, app1,app2
dbserver1是纯数据库服务器,app1,app2上想跑着两个相同的程序。从dbserver1.db.table上扫描数据,进行处理。目的不仅仅多机负载,更重要的是实现了系统稳定功能,如果app1死了,app2还在。
细节问题,两个进程扫描同一个表,必然就有进程间同步问题,等等,好多细节问题呢,
这些细节问题如果我自己实现可能很费劲,而且不具备可复用性,维护也不具有可持续性。
就以上这个非常细节的问题,有什么现成的解决方案或者框架? EJB是做这个的吗。
dbserver1是纯数据库服务器,app1,app2上想跑着两个相同的程序。从dbserver1.db.table上扫描数据,进行处理。目的不仅仅多机负载,更重要的是实现了系统稳定功能,如果app1死了,app2还在。
细节问题,两个进程扫描同一个表,必然就有进程间同步问题,等等,好多细节问题呢,
这些细节问题如果我自己实现可能很费劲,而且不具备可复用性,维护也不具有可持续性。
就以上这个非常细节的问题,有什么现成的解决方案或者框架? EJB是做这个的吗。
1、用一个apache服务器连接两个以上的tomcat,做负载均衡;apache只处理静态的文件,基本上设置好后没出问题的可能;tomcat布署相同的应用,任意一个tomcat出问题了不会影响apache。
2、你的应用在操作数据库时,如果需要修改数据,记得加锁(sql是支持对数据记录加锁的)。
每次扫描时,如果表A中最新的数据时间与当前时间小于10秒,则不再进行后面的操作,此线程等1秒种再循环。
如果大于10秒,在A表中存入记录当前程序的ip,当前时间
读取能在10秒内处理完的数据,并处理之。这样两台机器总是只有一个线程在运行了。
再说了,java的web应用就一定是一个多线程的运用,你如何保证只有一个线程运行?难道你自己弄个j2ee框架出来,还是说你自己开发一个类似于tomcat的中间件?
好吧,就算你说的不是web应用,那么至少你需要图形化界面吧?不然你怎么与用户交互,tu图形化界面的AWT框架与swing框架就是一大堆线程,一个按钮事件就是一个线程,你如何保证只有一个线程运行,更何况绝大多数情况下,运用程序都是多线程的,只不过需要自己新建线程的机会很少,很多都是由框架与容器去建立线程而已。更何况很多运用只能多线程的方式去解决,你又如何去保证只有一个线程运行?我对你的天真感到无语。
原理如下:
程序启动的时候,产生一个 进程或者线程或者机器 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,你可以再跟你们技术总监讨论一下这个到底是否可以。