bang请教关于企业级分布式计算设计模式。精通j2ee的朋友欢迎发言

信息综合查询,即在市局可以查到各分局的业务信息。
Sybase12.5
JBoss3.2.5
resin

我只是想知道我这种模式是否能实现,哪里还有问题和不足之处。因为我对ejb不熟悉,所以不知道如何调用远程接口,因此在这里写了一些伪码,请精通J2EE/EJB的朋友给提些建议或者有没有更好的解决方案。请大家原谅我对J2EE/EJB的无知,不要嘲笑Me

在这里根据各城市不同的硬件设备限制,可以采用2种不同的方案。
方案1:数据分布存储。
即当该城市的市局和各分局硬件条件较好,各分局有自己专用的服务器时采用,也是推荐的方案。A分局、B分局...n分局的业务数据分别存储在各自分局(物理位置上的不同)的SQL-Server服务器上,系统运行在各自的应用服务器。当市局需要汇总各分局的业务数据时,市局通过远程接口依次调用各分局应用服务器上的EJB组件进行汇总。EJB组件将各自分局的业务数据进行汇总后,然后将最终结果返回给市局调用者,生成各分局综合汇总报表。

我的EJB大致如下:
SUM.java 远程接口
SUMHome.java Home接口
SUMLocal.java 本地接口
SUMLocalHome.java 本地HOme接口
SUMSession.java 无状态sessionbean 其中 public double sum(String dwid,String DSName) //汇总本分局数据

单位名称 数据库 DataSource 所在应用服务器
某市局 db_0 jdbc/test 192.168.1.0
A分局 db_1 jdbc/test1 192.168.1.1
A分局1所 同上 .... 同上
A分局2所 同上 .... 同上
A分局3所 同上 .... 同上
........ .... ....
A分局n所 同上 同上

B分局 db_2 jdbc/test2 192.168.1.2
B分局1所 同上 .... 同上
B分局2所 同上 .... 同上
B分局3所 同上 .... 同上
........ .... ....
B分局n所 同上 同上

C分局 db_3 jdbc/test3 192.168.1.3
........

D分局 db_4 jdbc/test4 192.168.1.4
........

E分局 db_5 jdbc/test4 192.168.1.5
........

n分局 db_n jdbc/testn 192.168.1.n



A分局应用服务器xml文件
<resource-ref>
<res-ref-name>jdbc/test1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url="jdbc:sybase:Tds:192.168.1.1:5000/db_1"/>
....................
</resource-ref>

B分局应用服务器xml文件
<resource-ref>
<res-ref-name>jdbc/test2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.2:5000/db_2"/>
....................
</resource-ref>

C分局应用服务器xml文件
<resource-ref>
<res-ref-name>jdbc/test3</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.3:5000/db_3"/>
....................
</resource-ref>

D分局应用服务器xml文件
<resource-ref>
<res-ref-name>jdbc/test4</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.4:5000/db_4"/>
....................
</resource-ref>

E分局应用服务器xml文件
<resource-ref>
<res-ref-name>jdbc/test5</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.5:5000/db_5"/>
....................
</resource-ref>

市局report.jsp
<%
.................
String dwid=null,dwip=null,dsname=null;

//模拟各个分局的id和ip String dw_array[n][3]

//模拟循环每一个分局
for(int i=0;i<dw_array.length;i++)
{
//以下是伪码
dwid=dw_array[i][0];
//单位id
dwip=dw_array[i][1];
//单位ip
dsname=dw_array[i][2];
//分局所使用的DataSource

//调用远程接口
//通过传递dwid和dwip计算当前分局的汇总金额

Hashtable env=new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,dwip);
//例如:dwip="192.168.1.1" "192.168.1.2"

SUMHome Home=(SUMHome) javax.rmi.PortableRemoteObject.narrow(
new InitialContext(env).lookup(
"SUMBean"),SUMHome.class);
SUM mybean=Home.create();
System.out.println(dwid+
"单位金额为"+mybean.sum(dwid,dsname)+"元");
.........
.........
}
%>


方案2:数据集中存储。
即当该城市市局和各分局硬件条件较差,各分局没有自己专用的服务器,或者有特殊规定时采用,不推荐方案。(改进方案,可以采用服务器集群)
A分局、B分局...的业务数据集中存储在市局的SQL-Server服务器上,系统运行在同一个的应用服务器。当市局需要汇总各分局的业务数据时,通过本地接口调用应用服务器上的EJB组件。各自分局的业务数据进行汇总。EJB组件将各自分局的业务数据进行汇总后,然后将最终结果返回给市局调用者,生成各分局综合汇总报表。

单位名称 数据库 DataSource 所在应用服务器
某市局 db_0 jdbc/test 192.168.1.0
A分局 db_1 jdbc/test1 192.168.1.0
A分局1所 同上 同上
A分局2所 同上 同上
A分局3所 同上 同上
........ .... ....
A分局n所 同上 同上

B分局 db_2 jdbc/test2 192.168.1.0
B分局1所 同上 同上
B分局2所 同上 同上
B分局3所 同上 同上
........ .... ....
B分局n所 同上 同上

C分局 db_3 jdbc/test3 192.168.1.0
........

D分局 db_4 jdbc/test4 192.168.1.0
........

E分局 db_5 jdbc/test5 192.168.1.0

n分局 db_n jdbc/testn 192.168.1.0



市局应用服务器xml文件
<resource-ref>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url="jdbc:sybase:Tds:192.168.1.0:5000/db_0"/>
....................
</resource-ref>

<resource-ref>
<res-ref-name>jdbc/test1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.1:5000/db_1"/>
....................
</resource-ref>

<resource-ref>
<res-ref-name>jdbc/test2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.2:5000/db_2"/>
....................
</resource-ref>

<resource-ref>
<res-ref-name>jdbc/test3</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.3:5000/db_3"/>
....................
</resource-ref>

<resource-ref>
<res-ref-name>jdbc/test4</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.4:5000/db_4"/>
....................
</resource-ref>

<resource-ref>
<res-ref-name>jdbc/test5</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param url=
"jdbc:sybase:Tds:192.168.1.5:5000/db_5"/>
....................
</resource-ref>

======综合汇总报表========

单位名称 费用1 费用2 费用3 费用4 合计
A分局 60 63 66 69
A分局1所 10 11 12 13
A分局2所 20 21 22 23
A分局3所 30 31 32 33

B分局 60 63 66 69
B分局1所 10 11 12 13
B分局2所 20 21 22 23
B分局3所 30 31 32 33
.............................................

我非常迫切的想知道解决方案是否可行,请bang兄以及各位兄弟多多帮忙

个人以为:在局与局之间数据通讯方面,不宜采取刚性很强的EJB或JavaBeans同步系统,万一,某个环节没有准备好,整个步骤会受阻,建议采取JMS异步系统,数据不丢失,不因等待某个环节太长导致失败,而且无需分两种方案,上面两种情况对于JMS系统只是不同客户端,这样弹性大,稳定性强。

JMS也是个办法,不过你的数据库都是远程连接,而且一连就是十多个分局,只要一个分局业务繁忙时候,一查不都歇菜了吗?一方面查不出东西,另外一方面也影响了业务系统的正常运行。
有个方法仅供参考:
使用Sybase的relationship Server做数据复制,可以将分局的数据复制到书局,市局的数据库就相当与一个查询数据库,这样只针对于市局做查询,这样系统的架构也就简单了,也不会出什么问题。也不会影响业务系统的正常运行。
不行的话就让他们投个几KW搞数据大集中吧,呵呵~!

> 个人以为:在局与局之间数据通讯方面,不宜采取刚性很强的
> JB或JavaBeans同步系统,万一,某个环节没有准备好,整个?> 骤会受阻,建议采取JMS异步系统,数据不丢失,不因等待某?> 环节太长导致失败,而且无需分两种方案,上面两种情况对于
> MS系统只是不同客户端,这样弹性大,稳定性强。

同意banq的看法。
b/s只是c/s的一种,browser就是一种client,在一些地方browser这个client
有很多长处,在有些地方有很多短处,我们应该因材施用。
想做一个开源的jms的异步实现,想了一下,觉得项目的管理比实现的难度还大

JMS具体怎么运用呢?是不适用MESSAGE EJB?

> JMS具体怎么运用呢?是不适用MESSAGE EJB?
那就要看你的ejb容器是否支持jms了

不支持也不要紧,可以自己实现,具体怎么使用可以参考http://java.sun.com/products/jms/tutorial/1_3_1-fcs/doc/j2eeapp2.html