论坛首页 Java企业应用论坛

技术选型带来的困扰

浏览 17080 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-06  
其实我觉得这些不单单是技术选型问题了。

如果数据库单表里面超过了10亿级别以上的数据,你该如何处理?

传统的这种单台数据库结构到最后都存在瓶颈,有钱的公司可以用小型机、大型机器,超大的内存..没钱的公司怎么办?

不是技术选型,更应该是寻找解决这些业务需求的方案。你的方案会支撑未来日益增长的数据多少年?
0 请登录后投票
   发表时间:2008-05-06  
同意楼上godlikeme、coolzyt的看法,
jdbc、ibatis、jdbctemplate、hibernate我都使用过很久。现在用的是我们自己写的基于jdbctemplate的sqlmap框架(主要增加了惯例、再写个代码生成工具、加上一堆辅助API、稍微做点数据库兼容改造)——也是因为jdbctemplate写起代码来太啰嗦了。

我的个人经验:从性能的角度出发,这些技术都不会存在问题,足以应对百万级的性能要求了。
如果楼主对sql很精通,那就用ibatis,如果对OOP很精通,那就用hibernate。
都是很成熟的玩意,除了问题也容易解决。

至于为什么ibatis+spring会比纯ibatis慢这么多,实在是很奇怪!我认为这里面必然有性能调整空间。spring仅仅提供session、DAO层而已,而理论上(实际应用也是)ibatis比jdbc就多了一点点自动映射操作,随着jdk的发展这个性能损失越来越小,应该不会导致这么大的差距。

0 请登录后投票
   发表时间:2008-05-06  
icewubin 写道
neora 写道
以我的经验谈谈我的个人看法:
1、首先,积累了30年的数据库数据量想必大得惊人。如果你的应用需要频繁的查询数千万的数据,那么必须在适当的地方采用存储过程来表现业务逻辑,尽量利用数据库自身的能力来完成复合的数据查找、比较和筛选。商用数据库本身在这方面的处理是非常强劲而稳定的。其数据处理能力是Java虚拟机所无法比拟的(无论你用任何框架,写出任何出色的代码)。
2、尽量保持由存储过程处理完毕后的数据量在较小的范围内,缩减到“数万”这个级别,然后再交给Java虚拟机来完成其他的业务逻辑。
3、你觉得参杂了存储过程会让你们的代码不够OO,但这样的程序稳定性会高出许多。
4、完全采用Hibernate这种小玩意儿来做海量规模的数据处理绝对是下下策,我见过的所有完全采用Hibernate的电信级计费系统无一例外都是失败案例。至少在可靠性和鲁棒性上极其脆弱。我所经历的基于存储过程的案例几乎都是非常成功的。
5、我不是说Hibernate不好,事实上它在做Web应用中非常非常出色。但不适合将所有的数据逻辑都交给它。把很“搞人脑袋”的逻辑交给Hibernate,把很“搞CPU”的交给存储过程。
6、使用Hibernate的时候,切忌此类简单用法:将要处理的数据全部从数据库中以Active状态捞到JVM,指望让JVM来完成所有工作。有时候,你一不小心,就会这么做。
7、方案,存储过程+Hibernate

个人看法。

1、如果原来有存储过程,就善加利用,如果没有说明这个系统数据量不够真正的大。
2、业务需求不明,即使超过万仍然是有办法的,但是需求要给出才能评估。
3、OO和稳定性没有矛盾之处,存储过程一样容易出bug。OO的代码不稳定也是一种bug,没有本质区别。
4、Hibernate是小玩意儿,那是你不知道使用技巧,适用范围不是看数据量大小的,是要看需求的,比如是否需要实时生成新的表。
5、Hibernate要用得好,sql一定也很好,不可能完全交给Hibernate的,必须要清楚任何状态下生成的sql的大致形态。
6、其他框架也有类似问题,只是不那么容易内存溢出而已,其实是数据结构的基础问题。
7、可以考虑,如果原来没有存储过程的话,需求中又有类似电信计费这种,你又熟悉存储过程的话,建议如此。

两位观点并不矛盾,只是设计策略和出发点不同。问题症结就在于究竟是OO对象模型还是数据关系模型为驱动设计的问题。从OO出发,采取hibernate等O/R映射框架会很顺手;从数据关系出发,jdbc存取(或一定的存储过程)会更加直接高效。不过,根据我经验来看,我个人偏重从数据关系出发来解决问题,采取jdbc+dao解决方案,我始终认为在当前相当长的一段时间内O/R映射解决方案都不是企业应用持久层开发的合适技术,这是因为制约各种O/R映射技术发展的根本原因不是各种编程技术的不成熟,而正是各种成熟的关系模型的数据库。关系模型的目标是如何合理、简便、快速地存取数据,而不是按照面向对象的思想建立的实体模型来存取数据的,这就是这两种思想的差别所在,也是决定了O/R映射技术不能面面俱到解决所有关系模型问题的根本命运。关系数据库理论经历数10年发展已经是一个十分成熟理论,经得起考验,所以短时间内出现一个成熟的面向对象的实体型数据库是不太可能的。也许,到了哪一天,我们的数据存取就可以完全面向对象了,也不用搞什么O/R映射了。
0 请登录后投票
   发表时间:2008-05-06  
lz数据迁移是否用etl工具?
0 请登录后投票
   发表时间:2008-05-06  
三条路:

1、重新设计DB并迁移数据,一定要符合范式,这样才会配得上OO。在此前提下,使用强制OO的Spring、Hibernate、Ibatis、Struts等等才有价值。
2、如果难以迁移DB,继续sql和存储过程,不要用什么framework,就用jdbc、Servlet和JSP。
3、如果系统是以写为主,界面交互复杂,建议老兄不要赶髦,老老实实用VB或者Delphi写C/S。

