论坛首页 Java企业应用论坛

刚有人问面试题咋答,一时兴起回了下,关于对 Struts2, Spring 和 Hibernate 的理解

浏览 27564 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-01-13  
yongjie_2008_java 写道
不知道楼主做过管理没有,我个人感觉现在软件行业最大的危机不是系统效率的快慢而是人员流动造成的项目不能按时交付,项目后期维护困难等问题,尤其是中小型公司人员流动非常频繁,一个软件做下来有可能只剩一两个老人,后期维护更是问题,像楼主所说的不使用框架效率确实提高了,但是开发周期恐怕会更长,新人对项目的熟悉时间会更慢,后期维护成本会更高,项目成本可能会成倍增加。而ssh尤其是spring框架正好可以很好的缓解这个问题,spring对bean的工程化管理让项目更加易于管理,而且这个规范可以让很多没有楼主强大的新人能快速适应到项目中来。不是每个人都像楼主这么强大,更多的程序员尤其是现在的程序员都是速成的,没有很深的造诣和扎实的基础,正是软件的工程化管理让软件行业在现在尤其是中国这个国度能快速发展。正如一位高人曾言,软件工程的终极目标就是消灭程序员。所以我个人感觉ssh框架的使用对效率的考虑少一点,更多的是在软件项目工程化管理方面所带来的巨大优势。
本人也是程序员,如果哪些地方说的有问题请轻拍...


软件工程的终极目的就是消灭程序员这点最早在人月神话里,说50年代时就有的设想,为什么到现在还是实现不了呢
0 请登录后投票
   发表时间:2013-01-22  
Surmounting 写道
zouruixin 写道
楼主这是忽悠应届生用的吧 什么切片什么提纯什么的词汇不仅不能说明问题 只能误导
ssh的根本作用你并不了解 性能也不等于架构的全部  包括所有用反射的框架 其实本身的性能开销在目前外网集群分布式环境基本可以忽略不计了   而且你提出的那些概念别说一个应届生  工作几年的人看了也不明所以, 简直是空中楼阁的幻想   现在所谓失败的架构思路共通的特点就是 -- 阳春白雪空中楼阁 让人不知所云


因为……因为我本身就是特别抵制乱用名词的人,所以一看你的回复我愣了好几秒。然后打开自己的原文,搜索“切片”和“提纯”……
  切片那边,我不是说了吗,“方法执行前、后的监视”,这个东西叫切片。你看,我这篇帖子的出发点,是如果面试的人问我这个问题,我会咋回答。其实我现在如果找工作,就会直接去跟老板谈,说我的网络技术和成型程序方案,能够给企业带来什么(小公司),或者说我从以前的什么经历能说明我可以完成什么岗位(大公司)——已经不用再回答这种很多人都知道(非独有)的技术问题了。
  提纯是我自己乱用词了,我承认错误……我的原意是,服务器和浏览器 JavaScript 程序的交互,传输的是数据,不应该是数据 + 界面。所谓提纯,就是把界面部分删了,只保留数据。确实是我没说清楚。

好歹我也是随着大家一起用 Struts1 2,Spring2 3(看了源代码)以及 Hibernate 出身的。我自己也写过自己的对象-关系映射器,用在数字政通全国一百多个城市的项目里。我自己现在也编写了自由软件用来处理网络纷发,用在几个百万用户级的游戏服务器上。作为一个从使用到弃用即时反射框架的人,我自己的东西也用反射,但我就是认为即时反射是一种没必要且低速的技术,就是觉得应该使用“预反射”方式,形成 Map<名字, 对象> 来管理框架中加载的东西。这就是我抵制泛滥使用 Spring + Struts + Hibernate 的原因。但是我在被问到“谈谈你对它们的理解”这个问题时,肯定不会说这么多。如果我的哪句话引起了面试官的兴趣,说明那是 ta 擅长的方面,我可以在那个方面专门跟 ta 讨论。

