论坛首页 Java企业应用论坛

一次小项目的思考

浏览 52001 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-08-24   最后修改:2009-08-24
对banq<<数据库已死>>的反对意见:

1>随着用户的爆发量增长,在某个凌晨醒来时,你发现:数据库已死。
评价:和数据库没什么关系吧,大的网站不做分布式,自动数据分布和失败转移?系统设计的问题,和数据库有毛关系啊。这样说的话,一觉醒来,你发现硬盘坏了,那什么介质都不用用了。

2>著名的社区网站MySpace就是因为一个好的idea,用户疯狂增长,但是系统却不能平滑承受增长的用户访问,这些用户访问网站缓慢、无法访问甚至丢失数据,他们经过几次伤筋动骨的架构升级,在微软SQLServer直接技术支持下, 好容易才勉强应付过去。看看他们痛苦经历,你是否也愿意再来一次呢?详细情况: http://www.jdon.com/jivejdon/thread/34601.html
评价:你经历过?MySpace的人都是傻子?

3>其实2003年国外TSS就有一篇“给数据库休息吧”(休息不代表退休,而是退居幕后,就象操作系统作用一样)
评价:人家是说休息,没有说死亡,这样推的话,操作系统早死亡了

4>所谓伸缩性,就是弹性,整个软件架构既支持小负载运行,也支持大负载支持,只要增加服务器即可;由于软件系统负载已经从SQL转移到内存中的对象上,那么我们就可以通过增加这些应用服务器数量,通过分布式计算甚至云计算,达到业务对象在多台应用服务器之间传递共享,而不必通过数据库这个环节,既减轻数据库负载,又能轻松扩充性能,不必走集中试大型主机之路,只要添置低廉PC服务器即可。经过权威测试:websphere/weblogic的20台PC服务器集群性能不亚于一台SUN/IBM的中型机,性价比已经一目了然了。

  JavaEE的服务器的集群相对于Linux等操作系统集群的好处在于:JavaEE集群能够针对某个繁忙负载大的具体业务功能进行集群,换句话说: 就是做到精确制导,精确解决问题,而显然,Linux操作系统的集群则无法直至业务核心的。

评价:用c++/c/汇编都可以实现,系统设计的问题等同于使用java就可以解决系统设计的问题,可笑。错误的把集群当成分布式了,集群只是其中一小部分技术

问:
   banq是否做过大的网站,是基于什么样的论调做的数据库已经死亡的结论?感觉他直接命题人工智能可以代替人,远着呢。java使用自己的语言设计操作系统,存储引擎(可以不叫数据库,叫个其他的名字,呵呵),编译器,分布式模型。如果能做了这些的话,你可以说现在的数据库已经死亡了。

对中国危害最大的是:
a) 数据造假
b)没有数据支撑的乱说比造假更可恶

造假是最可恶的。明明没有做出来,就编造,后边的人没法做出来,还破坏了别人的创新性,成为学术发展的绊脚石。抄袭无所谓,至少不会引导别人偏离正确的研究方向


btw:刚好一个项目结束,有空上来关注。


0 请登录后投票
   发表时间:2009-08-24   最后修改:2009-08-24
pipilu 写道

面向对象建模也有一些问题。
1. 人为拆分细小对象,导致表众多,关系复杂,效率低下。
2. 常量数据无法对应到数据库表中,人为导致部分数据缺失,或者得依赖某种ORM以相对复杂的方法实现。
3. 一些特定技术实现难度较大,比如大数据分页,不得不依赖回数据库的特定实现,比如mysql的某些语句。
4. 职责关系不清,程序员取代不了数据库管理员,数据库管理员也不是程序员。
5. 浪费数据库资源,某些强大的数据库能力被浪费。

