您的位置:首页 > 电脑网络 > 互联网 > 在雅虎全球的技术体系中

在雅虎全球的技术体系中

luyued 发布于 2011-05-22 00:29   浏览 N 次  

   server.xml中Web应用和数据源.在server.xml中加入以下的配置描述.

  例程1 配置web应用

  

  

  

  

  factory

  org.apachewww.68vp.commons.dbcp.BasicDataSour ceFactory

  

  

  driverClassName

  org.gjt.mm.mysql.Driver

  

  

  url

  jdbc:mysql:///test

  

  

  username

  root

  

  

  password

  

  

  

  maxActive

  20

  

  

  maxIdle

  10

  

  

  maxWait

  -1

  

  

  

  在这里,配置了一个名为hibernate的Web利用喎湾挂欺分并且配置了一个数据源,数据源的JNDI名称为jdbc/hibernate.你须要依据情形修正数据源的链接属性.

  6、下一步就是书写Hibernate的配置描述符.可以使用XML的配置描述,也可以使用基于属性的配置描述.在这里使用基于XML的配置描述.在hibernate\WEB-INF\classes目录下新建一个hibernate.cfg.xml文件.然后加入例程2所示的内容.

  

  PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"

  "

  

  

  java:/myData Source

  java:comp/env/jdbc/hib ernate

  false

  net.sf.hibernate.dialect.MySQLDialec t //对应数据库方言

  

  

  

  注意connection.datasource属性必须和server.xml中配置的数据源的属性一样.如果不是使用MYSQL,那么需要更改dialect属性.

  Jndi连接

  必要前提:

  将mysql-connector-java-3.1.10-bin.jar放到tomcat目录commons/lib下面.这样,当tomcat启动时就可以加载相应的驱动程序.

  第一、请求web容器(tomcat)里面的conf目录下面的servlet 里面配置节点:

  在server.xml中配置全局数据源:

  在下面增添:

  

  第二、、要求web容器(tomcat)里面的conf目录下面的

  在context.xml中为增长子元素:

  

  再配置好的context.xml 拷入项目中WebRoot下的META-INF中.

  第三、在hibernate.cfg.xml配置文件中配置如下:

  第四、相干java代码如下:

  <%@page import="javax.naming.Context"%>

  <%@page import="javax.sql.DataSource"%>

  <%@page import="java.sql.Connection"%>

  <%@page import="javax.naming.InitialContext"%>

  Context context=new InitialContext();

  DataSource dataSource=(DataSource)context.lookup("java:comp/e nv/jdbc/test");

  Connection conn=dataSource.getConnection();

  Hibernate的JNDI名称绑定剖析

  Hibernate的JNDI名称绑定是在net.sf.hibernate.impl.SessionFactoryObjectFactory程序里面实现的,我来分析一下Hibernate的绑定JNDI的过程:

  我们获得SessionFactory正常是这样写代码:

  Configuration conf = new Configuration().addClass(Cat.class);

  SessionFactory sf = conf.buildSessionFactory();

  首先是new Configuration()创建一个Configuration,在这个结构器里面进行配置文件(hibernate.properties)的读取工作,然后保留到一个Properties对象里面去,和JNDI相关的是这个属性:

  hibernate.session_factory_name hibernate/session_factory

  接着调用buildSessionFactory()方法,总是含有许多没有完全烧化的煤炭,该方法检讨一下配相信息,然后调用SessionFactoryImpl的一个构造器.在构造器里面注意下面两行代码:

  name = properties.getProperty(Environment.SESSION_FACTORY _NAME);

  SessionFactoryObjectFactory.addInstance(uuid, name, this, properties);

  调用了SessionFactoryObjectFactory的addInstance方法,并且把自身(SessionFactory的实例)作为参数传递.最后在addInstance方法可以看到如下代码:

  Context ctx = NamingHelper.getInitialContext(properties);

  NamingHelper.bind(ctx, name, instance);

  instance 就是SessionFactory的实例,通过读源代码,可以明白的看到Hibernate是在conf.buildSessionFactory()的时候通过一系列类办法调用,把创建的SessionFactory实例绑定到配置文件(hibernate.properties)中hibernate.session_factory_name属性指定的名称上的,因此可见Hibernate本身是存在JNDI的动态绑定功能的.但是Hibernate需要失掉一个SessionFactory实例用于绑定,而这个SessionFactory实例需要我们写代码进行预先创建,并且必须保证该过程要在所有其它要从JNDI上取得SessionFactory实例的程序之前完成.

  因而对任何App Server来说,咱们都不用去管JNDI名称的绑定进程,只要要保障预先创建一个SessionFactory实例出来就够了,剩下的工作 Hibernate会做的.那么如何确保预创立SessionFactory实例呢,假如是Servlet,能够配置一个初始化的Servlet,只有把

  Configuration conf = new Configuration().addClass(Cat.class);

  SessionFactory sf = conf.buildSessionFactory();

  这样的代码加进去就可以了.如果是包括EJB的的庞杂的J2EE运用,可能需要依附App Server的功能来保证预创建SessionFactory实例. 美国参众两院没有权利大小之分,只是权利不同罢了. 众议院是根据国民人数组成的,众议员代表着选民的利益,所以人口多的州众议员也多,表决的上风也就多. 参议院是来自各州的,每州两人,总数一百人,参议员代表着各州的利益.美国所有的政策法规提案都是由众议院起草并通过,而后提交参议院审核.参议院只能表决通过或是不通过,但不能对提案进行修改. 这样的权力分工的目标是: 任何提案都是为了公民的利益,但不能因人口多的州,而侵害到人口少的州的利益. 所以众议院为了让提案在参议院可能顺利通过,在草拟提案是就必需考虑到各州的利益,一旦参议院通过,就最后交给总统同意履行. 总统则代表着全部国度的好处,他可以有权否认提案.以往美国有良多提案出笼,但都在参议院被挡了下来,感到上是参议院的权利大于众议院,其实未必,因为参议院没有制订提案的权利.中国雅虎最好的一个地方就是它和 Yahoo 寰球共享统一个技术平台,那是一个有十几年历史的技术平台.Yahoo 的技术文化不如 Google 的工程师文化那么著名,但Yahoo 在相称长的一段时间内都是互联网的旗号,吸引了全球大批的技术牛人参加,Yahoo 的技术平台就是他们的知识、经验和血汗与日俱增的结果.尽管阿里巴巴收购了中国雅虎,但是在技术方面并没有对中国雅虎做出太大的改造(幸好没有改革),所以就工程师来说,每天更多接触到的还是 Yahoo 的东西,而不是阿里巴巴的东西,对我影响最大的也恰是这些东西.一、Linux 和开源文化之前一个中国雅虎的同事,他是工作了几年之后才来中国雅虎,有一次他说:"雅虎是我见过的最尊重 Linux 的一家公司".什么叫做尊敬 Linux 呢?不是在服务器上装个 Linux 跑Apache 就叫做尊重 Linux .在雅虎很多同事日常都使用 Linux 操作体系办公,即便有一些人使用 Windows, 也都是使用 pietty 或者 Xshell 等工具远程衔接到开发机器上使用 VIM 做开发.不仅是日常工作,在雅虎全球的技术体制中,产品的上线和发布也都鉴戒了 Linux 包管理的方法:所有的产品都会被打成包放在一个专门的服务器上,产品的部署和进级就变成了简单的装包操作,相对不会出现最后上线的时候文件门路犯错等初级问题.Yahoo 的技术平台是深深扎根于 Linux 跟开源文化的.大型互联网公司普通都会使用开源的产品,同时也向社区贡献代码.Google 和Facebook 常常将自己研发的成熟产品开源,Yahoo 当然也不例外.而且 Yahoo 不仅仅给社区奉献代码,它在设计方面也拥抱了开源文明,将多年研讨总结的设计模式库共享了出来.在Yahoo 内部,很多代码都是寄存在 CVS 里面的,并没有制约读的权限,任何员工都可以查看里面的代码,这对于那些小团队内部代码都不敢共享防员工如防贼的公司来说应该长短常不堪设想的.另外, Yahoo 的工程师也常常出现在各种技术会议上,分享自己名目的架构、流程和经验.虽然这些更多都是 Yahoo 全球技术团队做的事情,但是对于他们那种开放共享的精力我们是非常认同并且憧憬的,你会认为做一个工程师很骄傲,而不会感到自己是民工、做技术没前程.这种认同感和成绩感乍看上去没什么,但实际上它决定了你对技术的追乞降立场,也会影响你当前在职业上的抉择.二、浓重的技术氛围虽然2008年的时候中国雅虎已经被折腾得快不像样了(这点后面细说),不过那个时候仍是有浓厚的技术氛围的.让我印象深入的一件事情是 Google Chrome 浏览器刚宣布的时候,大家都立即下载下来使用,但因为公司内网的一些问题无奈翻开网页.当我正盘算把 Chrome 卸载了的时候,突然发现公司邮件列表里面已经有人发邮件给出了详细的解决计划.从这件小事可以看出公司大部分工程师都不是那种只晓得实现工作的人,而是随时关注新技术和业界动态的人.当时中国雅虎还是有很多牛人没有离开,大家也喜欢在邮件列表里面念叨技术,时常能看到出色的探讨和解答.最让我高兴的是,无论我碰到什么技巧问题都不必张皇,即使无法 Google 到谜底也可以从同事那里获取到辅助,而且大家也乐意答复技术问题,这对于我这样一个基本很差技术又烂的菜鸟来说真是天大的福分.中国雅虎还有做技术分享的文化,如果有哪位同事想要分享一下最近学习到的技术,就可以自己预订一个会议室然后向所有的工程师发送会议邀请,有时候还会有一系列非常系统的课程,我就参加过长达十多少个课时的 UED 培训,完全转变了我对 Web Develop 的意识.很多公司应该都激励员工做技术分享,但在中国雅虎简直每次技术分享都会把会议室坐的满满当当,可见大部分工程师都还是想要一直进步自己的技术才能.直到分开雅虎之后我才清楚这种广泛的学习热忱有如许难得.我想,业界之所以到处传播着"程序员做到30岁最好转治理"之类的忠告,应当就是因为大部门公司都缺少这种良好的技术气氛吧.三、庞大的常识库入职的前几天,我天天的工作就是看文档,不是相似"PHP技术手册"那种文档,而是一些 Yahoo 内部的工具手册.Yahoo 内部的文档非常齐全和详细,光是 Yinst 这款工具的应用手册就长达几十页.Yahoo 内部是用 Twiki 做知识管理的,这个知识库经由十多年的积累已经异常宏大,从入门到提高,从PHP 到C,从前端到后端……包罗万象,而且几乎 Yahoo 全球所有子公司的技术资料都是开放阅读的,没有任何乌七八糟的权限设置和保密限度.有这么一个宝藏在,再加上好的学习氛围,如果你想要提高自己的能力的话,老是可以提高.当初我想从 PHP 工程师转做 Web Developer 的时候,就先把 Twiki 上UED 部分的所有资料看了一遍,受益匪浅.海内大局部互联网公司都是没有太多技术积聚的,因为大部分产品的开发都只追求开发速度,并不会特别追求技术上的极致,就更不要提文档这种东西了.也正因为如此,从中国雅虎出来看到其它公司的知识库的时候总有不外瘾的感觉,可能也只有像 Google, 微软和 Facebook 这样的公司才会有像 Yahoo 那样的知识库吧.在和之前一些同事吃饭聊天的时候,大家也总是会悼念那个无所不包完全开放的 Twiki ,似乎少了一个忠诚的友人一样.我们由衷地尊敬那些在完成工作之余还乐意总结项目教训并花时间写 Twiki 的工程师们.四、完善的流程第一次参加项目开发的时候,我的 Leader 领了一个 MM 过来说:"这位是项目的 QA 负责人",我当时愣了一下:"呃…… QA 是做什么的?" 尽管在大学里我也在试验室做过一些项目,但那些项目基本上都是我自己负责所有的事情,完整不分工和流程的概念,所以也不知道 QA 是负责产品测试工作的.进入中国雅虎之后,我才第一次接触到贸易产品的开发流程,不过因为那个时候中国雅虎已经半死不活,我也没有受到有关流程的入职培训,甚至于在做了好几个项目之后才真正熟悉了完整的流程.中国雅虎的开发流程因循了 Yahoo 的开发流程,乍看之下很平凡,对于已经熟习的工程师来说还显得单调,但后来我特别留意了这套流程之后,十分惊疑于它的谨严和高效,所以这里要详细阐明一下.Yahoo 的内部生产线分为三个彼此独立的环境:开发环境、测试环境和生产环境(即线上环境).这三个环境固然独破,但它们的配置都会尽量坚持一致,这样就可以保证开发完成的产品不会因为环境不同而出现问题.在开发的时候,我们会在开发环境中搭建虚构环境,开发完毕之后开发工程师会本人在虚拟环境里面测试,保证没有大的问题,然后就会把所有相关文件打包上传到雅虎全球同一放置产品包的处所.上传完毕之后,就会发邮件告诉 QA 部门相关职员,邮件内容里面要写明产品在测试环境的部署步骤:需要装置哪些包、是否需要修改数据库等等.然后 QA 就会开端测试,如果发现 BUG 就会写到 Bugzilla 中,指派给相应的开发工程师,开发工程师就会在开发环境中定位BUG并修改,修正一些BUG之后就会再次打包升级产品的版本,而后QA 会将新的软件包部署到测试环境验证之前的 BUG 并讲演新的 BUG .整个测试过程中可能要发布好多个版本,直到所有 BUG 被修正为止.修正完毕所有的 BUG 之后,开发工程师就会填写上线申请,Ops 看到申请之后就会部署一个时间把产品部署到生产环境.个别来说,出产环境不止会有一台机器,所以 Ops 会先从生产环境摘下一台机器部署,部署完毕之后会告诉 QA 和开发工程师,然后 QA 和开发工程师就会修改 Hosts 文件,配置域名指向那台机器进行线上的测试,如果测试没有问题,那么就会把软件包安排到生产环境中所有的机器上,完成上线;否则就进行回滚,撤消这次上线,也不会影响到线上的用户.整个流程大略就是这样,但是要特殊留神的是以下几点:1. 开发工程师只能接触开发环境.他所能做的就是在开发环境中开发、改BUG 和打包上传.如果他去测试环境中修改 BUG,就很有可能忘却修改开发环境中的相应代码,这可能会导致产品测试通过但是上线之后却发现大的问题. 2. 产品"封版"之后就不可以做任何改动,如果有修改,即使只改动了一点所有功效也要从新测试一遍.所有的 BUG 都修改结束之后的那个版本就会进行"封版",那就标记着这个产品随时可以筹备上线了.如果然的发明了新的 BUG 要修改的话,那么修改之后就需要重新打包重新走一遍完全的测试流程,只有这样能力够保证就算修改代码过程中引入了新的 BUG 也不会被漏掉. 3. 上线手册要详细.开发工程师要具体写明每一个步骤,不只是解释性的文字,还要把详细的安装和修改命令完整地放上去,如果写得好的话,那么 Ops 的共事只需要把上线手册里面的命令逐行复制到服务器上运行就可以完成上线.这样的流程有什么利益呢? 首先,它最大地下降了上线危险.由于开发工程师不能接触到测试环境,只能打包让QA测试,所以完整经过测试的产品上线之后根本不会有什么问题,况且上线的时候我们也要先部署到一台机器长进行测试之后才会决议是否上线,即使上线不成功也可以在不影响用户的情况下回滚.中国雅虎的上线极少会涌现问题,许多时候我们上线到深夜只是因为那个时间段用户拜访量最小,而不是说焦头烂额地忙活几个小时始终到半夜才上线胜利.其次,它使得各个部门职责明显.开发工程师和 QA 通过 Bugzilla 沟通,和Ops 通过上线手册沟通,因为沟通渠道独一而且清晰,所以就可以完全义务到人,出了问题也很轻易定位到详细环节.比方说,如果产品测试通过之后在上线的时候呈现了问题,那么基础就可以断定是 Ops 操作失误或者上线手册没有写好.职责清楚之后很多事情也变得有条理,大家就可以各司其职、专一本职工作并且配合高兴,开会的时候也可以明白知道需要哪些人加入.完美、清楚的流程从基本上解决了一些问题,创建了一个非常好的环境,http://www.00cg.info,这样我们就可以把心理都放在如何开发和测试上面,而不用担忧诸如"如何上线才干不出错"等琐碎的事情.所以只管中国雅虎的高层那么不靠谱,我工作得还是很开心,因为这个流程保证了管理层再怎么乱开发也不会乱.记得那时候很喜欢改 BUG ,有时候改得崛起会把之前版本遗留的 miss BUG 一并改掉,加班也是颇有兴趣,不是很能明确为什么网上大部分程序员厌恶加班讨厌得要逝世.当初我明白了.五、自动化工具工欲善其事,必先利其器.如果没有那么多好用的主动化工具,那么 Yahoo 的流程就不可能如斯完善.Yahoo 内部有很多无比好用的工具,而且这些工具都有非常齐全的文档,也可以在 Twiki 上找到不少相关材料.这些工具之所以在 Yahoo 会起到那么大的作用,是因为 Yahoo 全球所有的技术团队都在使用它们,Yahoo 所有的服务器上也是默认安装了这些工具.这些工具就构成了一套全球 Yahoo 工程师通用的话语系统,可以设想它们赞助 Yahoo 节俭了多少沟通本钱.由于斟酌到服务器的保险问题,Yahoo 的这些工具的使用方式是对外保密的,这里我只简略说一下 Yinst 这款工具的强盛.如果要把软件包 example_1_1_0.tar.gz 部署到 a1.yahoowww.68vp.com ~ a10.yahoowww.68vp.com ,那么只需要下面这样一行命令:yinst install example_1_1_0.tar.gz -h a[1-10].yahoowww.68vp.com就可以完成整个上线过程.由于好奇的缘故,在上线的时候我比拟爱好跑到 Ops 那边看他们是如何操作的,然后发现其实他们在上线过程中执行的命令很少.因为工具好用,所以产品极少因为 Ops 这个环节出现问题,上线就变成一件比较轻松的事情.中国雅虎的产品和业务确切不好,搜寻不如百度,消息不如三大门户,"雅虎助手"是人人皆知的流氓软件,邮箱也出过丑闻,而且被 Gmail 和QQ 邮箱远远抛在后面.中国雅虎最广为人知的也都是这些不光荣的事件,但这里我想让很多人知道,对于一个对技术还有寻求的工程师来说,当时的中国雅虎真的是一个很好的工作环境.至少对于我自己来讲,我从 Yahoo 学到了太多太多的好东西,而且这些货色还只是 Yahoo 精髓中的一小部分,如果不是阿里巴巴团体策略调剂,我必定会在中国雅虎多呆两年.编者后记:原文后面还有很长的篇幅讲述中国雅虎的死亡,如果感兴致,可以到原文观看:现在我们说起互联网公司、世界一流的运维技术,想到的大多是Google、Facebook,以及阿里巴巴等;然而真正懂得才发现,老牌的互联网企业的技术文化,的确有其独到之处.现在国内把互联网仅仅当作工具的环境,对于技术人而言确实是极大的悲痛.平心而论,绝对于国内大多数企业而言,实在阿里巴巴在技术文化的营造上做的已经好很多了.整个市场环境的改变,一个尊重技术的大环境,还需要很长时间来培育.爱因斯坦相对论描写重力对时光流逝的影响,推断时间流逝速度取决于人所处地位:时钟间隔重力源越远,运行越快;反之,越凑近重...

广告赞助商