你如果真的在组织使用集群,就会知道,负载均衡形式的服务器集群,只能分摊负载压力,不能够提高某一次请求自身的响应速度。也就是说,如果全场就一个请求,还是需要 3 秒钟才能完成响应,那么不管用不用集群,都不可能更快。用集群的好处是,当 5 万人一起请求的时候,合适的集群能防止响应时间比 3 秒慢太多,并且不至于宕机。

你看,我这不是在模拟一个面试官问我话的场景吗,没准备把这个东西当做给应届生的讲解。而且应届生水平也是参差不齐,并不是都什么也不会的。

感谢讨论……虽然我有一种在被你指责的感觉……   T T

----------------------------------------------------------------------
反射在一个中小型程序应用没什么问题,速度也不再那几秒。ssh的作用是简化编程。是一个必然的过程。很 多设计模式都用到反射。java在反射上是个成功也是个极大的失败。个人理解jvm应该对反射进行一次重新设计像lz说的那样,classLoader 是不是可以缓存下反射类,或者类似注解之类的方式。在程序中申明下,申明加快速度。因为你的api或者程序设计根本没告诉程序员反射到底有多慢(数据+原理)。
这造成了很多东西只能靠经验
0 请登录后投票
   发表时间:2013-01-22   最后修改:2013-01-22
Class实例本来就缓存Method Field的。。。不知道你们在讨论什么极大失败
而且这个缓存为了虚拟机内存考虑,还用了软引用,真以为写JDK的人也是随随便便做项目啊
0 请登录后投票
   发表时间:2013-01-22  
Shen.Yiyang 写道
Class实例本来就缓存Method Field的。。。不知道你们在讨论什么极大失败
而且这个缓存为了虚拟机内存考虑,还用了软引用,真以为写JDK的人也是随随便便做项目啊

-------------
学艺不精 见笑
0 请登录后投票
   发表时间:2013-03-27  
suene 写道
Surmounting 写道

有的时候觉得,作为一个程序工作者,咱们存在的意义,很大一部分,不就是争那 10ms 吗……当然这话我不能说出来,否则容易挨骂。   :-P
  好了,言归正传。其实时代已经进步了。现在追求开发效率的东西,有 JavaPlay ,有 Python ,有 Ruby + Rails ,都比 Spring + Struts + Hibernate 快速很多。现在都在用 Java 只是传统所致。而 Java 在执行效率上,能达到 C++ 90% 的速度,这已经非常强悍了,是未优化机器码程序 81% 的速度(这取自于传说,C++ 执行效率是 C 的 90%),非常之快速。我和同事做过实验,同样数据规模,用 Python 做排序和定位插入,执行速度比 Java 慢 70% 。

在这种背景下,一个需要运行速度同时逻辑又有些复杂的民用项目,为什么不应该选用 Java 呢?

话说……貌似电信通的宽带,比联通、电信要便宜很多啊……

"争那 10ms" 这个我也不否认,但这10ms不是框架带来的.框架带来的是开发成本降低.

各种语言快慢的问题,我觉得这是个大坑,不去讨论,

貌似貌似,我没说不用java啊.只是说在例如套接字编程方面,貌似国内没什么用java的,
而争毫秒的需求一般是网络通讯或者操作硬件的.so.........
但一般来说 java 开发维护成本比 c 便宜.

电信通是神马?  我在深圳,我是去看香港的, 99元 100M 的光线后震到了.呵呵,你懂得.

强烈鄙视国内运营商的暴力以及刻意的拒绝互联互通。不过鄙视了是不是也没用,因为除了他们没别的可用……

我最近在掌趣科技,一个游戏公司。他们这边原先一台服务器如果用 Java 做,Socket ,每台标配硬件(16GB 内存,双四核 CPU ,Raid5 或者没有阵列的高速硬盘),才能承载 2500 左右在线用户。怪不得都不用 Java ……一问,都是各种框架,然后受到线程数量影响。而又不做线程数据量的互转。我自己试了下,如果自己调配线程连接,4GB 内存都用不了,大概一共 4-5 个核,就能承受 4000+ 的连接了。
0 请登录后投票
   发表时间:2013-03-27  