其实发布这个帖子的目的,其主要关注点还是数据建模与对象建模。可以见无明:[urlhttp://www.iteye.com/topic/1464]数据建模 vs 对象建模 (从Ofbiz帖子切分出来的)[/url]
另外,再次说明,并非指出,不使用数据库。
另外,针对上面的几个问题:
1. 这个是粒度问题,对粒度的把握不准。而数据建模,同样也存在这个问题。[另外,拆分多个细小对象,也并不一定导致表众多]
2. 常量数据无法对应数据库表中,这个无从谈起,请具体说明。
3. 大数据量分页,这个确实依赖于数据库的特定实现。对相当于采用orm如hibernate,其分页函数,则提供了更小的数据库移植成本等(这里只提出这样一个场景,请就要就一般不会进行数据库移植等问题进行回复)。
4. 职责关系不清,这个,应该说相当部分的程序员,对数据库,SQL等掌控不是太好。但相当的数据库管理员,对程序掌握也不是太好。那么,数据库建模,确实也会造成在程序实现上的影响。
5. 采用orm如hibernate,并非就一定不能浪费了数据库能力,上面已经回答过。相反的,在某些场景下,却可以采用对象手段与数据库手段来更好地解决某些问题。
------------------------------------------------------------------------------------------------------------
另外,买Tuxedo的,不一定就是傻子。但,也并非是傻或聪明才能说明的。
比如说需要一些老系统,或是某项目功能必须依赖于Tuxedo。因为曾经有这样个项目,必须使用Tuxedo,而后来又不得不又背一个weblogic。
0 请登录后投票
   发表时间:2009-08-24  
ray_linn 写道
lovejuan1314 写道
Oracle expert tom kyte 的开发经验

对于开发数据库软件,我有一套很简单的哲学,这是我多年以来一直信守的思想:
  如果可能,尽量利用一条 SQL 语句完成工作。
  如果无法用一条 SQL 语句完成,就通过 PL/SQL 实现(不过,尽可能少用 PL/SQL!)。
  如果在 PL/SQL 中也无法做到(因为它缺少一些特性,如列出目录中的文件),可以试试使用
Java 存储过程来实现。不过,有了 Oracle9i 及以上版本后,如今需要这样做的可能性极小。
  如果用 Java 还办不到,那就在 C 外部过程中实现。如果速度要求很高,或者要使用采用 C
编写的一个第三方 API,就常常使用这种做法。
  如果在 C 外部例程中还无法实现,你就该好好想想有没有必要做这个工作了。



呵呵 Tom <Oralce 高级编程> ,其观点就是,花在数据库上的每一分钱都应该得到回报,有一项功能不用,就是浪费。


严重同意,他是站在oracle这个角度说的,实际上,对于整个系统来说,我目前的做法都是能在应用里做的都在应用里做,因为从系统结构上来看,数据库的扩展性远没有应用这头的扩展性好
0 请登录后投票
   发表时间:2009-08-24  
argan 写道
因为从系统结构上来看,数据库的扩展性远没有应用这头的扩展性好

0 请登录后投票
   发表时间:2009-08-24  
rainlife 写道

4. 职责关系不清,这个,应该说相当部分的程序员,对数据库,SQL等掌控不是太好。但相当的数据库管理员,对程序掌握也不是太好。那么,数据库建模,确实也会造成在程序实现上的影响。



就这个问题回答给你第5点。

无论对象建模还是数据库建模,都避免不了数据库被污染的问题。出于对数据稳定性的考虑,有了新业务也很难修改原来的表结构,通常是加表了事,结果无论是面向对象还是面向数据库,通通变成四不象。
0 请登录后投票
   发表时间:2009-08-24  
rainlife 写道
argan 写道
因为从系统结构上来看,数据库的扩展性远没有应用这头的扩展性好




对于业务逻辑来说,通过SP暴露业务接口和通过Service暴露业务接口是一样的。


0 请登录后投票
   发表时间:2009-08-24   最后修改:2009-08-24
ray_linn 写道
rainlife 写道
argan 写道
因为从系统结构上来看,数据库的扩展性远没有应用这头的扩展性好




对于业务逻辑来说,通过SP暴露业务接口和通过Service暴露业务接口是一样的。



确实,将业务逻辑封入SP是一样,而且,确实也有应用采用这种方式。但却问题也非常多:
1. 移植问题[仅提出这样的场景]
2. 业务逻辑更改等问题
3. 事务
4. 。。。。。
另外,见http://www.iteye.com/topic/7266
0 请登录后投票
   发表时间:2009-08-24  
ray_linn 写道
rainlife 写道
argan 写道
因为从系统结构上来看,数据库的扩展性远没有应用这头的扩展性好




对于业务逻辑来说,通过SP暴露业务接口和通过Service暴露业务接口是一样的。




这差的远了,有一天,你在处理订单的业务的时候,想加上打折的功能,买10000,打个8折,整了半天,发现这个总金额是在存储过程里写的,还得去找DBA来修改,过了两天,老板说,我们要搞个金秋大推广....DBA大哥还维护数据库干吗呢,直接去写业务规则得了

说到底,还是要把事情放在最合适的地方去做,同样DBA也不应该去关心具体的业务逻辑
0 请登录后投票
   发表时间:2009-08-24  
murainwood 写道
lyong757 写道
murainwood 写道
lyong757 写道
everlasting_188 写道
fjlyxx 写道
everlasting_188 写道
如果你能写出IO和CPU都占用100%的程序,请指教:
1>你是如何观察到的?观察手段
2>你是让你的进程占用完除操作系统以外的cpu和io,请考虑下面几个因素
   a)多核情况下
   b)操作系统也有进程,也要占用cpu和io

不要告诉你在JVM上就可以达到


我说过要靠竞争 比如NIO 你多注册几个无关事件CPU可以达到很高的  正常如果CPU空转情况下 比如WHILE里面没有休眠基本是100的   IO高这块 你只要通过操作系统写缓存的操作达到  一般在操作系统大量频繁写缓存的时候就会发生了 只要你IO操作的数据量够大并且够频繁


请指教:
1>那个版本的jvm支持多核?
2>JVM只是一个进程,怎么保证一个进程将cpu除操作系统运行和切换后的cpu分配到jvm上?



并不是反驳这个观点 只是比较关注 期待中

1.十年前的JVM,可能并不支持多核。
2.这个问题很有意思,既然这么谈,那么聊聊JVM里的线程吧。



请赐教  因为不懂这方面 希望能够学习学习

大学里面干嘛去了?这已经算是常识了。

不好意思 我是半路出家
0 请登录后投票
   发表时间:2009-08-24   最后修改:2009-08-24
1>瓶颈的问题,单点永远有问题,系统设计的问题。不是java的问题,不是数据库的问题,是脑子聪明和进水多少的问题。数据库和java也只是讨论工具使用的问题,更具体的java中使用数据库的问题,如果你认为面向对象是最好的,那么:那个牛人设计出了一个面向对象的牛的存储引擎?要不的话,只有你知道这个真理,难道是新时代的爱因斯坦,如果是我的话,我宁愿相信自己不是。当然也有人相信自己是,等待别人做实验证明给看。你看人家goole,一下子就做出一个分布式的BigTable,他也不敢吹自己是分布式面向对象的BigTable,可见不是那么容易的。

2>我们是做应用开发的,还是少炒作概念,务实一点好

个人的理解吧,可能一人对世界一个理解方法。
0 请登录后投票
论坛首页 Java企业应用版

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