论坛首页 Java企业应用论坛

大型Java多用户商城系统设计开发的心得和困难

浏览 188508 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-01-04  
学习了, 确实经典。
0 请登录后投票
   发表时间:2012-01-04  
evanzzy 写道
非要拿掉Hibernate的主要原因就是在一个“大”字,做大型网站,是不能用Hibernate的。

我平常做金融类产品居多,深知这个东西的害处。onecan说的对,Hibernate用来做简单操作确实省时省力,使用通用Dao的话那是非常痛快的。但做到后期,分表分库,集群,不同类型数据库混用阶段,Hibernate是重构的第一大障碍。而且这个阶段还涉及到人员的素质问题,Hibernate这东西用好不易,开发人员水平参差不齐,乱写乱用,看似省事,其实隐患很大,此时进行培训改进又遇到各种各样问题导致无法顺利进行。我多次遇到使用Hibernate操作数据库资金管理类库表导致数据不一致记错账的事情,管钱的记错账那都是一级生产事故啊,教训极惨痛。

onecan做的业务和我的领域比较重合,正好我也负责过电子商务网站的后台系统,如果你还不理解为什么要避免使用Hibernate,咱们可以慢慢聊,都是花大钱买来的经验教训,大家就不要再重蹈覆辙了。


我也参与过金融类的大型项目开发,整个项目架构是spring + hibernate,外加jdbc,这个项目不可谓小,在eclipse中project都达到接近100个,100号人在维护和开发,hibernate那层是有专门的专家去评审的,你可以提出申请需要增加一个表,但是要得到DBA组人员的审核。
如果用好了,对开发上也能节省不少时间,用不好就是自伤了。另外一个以前我是比较崇尚一个hibernate的超级DAO的,如果项目简单的话连DAO层都省掉了,不过项目大了之后就不好维护了,大家都乱调用,没有章节。evanzzy,我在hibernate上也没有深究,所以才会每一个表就一个Dao,一个service,一个controoler,这样会比较清晰。service层是所有逻辑的入口点。
对于你在hibernate上遇到的问题,也可以拿出来探讨一下,共同进步。
0 请登录后投票
   发表时间:2012-01-04  
yhjhoo 写道
做商城好像java不合适,老是重启动的特性很让人吃不消! 请问你们是如何解决的呢?


老是重启是在那个场景?在生产环境只有升级才会重启的。在开发环境,采用myeclipse采用jsp或者java class里面的实现是不需要重启的,eclipse + wtp 也可以做到这个效果,不过你要在controller中新增一个urlmapping或者新增一个java class,那你是要重启的,一般在写代码是会把相关功能的接口和方法的定义都写好,然后再里面改改,够你写半天的了,而且重启tomcat只要1-2分钟,那用websphere,weblogic之类的也就启动慢一点。
0 请登录后投票
   发表时间:2012-01-04  
1 spring mvc vs struts2
采用Spring MVC没错,有点比较容易扩展。集群时做cookie base on session 比较容易。
2. hibernate va jpa ibatis
应该采用ibatis,因为到后期数据库垂直水平切分比较容易,另外SQL调整控制权比较大。
3. DWR vs Jquery
不是很了解,但根据经验建议使用Jquery
4. spring 3.1 cache + ehcache/memcached
无论扩展还是性能,memcached才是王道。
5. JSP vs freemarker velocity
    静态化不仅仅是JSP,里面的CSS+IMAGE等都需要做静态资源服务的,故直接采用模板就比较合适。另外,静态化最重要需要考虑的是IMAGE等资源,切记。
6. apache tiles vs sitemesh
    无建议
7. 其余几个就没什么悬念了, 由于现在免费的jsp空间比较多的支持mysql和tomcat, 所以这2个是我们要优先支持的,虽然我们也支持oracle等。
    只要SQL不是很BT,基本迁移起来没什么大事儿的。
8.重启中断服务
  在阿里或淘宝,采用的是Half的方式进行服务的启动,前段采用F5进行负载均衡。具体做法是。比如,10台机器,先停掉5台,然后发布新程序,然后启动,F5连接有效后,循环做另外的部分。这种方式一般通过F5脚本进行操作,这样只会让用户觉得慢不会有无法访问的情况。所以,不停服务更新程序,在你没有能力购买F5前,是不能平滑解决的。
0 请登录后投票
   发表时间:2012-01-04  
onecan 写道

我也参与过金融类的大型项目开发,整个项目架构是spring + hibernate,外加jdbc,这个项目不可谓小,在eclipse中project都达到接近100个,100号人在维护和开发,hibernate那层是有专门的专家去评审的,你可以提出申请需要增加一个表,但是要得到DBA组人员的审核。
如果用好了,对开发上也能节省不少时间,用不好就是自伤了。另外一个以前我是比较崇尚一个hibernate的超级DAO的,如果项目简单的话连DAO层都省掉了,不过项目大了之后就不好维护了,大家都乱调用,没有章节。evanzzy,我在hibernate上也没有深究,所以才会每一个表就一个Dao,一个service,一个controoler,这样会比较清晰。service层是所有逻辑的入口点。
对于你在hibernate上遇到的问题,也可以拿出来探讨一下,共同进步。