Surmounting 写道
suene 写道
Surmounting 写道

有的时候觉得,作为一个程序工作者,咱们存在的意义,很大一部分,不就是争那 10ms 吗……当然这话我不能说出来,否则容易挨骂。   :-P
  好了,言归正传。其实时代已经进步了。现在追求开发效率的东西,有 JavaPlay ,有 Python ,有 Ruby + Rails ,都比 Spring + Struts + Hibernate 快速很多。现在都在用 Java 只是传统所致。而 Java 在执行效率上,能达到 C++ 90% 的速度,这已经非常强悍了,是未优化机器码程序 81% 的速度(这取自于传说,C++ 执行效率是 C 的 90%),非常之快速。我和同事做过实验,同样数据规模,用 Python 做排序和定位插入,执行速度比 Java 慢 70% 。

在这种背景下,一个需要运行速度同时逻辑又有些复杂的民用项目,为什么不应该选用 Java 呢?

话说……貌似电信通的宽带,比联通、电信要便宜很多啊……

"争那 10ms" 这个我也不否认,但这10ms不是框架带来的.框架带来的是开发成本降低.

各种语言快慢的问题,我觉得这是个大坑,不去讨论,

貌似貌似,我没说不用java啊.只是说在例如套接字编程方面,貌似国内没什么用java的,
而争毫秒的需求一般是网络通讯或者操作硬件的.so.........
但一般来说 java 开发维护成本比 c 便宜.

电信通是神马?  我在深圳,我是去看香港的, 99元 100M 的光线后震到了.呵呵,你懂得.

强烈鄙视国内运营商的暴力以及刻意的拒绝互联互通。不过鄙视了是不是也没用,因为除了他们没别的可用……

我最近在掌趣科技,一个游戏公司。他们这边原先一台服务器如果用 Java 做,Socket ,每台标配硬件(16GB 内存,双四核 CPU ,Raid5 或者没有阵列的高速硬盘),才能承载 2500 左右在线用户。怪不得都不用 Java ……一问,都是各种框架,然后受到线程数量影响。而又不做线程数据量的互转。我自己试了下,如果自己调配线程连接,4GB 内存都用不了,大概一共 4-5 个核,就能承受 4000+ 的连接了。



用啥比较号好?
0 请登录后投票
   发表时间:2013-03-28  
dacoolbaby 写道
Surmounting 写道
ansjsun 写道
这么做到不失为一个办法..但是注意几个地方...
1.map中存在的key和类中的字段冲突
2.一个人的项目数据库字段随便增删.人多了就不好了

其他没什么了呵呵..我也用过..类似的方式..不过没做具体封装...你可以考虑抽象类的方式..这样就又能重用点...反正map中的尽量表现在展示层..少参与业务逻辑..否则出错了..不好找错误..比如.你把字段名称改了.map没有及时更改..出错了也许也发现不了


所以说,这样的程序就变得依赖文档和注释。使用程序的时候,就需要更新相关数据的文档,以及在这个类中添加有关注释。很多人可能会懒得做这个事情,就会遗留要命的后果……

  不敢使用 ALTER TABLE 来加字段的,不然数据库磁盘结构大调整,上十万行的表就得等着假宕机很长时间…如果需要复用,应该是类似类型的数据吧…… 我其实觉得不应该让数据库和数据进行绑定。关系-对象转换,我觉得可以考虑各种有效的分离方式……我组织的产品都是不存在直接的 表-类 这样的对应关系的。目前看来对开发者从思路中摘除数据库,把核心数据的概念扳回程序这边很有益处,但对编程也没有提供方便。

核心程序放到程序这边?
要考虑很多问题啊,异步的问题,事务的问题,并发的问题。
故障问题,断电等问题呢?

如果不用ALTER TABLE加字段,您说怎么加好呢??

还有,如果你表-类不这样隐射,你的逻辑实体怎么处理?
实体类和数据怎么建立关系?
这样除了NOSQL以外,还没有啥很好的方式了。

如果ALTER TABLE十万级的表就当了,那就是机子的问题了。
我们上千万的表,OLTP库也是怎么搞的。

  我的意思是,核心数据的基础,是程序这边的数据格式。对于 Java 就是 Java 那些个数据类。如果使用关系型数据库来作为主要的持久化内容,那么数据库表应该根据核心数据来制定。而不是针对业务制定数据库表,再用 Java 数据类来表达数据库表。这是一种设计过程的理念问题。因为事实上也许不会使用关系型数据库,而是用键值对数据库。
  现在的几个主流 NoSQL 产品,都是键值对数据库。不过也并不一定非得是键值对。序列化 Java Object 也许是一个可用的方案。我这边之前筹划做一个相关产品,不过工期一直排不上。表-类不映射,但获取数据的时候,可以具体指定通过什么样的方式查出呀。这是 DAO 该有的逻辑,从持久化层取数据,对吧。那么如果是关系型数据库,可以拼 SQL ,当然也可以指定多表关联关系。如果是键值对数据库,可能得从一些大对象中拆分一些内容。

  ALTER TABLE 给大表加列不会造成宕机,但会慢,耗费很多时间。最近到一个别的急赶工项目组帮忙,他们那边很多核心表都不留扩展字段。我个人认为扩展字段 + Dic 是一个还不错的方法,或者干脆不支持加列。功能变更攒多了就可以加表。以前在数字政通,一个做城管的单位,每当需要变动数据库结构的时候,都会是大变动,数据迁移,重新建表。这些都是不 ALTER TABLE 的处理方法。
0 请登录后投票
   发表时间:2013-03-28  
yongjie_2008_java 写道
不知道楼主做过管理没有,我个人感觉现在软件行业最大的危机不是系统效率的快慢而是人员流动造成的项目不能按时交付,项目后期维护困难等问题,尤其是中小型公司人员流动非常频繁,一个软件做下来有可能只剩一两个老人,后期维护更是问题,像楼主所说的不使用框架效率确实提高了,但是开发周期恐怕会更长,新人对项目的熟悉时间会更慢,后期维护成本会更高,项目成本可能会成倍增加。而ssh尤其是spring框架正好可以很好的缓解这个问题,spring对bean的工程化管理让项目更加易于管理,而且这个规范可以让很多没有楼主强大的新人能快速适应到项目中来。不是每个人都像楼主这么强大,更多的程序员尤其是现在的程序员都是速成的,没有很深的造诣和扎实的基础,正是软件的工程化管理让软件行业在现在尤其是中国这个国度能快速发展。正如一位高人曾言,软件工程的终极目标就是消灭程序员。所以我个人感觉ssh框架的使用对效率的考虑少一点,更多的是在软件项目工程化管理方面所带来的巨大优势。
本人也是程序员,如果哪些地方说的有问题请轻拍...

之前经历一些项目,对人员流失对软件产品发展的影响确实有不少感触。不过我现在团队的成员,全部都是通过价值观一致判定招聘来的,都是一些在技术上有不少追求的人,相对稳定一些。我觉得,人员流动不可避免,代代口口相传的普遍现象非常可怕。我这边非常重视分析文档和概要设计文档,事实上维护文档的成本确实很高。算下来大概能有 1/3 在这二种文档上。不过我觉得值,这造成几乎没有翻工,也督促了需求提出者的思考,使得需求变更变少了很多。每次改动,程序都是后改的,文档一定先行。所有改动都得经过二个不同的人审批,大家互相审批,既加强了对别人所做内容的了解,也保证了软件质量。事实上在大家都适应分层工作之后,分工也可以打散,并不太影响工作效率的。

  而且您说得对,程序员大都是速成的。所以我的工作就是天天给大家上课做培训。针对一些具体的问题。毕竟是企业,用不到的内容只能先不管了。我这边的规范非常细致,从代码文本格式,到类名、方法名、变量名的起名原则、定则,到提取方法的粒度以及原因。因为都有比较充分的道理,所以我这边新人来了接受起来并不慢。当然也和他们都很上进有关吧……我觉得工程学最主要的意义,是让过程可控。虽然 CMMI3 所提倡的内容我这边有很多做不到,但 CMMI5 倡导的过程反馈自修正,我这边却能够实现一些。具体来说就是大家对完成进度有评估汇报,并针对结果修改工作方式。