千万不要为了OO而OO,为了Java而Java,为了Spring而Spring。
0 请登录后投票
   发表时间:2008-05-06  
HenryYu 写道
icewubin 写道
neora 写道
以我的经验谈谈我的个人看法:
1、首先,积累了30年的数据库数据量想必大得惊人。如果你的应用需要频繁的查询数千万的数据,那么必须在适当的地方采用存储过程来表现业务逻辑,尽量利用数据库自身的能力来完成复合的数据查找、比较和筛选。商用数据库本身在这方面的处理是非常强劲而稳定的。其数据处理能力是Java虚拟机所无法比拟的(无论你用任何框架,写出任何出色的代码)。
2、尽量保持由存储过程处理完毕后的数据量在较小的范围内,缩减到“数万”这个级别,然后再交给Java虚拟机来完成其他的业务逻辑。
3、你觉得参杂了存储过程会让你们的代码不够OO,但这样的程序稳定性会高出许多。
4、完全采用Hibernate这种小玩意儿来做海量规模的数据处理绝对是下下策,我见过的所有完全采用Hibernate的电信级计费系统无一例外都是失败案例。至少在可靠性和鲁棒性上极其脆弱。我所经历的基于存储过程的案例几乎都是非常成功的。
5、我不是说Hibernate不好,事实上它在做Web应用中非常非常出色。但不适合将所有的数据逻辑都交给它。把很“搞人脑袋”的逻辑交给Hibernate,把很“搞CPU”的交给存储过程。
6、使用Hibernate的时候,切忌此类简单用法:将要处理的数据全部从数据库中以Active状态捞到JVM,指望让JVM来完成所有工作。有时候,你一不小心,就会这么做。
7、方案,存储过程+Hibernate

个人看法。

1、如果原来有存储过程,就善加利用,如果没有说明这个系统数据量不够真正的大。
2、业务需求不明,即使超过万仍然是有办法的,但是需求要给出才能评估。
3、OO和稳定性没有矛盾之处,存储过程一样容易出bug。OO的代码不稳定也是一种bug,没有本质区别。
4、Hibernate是小玩意儿,那是你不知道使用技巧,适用范围不是看数据量大小的,是要看需求的,比如是否需要实时生成新的表。
5、Hibernate要用得好,sql一定也很好,不可能完全交给Hibernate的,必须要清楚任何状态下生成的sql的大致形态。
6、其他框架也有类似问题,只是不那么容易内存溢出而已,其实是数据结构的基础问题。
7、可以考虑,如果原来没有存储过程的话,需求中又有类似电信计费这种,你又熟悉存储过程的话,建议如此。

两位观点并不矛盾,只是设计策略和出发点不同。问题症结就在于究竟是OO对象模型还是数据关系模型为驱动设计的问题。从OO出发,采取hibernate等O/R映射框架会很顺手;从数据关系出发,jdbc存取(或一定的存储过程)会更加直接高效。不过,根据我经验来看,我个人偏重从数据关系出发来解决问题,采取jdbc+dao解决方案,我始终认为在当前相当长的一段时间内O/R映射解决方案都不是企业应用持久层开发的合适技术,这是因为制约各种O/R映射技术发展的根本原因不是各种编程技术的不成熟,而正是各种成熟的关系模型的数据库。关系模型的目标是如何合理、简便、快速地存取数据,而不是按照面向对象的思想建立的实体模型来存取数据的,这就是这两种思想的差别所在,也是决定了O/R映射技术不能面面俱到解决所有关系模型问题的根本命运。关系数据库理论经历数10年发展已经是一个十分成熟理论,经得起考验,所以短时间内出现一个成熟的面向对象的实体型数据库是不太可能的。也许,到了哪一天,我们的数据存取就可以完全面向对象了,也不用搞什么O/R映射了。

在我的大脑中,hibernate就是一个sql生成器+缓存机制,不存在什么OO的概念,OO我觉得就是代码可读性高,代码量少能使bug减少,提供编译期检查,利用IDE的重构功能,如此而已,hibernate生成sql的能力大家都是知道的,但是hibernate抓取数据并封装到自定义对象或者是map的能力很多人是不清楚的,其实也是超强的。所以不认为hibernate有什么太大的性能问题,就是精通的学习成本较高。
比如,可以有取舍么,比如级联这种很容易性能失控的东西就可以不用,适当的倒退,把Hibernate当成是sql生成器来用思路就会清楚很多,对象图的获取和遍历的合理性都能精确的控制,这是其他框架不如hibernate的地方。OO特性太空泛了,没有什么具体的价值,好比OO还不是由很多段面向过程的语句合成的,写代码就是代码如何组织,业务逻辑处在什么位置的问题。
0 请登录后投票
   发表时间:2008-05-08  
zq0459 写道

2.使用struts+hiberntate查询时,将返回值装配到List中抛出Java.lang.OutOfMemoryError: Java heap space。(测试数据库postgreSQL8)
查询代码如下:
public List<Employee> selectAllEmployee() {
// TODO Auto-generated method stub
Session session = null;
List<Employee> list = new ArrayList<Employee>();
try {
session = HibernateUtil.currentSession();
Query query = session.createQuery("from Employee ");
list = (List<Employee>) query.list();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("<<-------------" + e.toString());
}

return list;
}

你的 Employee是怎么定义的?贴出相关的 annotation 和 hbm.xml 看看
也许是 Employee关联了许多其他类,但没有lazy读取
0 请登录后投票
论坛首页 Java企业应用版

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