关于企业级分布式计算设计模式的疑问,精通j2ee的朋友请进

redfox33 2004-10-09 03:58:14
信息综合查询,即在市局可以查到各分局的业务信息。
Sybase12.5
JBoss3.2.5
resin
在这里根据各城市不同的硬件设备限制,可以采用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
.............................................

我只是想知道我这种模式是否能实现,哪里还有问题和不足之处。因为我对ejb不熟悉,所以不知道如何调用远程接口,因此在这里写了一些伪码,请精通J2EE/EJB的朋友给提些建议或者有没有更好的解决方案。
...全文
278 点赞 收藏 31
写回复
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
mycafe 2004-11-11
第一种就像是业余水平的设计,如果单台数据库服务器出错的概率为x,那么可靠性为(1-x)
因为你要做总计,那么这个设计中n台服务器的可靠性仅为(1-x)的n次方。

数据集中式很多系统设计的初始考虑,除非那部分数据是不归你自己控制的,
如果数据集中有服务器失效的考虑,那你可以弄个服务器集群,再搞搞数据库的双机热备阿。
回复
baointoo1980 2004-11-11
学习!
回复
aaassd 2004-11-08
mark
回复
vision2000 2004-10-13
2者结合。
分局的数据存储在分局的数据库中。
当市局查询时,发送汇总命令到个分局的应用服务器,对数据进行汇总后存储到市局的数据库上。
市局查询即可。
回复
smilelee 2004-10-12
InitialContext的时候应该要指定app server的IP和端口号,查查JBOSS的文档参数怎么写
回复
redfox33 2004-10-11
to dropship(梦,一定要圆)
以上代码没有问题,我是用eclipse开发的,在eclipse环境里,上述代码可以成功的调用ejb,返回结果。但是脱离了开发环境,我放到另外的一台客户机上运行就出错
回复
redfox33 2004-10-11
up
回复
smilelee 2004-10-10
方案一,采用数据复制技术将分局汇总好的数据自动复制上来更好。
回复
J2eeLearner 2004-10-10
你的方案2,分局的数据能够及时传上来么? 看上去好像是减少投资了,但是安全肯定是降低了。 呵呵

如果我记得不错的话,"一年2百万条左右",开源的数据库就能做到性能很好了。 呵呵~

所以方案一没啥不好的。

另外说一句,你的方案2是不是就用一个服务器,然后建多个数据库啊?那么你提问中的配置文件干嘛要那么多的ip??
<init-param url="jdbc:sybase:Tds:192.168.1.0:5000/db_0"/>
<init-param url="jdbc:sybase:Tds:192.168.1.2:5000/db_2"/>
.
.
.
回复
lliei 2004-10-10
第二种方案吧,现在似乎 将数据进行集中,是很多公司采用的方法
集中存储,不需要每个分局购置服务器和建设机房,节约投资
而且便于管理,对服务器升级,而且安全性方面也很好搞定
回复
zhang21cnboy 2004-10-10
第一种方案不可取。
回复
redfox33 2004-10-10
回复
redfox33 2004-10-10
感谢大家的捧场!
无论方案1的数据分布式存储,还是方案2的数据集中式存储,都是根据不同的城市需求而决定的,所以,这两种方案都得实现。
回复
pmaster 2004-10-10
帮顶
回复
dropship 2004-10-10
Hashtable env=new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,"192.168.1.1"); //应用服务器A的ip

javax.naming.Context ctx=new javax.naming.InitialContext();
Object obj=ctx.lookup("SumHome"); //jboss.xml文件 <jndi-name>SumHome</jndi-name>
SumHome Home=(SumHome) javax.rmi.PortableRemoteObject.narrow(obj,SumHome.class);
Sum myejb=Home.create();
out.println(myejb.hello());

把以上代码放到try catch中去,看看哪里的问题
回复
redfox33 2004-10-10
还是不行
回复
redfox33 2004-10-10
应用服务器B 的classpath设定了jnp-client.jar jboss-client.jar
回复
redfox33 2004-10-10
500 Servlet Exception
java.lang.NullPointerException
at _test__jsp._jspService(/test.jsp:29)
at com.caucho.jsp.JavaPage.service(JavaPage.java:75)
at com.caucho.jsp.Page.subservice(Page.java:506)
at com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:182)
at com.caucho.server.http.Invocation.service(Invocation.java:315)
at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:246)
at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:163)
at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
at java.lang.Thread.run(Thread.java:484)


--------------------------------------------------------------------------------
Resin 2.1.12 (built Tue Dec 9 14:58:25 PST 2003)
回复
dropship 2004-10-10
贴一下具体的出错信息,哪个地方nullpointer?
回复
redfox33 2004-10-10
回复
发动态
发帖子
Web 开发
创建于2007-09-28

7.9w+

社区成员

Java Web 开发
申请成为版主
社区公告
暂无公告