0 请登录后投票
   发表时间:2013-03-28  
Shen.Yiyang 写道
Class实例本来就缓存Method Field的。。。不知道你们在讨论什么极大失败
而且这个缓存为了虚拟机内存考虑,还用了软引用,真以为写JDK的人也是随随便便做项目啊

可能是我无知了……
不过 Spring 执行一个方法,比直接调用执行,慢 700 倍;这个是实测出来的。并且不是一次运行,而是多次。
我现在怀疑其实主要慢可能也不全是反射造成的,而是检查有没有切片。

为了避免记忆错误,我又做了个实验。实验代码如下。我这个类叫 GetAnnounceFunc ,您看,这还是相当公平的。
static public void main(String... arguments) throws Exception
{
	int times = 50000000;
	Class<GetAnnounceFunc> c = GetAnnounceFunc.class;
	GetAnnounceFunc obj = c.newInstance();
	Method m = c.getMethod("getName");
	long start = System.currentTimeMillis();
	for (int index = -1; ++index != times; ) obj.getName();
	System.out.println(System.currentTimeMillis() - start);
	start = System.currentTimeMillis();
	for (int index = -1; ++index != times; ) m.invoke(obj);
	System.out.println(System.currentTimeMillis() - start);
}
public String getName()
{
	return "xp";
}

这在我的开发环境中,测试结果
31
3735
相差了 100+ 倍。
0 请登录后投票
   发表时间:2013-03-28  
Surmounting 写道
Shen.Yiyang 写道
Class实例本来就缓存Method Field的。。。不知道你们在讨论什么极大失败
而且这个缓存为了虚拟机内存考虑,还用了软引用,真以为写JDK的人也是随随便便做项目啊

可能是我无知了……
不过 Spring 执行一个方法,比直接调用执行,慢 700 倍;这个是实测出来的。并且不是一次运行,而是多次。
我现在怀疑其实主要慢可能也不全是反射造成的,而是检查有没有切片。

为了避免记忆错误,我又做了个实验。实验代码如下。我这个类叫 GetAnnounceFunc ,您看,这还是相当公平的。
static public void main(String... arguments) throws Exception
{
	int times = 50000000;
	Class<GetAnnounceFunc> c = GetAnnounceFunc.class;
	GetAnnounceFunc obj = c.newInstance();
	Method m = c.getMethod("getName");
	long start = System.currentTimeMillis();
	for (int index = -1; ++index != times; ) obj.getName();
	System.out.println(System.currentTimeMillis() - start);
	start = System.currentTimeMillis();
	for (int index = -1; ++index != times; ) m.invoke(obj);
	System.out.println(System.currentTimeMillis() - start);
}
public String getName()
{
	return "xp";
}

这在我的开发环境中,测试结果
31
3735
相差了 100+ 倍。


我也是属于不太喜欢框架的,但是感觉你要求稍微有点苛刻了。在你这个例子里面做了一个千万级别的操作,带来的影响是3秒,平摊下来是在一个可以接受的范围内。而且在短时间遇到这样大量的操作还是比较少见的。但是带来的后期的可维护性,却是成倍的提升。

另外,感觉你1楼的回答是有意留了一些包袱,等面试官追问,验证下是不是这样,还我想多了。。
0 请登录后投票
论坛首页 Java企业应用版

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