锁定老帖子 主题:技术选型带来的困扰
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-05
以我的经验谈谈我的个人看法:
1、首先,积累了30年的数据库数据量想必大得惊人。如果你的应用需要频繁的查询数千万的数据,那么必须在适当的地方采用存储过程来表现业务逻辑,尽量利用数据库自身的能力来完成复合的数据查找、比较和筛选。商用数据库本身在这方面的处理是非常强劲而稳定的。其数据处理能力是Java虚拟机所无法比拟的(无论你用任何框架,写出任何出色的代码)。 2、尽量保持由存储过程处理完毕后的数据量在较小的范围内,缩减到“数万”这个级别,然后再交给Java虚拟机来完成其他的业务逻辑。 3、你觉得参杂了存储过程会让你们的代码不够OO,但这样的程序稳定性会高出许多。 4、完全采用Hibernate这种小玩意儿来做海量规模的数据处理绝对是下下策,我见过的所有完全采用Hibernate的电信级计费系统无一例外都是失败案例。至少在可靠性和鲁棒性上极其脆弱。我所经历的基于存储过程的案例几乎都是非常成功的。 5、我不是说Hibernate不好,事实上它在做Web应用中非常非常出色。但不适合将所有的数据逻辑都交给它。把很“搞人脑袋”的逻辑交给Hibernate,把很“搞CPU”的交给存储过程。 6、使用Hibernate的时候,切忌此类简单用法:将要处理的数据全部从数据库中以Active状态捞到JVM,指望让JVM来完成所有工作。有时候,你一不小心,就会这么做。 7、方案,存储过程+Hibernate 个人看法。 |
|
返回顶楼 | |
发表时间:2008-05-06
zq0459 写道 如果持久化层使用Spring(JdbcTemplate),那么分页功能的实现依赖于数据库吗?也就是说目前采用的是DB2,以后要移植到ORACLE,分页功能需要改吗?
真是死脑筋,转个弯都不会。持久化层用Spring(JdbcTemplate),用Hibernate来专做分页不就行了? Hibernate即然号称分页很强,跨数据库,那很好,那就让它来专干这个好了,(当然不用它的缓存了) 。 至于做法可参见本文http://www.iteye.com/post/293393,由工具自动生成遗留数据库的配置,忽略对象间的关联。本来嘛,遗留数据库也没有对象关联这一说。 |
|
返回顶楼 | |
发表时间:2008-05-06
neora 写道 以我的经验谈谈我的个人看法:
1、首先,积累了30年的数据库数据量想必大得惊人。如果你的应用需要频繁的查询数千万的数据,那么必须在适当的地方采用存储过程来表现业务逻辑,尽量利用数据库自身的能力来完成复合的数据查找、比较和筛选。商用数据库本身在这方面的处理是非常强劲而稳定的。其数据处理能力是Java虚拟机所无法比拟的(无论你用任何框架,写出任何出色的代码)。 2、尽量保持由存储过程处理完毕后的数据量在较小的范围内,缩减到“数万”这个级别,然后再交给Java虚拟机来完成其他的业务逻辑。 3、你觉得参杂了存储过程会让你们的代码不够OO,但这样的程序稳定性会高出许多。 4、完全采用Hibernate这种小玩意儿来做海量规模的数据处理绝对是下下策,我见过的所有完全采用Hibernate的电信级计费系统无一例外都是失败案例。至少在可靠性和鲁棒性上极其脆弱。我所经历的基于存储过程的案例几乎都是非常成功的。 5、我不是说Hibernate不好,事实上它在做Web应用中非常非常出色。但不适合将所有的数据逻辑都交给它。把很“搞人脑袋”的逻辑交给Hibernate,把很“搞CPU”的交给存储过程。 6、使用Hibernate的时候,切忌此类简单用法:将要处理的数据全部从数据库中以Active状态捞到JVM,指望让JVM来完成所有工作。有时候,你一不小心,就会这么做。 7、方案,存储过程+Hibernate 个人看法。 大部分赞同你的观点, 第5,6点也不是不可以,只是对开发人员的要求很高,也要看具体情况。 不是所有的批量数据处理都必须是存储过程,用hibernate一样可以做,关键点在于批量处理是否可以拆分为单笔处理。 比较流行的观点认为hibernate比较适合做 联机交易处理,存储过程比较适合做 联机分析处理,但其中有交叉之处,不那么绝对。 对于第4点,对电信计费知道点皮毛,计费有很强的实时性要求,对处理速度要求比较高,而且不会缓存,且数据模型不OO,不适合用Hibernate,而不仅仅是因为海量数据(一般一次处理几十万,百万吧),全用hibernate不现实。 |
|
返回顶楼 | |
发表时间:2008-05-06
allenwang 写道
从DB2向Oracle迁移?如果这样的话,建议数据持久化用Hibernate,统计等大数据操作可以使用PL/SQL,速度要快很多。当然,如果你非要考虑数据库的可移植性等等问题,那么PL/SQL可能并不适合你
迁移的同时也要整合,否则没意义。好不容易来一次凤凰涅槃。 既然你的程序也要重写,就重新设计ER模型,包括业务模型的梳理, 老数据的价值一是引用(基础数据),一是分析。 所以ETL 是必要的 |
|
返回顶楼 | |
发表时间:2008-05-06
以前我也做过数据库的开发,银行的项目,数据量也非常之大。下面给你几个建议,仅供参考:
1.申请能不能整理数据,把一些历史数据移到别的地方,如果不能整理数据就算了 2.优化表结构,如果不能修改表的字段,那么至少要能创建索引,关键字之类的。 3.把表分类处理,比如一些表经常要修改,数据量很大,而一些表修改不是很大,这类表可以想办法缓存数据到内存中,没必要在查询的时候做连接 4.你说的那几个组合都无所谓,这些组合都能满足你的要求。重要的是你要设计好你的程序,对于数据量大的表做查询的时候一定要走索引,我以前做过3000万级别的表查询,oracle数据库,走索引的时候查询也很快,对于10万条左右的表查询,如果是单表,即使不用索引也会很快。建议你还是走索引。 5.sql一定要优化,具体优化先看你是什么数据库,然后查找相应的方法优化。 |
|
返回顶楼 | |
发表时间:2008-05-06
如果你要出报表,比如要写很复杂的sql,我建议你这部分不要用hibernate之类,还是用jdbc比较好,自己好控制。或者你也可以再建立辅助表,写job做预处理,然后再从处理一遍的结果中查找数据。比如一些统计的数据可以做预处理,每天处理一次,存在一个表里面,出报表的时候就从这里面查找数据。
对于数据量大的表预处理很重要很重要,sql优化很重要。 |
|
返回顶楼 | |
发表时间:2008-05-06
neora 写道
以我的经验谈谈我的个人看法:
1、首先,积累了30年的数据库数据量想必大得惊人。如果你的应用需要频繁的查询数千万的数据,那么必须在适当的地方采用存储过程来表现业务逻辑,尽量利用数据库自身的能力来完成复合的数据查找、比较和筛选。商用数据库本身在这方面的处理是非常强劲而稳定的。其数据处理能力是Java虚拟机所无法比拟的(无论你用任何框架,写出任何出色的代码)。 2、尽量保持由存储过程处理完毕后的数据量在较小的范围内,缩减到“数万”这个级别,然后再交给Java虚拟机来完成其他的业务逻辑。 3、你觉得参杂了存储过程会让你们的代码不够OO,但这样的程序稳定性会高出许多。 4、完全采用Hibernate这种小玩意儿来做海量规模的数据处理绝对是下下策,我见过的所有完全采用Hibernate的电信级计费系统无一例外都是失败案例。至少在可靠性和鲁棒性上极其脆弱。我所经历的基于存储过程的案例几乎都是非常成功的。 5、我不是说Hibernate不好,事实上它在做Web应用中非常非常出色。但不适合将所有的数据逻辑都交给它。把很“搞人脑袋”的逻辑交给Hibernate,把很“搞CPU”的交给存储过程。 6、使用Hibernate的时候,切忌此类简单用法:将要处理的数据全部从数据库中以Active状态捞到JVM,指望让JVM来完成所有工作。有时候,你一不小心,就会这么做。 7、方案,存储过程+Hibernate 个人看法。
赞成楼上观点。 尽量使用数据库的特性完成任务,而不是jvm。如果想用jvm来做大批量数据筛选是不可取的,会生成很多对象,到时jvm回收的时候也麻烦,还是引起频繁的回收。没必要非要把程序设计成多平台(操作系统和数据库)可移植,说白了那是一种骗人的东西,我们只能往上面靠拢,如果数据库提供了好的解决方案还是建议用数据库的功能。 对于大的项目不太可能会考虑数据库移植的,一般都会一直使用一家公司的数据库。
|
|
返回顶楼 | |
发表时间:2008-05-06
neora 写道 以我的经验谈谈我的个人看法:
1、首先,积累了30年的数据库数据量想必大得惊人。如果你的应用需要频繁的查询数千万的数据,那么必须在适当的地方采用存储过程来表现业务逻辑,尽量利用数据库自身的能力来完成复合的数据查找、比较和筛选。商用数据库本身在这方面的处理是非常强劲而稳定的。其数据处理能力是Java虚拟机所无法比拟的(无论你用任何框架,写出任何出色的代码)。 2、尽量保持由存储过程处理完毕后的数据量在较小的范围内,缩减到“数万”这个级别,然后再交给Java虚拟机来完成其他的业务逻辑。 3、你觉得参杂了存储过程会让你们的代码不够OO,但这样的程序稳定性会高出许多。 4、完全采用Hibernate这种小玩意儿来做海量规模的数据处理绝对是下下策,我见过的所有完全采用Hibernate的电信级计费系统无一例外都是失败案例。至少在可靠性和鲁棒性上极其脆弱。我所经历的基于存储过程的案例几乎都是非常成功的。 5、我不是说Hibernate不好,事实上它在做Web应用中非常非常出色。但不适合将所有的数据逻辑都交给它。把很“搞人脑袋”的逻辑交给Hibernate,把很“搞CPU”的交给存储过程。 6、使用Hibernate的时候,切忌此类简单用法:将要处理的数据全部从数据库中以Active状态捞到JVM,指望让JVM来完成所有工作。有时候,你一不小心,就会这么做。 7、方案,存储过程+Hibernate 个人看法。 赞同你的想法!!对数据库进行复杂的查询,用存储过程,性能会有提高!毕竟商家的数据库性能想对我们的程序来说很稳定,很有效率的!!交给数据库处理能提高效率!!至于存储过程我个人经验告诉我!!采用Ibatis还是比较优秀的!! |
|
返回顶楼 | |
发表时间:2008-05-06
zq0459 写道 1.原有系统大约有200多张表,冗余表很多。在抽象数据模型时,我在考虑一部分采用原有的数据模型,另一部分将根据业务需要自己创建数据模型。
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; } 1.内存溢出,先看JVM是不是设得太小了,建议256-1500MB,Hibernate一级缓存放不下了。 2.10万条数据全取的hibernate不是这么写的,如果楼主对Hibernate再花点时间看看书,夏昕的《深入浅出Hibernate》推荐,如果要上JDK1.5,再看一本Hibernate实战第2版(翻译得不太好,入门的人不要看)。 10万条数据你需要一次性取出么?设计需求就有问题吧,应该加分页条件的吧,不加分页条件有什么实际价值? 如果一定要取出,一定要给出需求,我给你方案。 3.Hibernate对SQL的支持我认为比iBatis好,还是看你Hibernate功力如何,ORM善加利用,开发效率和执行效率都是超过其他方案的,存储过程不算,存储过程要单独讨论的。如果是10万条记录的库以上这些框架根本不是问题,又不是100亿条数据。 |
|
返回顶楼 | |
发表时间:2008-05-06
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、可以考虑,如果原来没有存储过程的话,需求中又有类似电信计费这种,你又熟悉存储过程的话,建议如此。 |
|
返回顶楼 | |