咱们都是做技术的,不客气。不过恕我直言,100个project由100号人开发维护——这是谁让这么干的?哪个技术负责人能够掌控整个项目?

Hibernate层有人专门评审,这就是效率降低而不用Hibernate的原因之一——写程序省的时间被评审之间的互相沟通消耗掉了。你用jdbc Template或者ibatis去做,就不需要有人评审Hibernate层。此为原因之一也。

Hibernate的一、二级缓存可以提高效率,但是涉及到资金处理,就要出大问题。电子商务网站要处理资金问题,Hibernate不合适。

另外,项目中如果没有涉及到分表、分库、数据库集群、应用服务器集群、缓存服务器集群及相关负载均衡和失败转移问题的解决,甚至引入NoSql数据库,是谈不上大型项目的。我说不用Hibernate,就是在以上这些应用中不用它。你用Hibernate做Dao层,是否考虑了以上这些问题的解决方案了呢。是否可以分享一下?

实话实说,我就是因为用Hibernate解决不了这些问题,所以才放弃使用,并不是说我对这个东西有什么偏见。
0 请登录后投票
   发表时间:2012-01-04  
yhjhoo 写道
做商城好像java不合适,老是重启动的特性很让人吃不消! 请问你们是如何解决的呢?

运维部门要有专门的升级部署脚本,会把服务器程序逐一自动升级并启动Tomcat等服务器软件,并不需要人工处理。如果人工处理的话,那确实是吃不消
0 请登录后投票
   发表时间:2012-01-04  
shine0181 写道
orm层直接 用 hibernate就可以了,,,,
没必要再加个ibatis了, 有求高的就hibernate直接调用jdbc语句(相当于ibatis的功能了),




不会造成缓存不同步的问题吗?我一直担心hibernate的这个问题。
0 请登录后投票
   发表时间:2012-01-04  
look12345 写道
shine0181 写道
orm层直接 用 hibernate就可以了,,,,
没必要再加个ibatis了, 有求高的就hibernate直接调用jdbc语句(相当于ibatis的功能了),




不会造成缓存不同步的问题吗?我一直担心hibernate的这个问题。

最不想看到和听到的,就是通过Hibernate执行原生SQL语句。

这样做的话,你会发现你的 系统中夹杂的SQL越来越多,最后以至于实际上都跟Hibernate一点关系都没有了,但是你还是在兴高采烈地认为这一切都是Hibernate的无敌力量,然后对Hibernate三拜五叩。

如果你为了适应Hibernate而去干涉数据库表结构设计,甚至干涉项目需求的设计,那么我只能说,你为了Hibernate,付出太多了。
1 请登录后投票
   发表时间:2012-01-04  
george_space 写道
look12345 写道
shine0181 写道
orm层直接 用 hibernate就可以了,,,,
没必要再加个ibatis了, 有求高的就hibernate直接调用jdbc语句(相当于ibatis的功能了),




不会造成缓存不同步的问题吗?我一直担心hibernate的这个问题。

最不想看到和听到的,就是通过Hibernate执行原生SQL语句。

这样做的话,你会发现你的 系统中夹杂的SQL越来越多,最后以至于实际上都跟Hibernate一点关系都没有了,但是你还是在兴高采烈地认为这一切都是Hibernate的无敌力量,然后对Hibernate三拜五叩。

如果你为了适应Hibernate而去干涉数据库表结构设计,甚至干涉项目需求的设计,那么我只能说,你为了Hibernate,付出太多了。

见过有些人为了Hibernate而不停的改动数据库表结构,造成的连锁反应是,表结构变到最后,项目的原始需求都给人家扭曲了,扭曲就扭曲吧,还美其名曰:数据库本来就应该这样设计。

我想说的是:软件是为人服务的,不是人为了软件而东奔西走。

为了一个Hibernate,竟然连项目需求都给人家浅浅地偷梁换柱,而且还把自己忙得不亦乐乎,我想说,你为软件付出太多了,相反,你喜欢的软件,除了把你折腾得四脚朝天,也把老板气的七窍生烟,这就是典型的“软件把人真疼疯了”,而不是“软件为人服务”。
1 请登录后投票
   发表时间:2012-01-04  
测试环境的话,把这些装在一台机器是可以的,生产环境的话可以考虑用虚拟化实现,web、中间件、数据库对硬件的需求是不一样的。可以按需调度硬件资源。并且资源不够的时候也方便扩展
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics