posts - 38, comments - 2, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

编者按:原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序员,编程经验已超过20年,涉足领域有电子商务、生物技术、房地产、医疗、保险和公用事业。正如乔纳 森在文中所言,本文适合刚毕业的大学生和刚入门的程序员。如果你已是高级开发人员,或许你在本文中看到自己的身影。

从11岁时,我就一直在编程,并且一直都很喜欢技术和编程。这些年来,我积累了一些艰难又容易的经验。作为一名程序员,你或许还没这些经验,但我会把它们献给那些想从中学到更多的朋友。

我会持续更新这些经验,我可能还会有更多的感想,但就我这20年来看,我想下面这个列表中基本不需要增添额外的东西了。下面就是我至今最难忘的经验。

1. 估算解决问题所需要的时间。不要怕,承认吧!我曾见过一些程序员为了解决一个特殊问题而坐在显示器前面8小时。为自己定一个时间限制吧,1小时、30分钟或甚至15分钟。如果在这期间你不能解决问题,那就去寻求帮助,或到网上找答案,而不是尝试去做“超级堆码员”。

2. 编程语言是一种语言,只是一种语言。随着时光推移,只要你理解了一种语言的原理,你会发现各种语言之间的相似之处 。你所选择的语言,你应该觉得“舒服”,并且能够写出有效(而且简洁)的代码。最重要的,让语言去适应项目,反之亦然。

3. 不要过于注重程序的“设计模式”。 有时候,写一个简单的算法,要比引入某种模式更容易。在多数情况下,程序代码应是简单易懂,甚至清洁工也能看懂。

4. 经常备份代码。在我年轻时,我就有过因硬盘故障而丢了大量代码的经历,这经历很恐怖的。只要你一次没有备份,就应当像有着严格的期限,客户明天就需要。此时就该源码/版本控制软件大显身手了。

5. 承认自己并不是最顶尖的程序员 - 知不足。我常想,我对编程了解已足够多,但是总有其他人比你优秀。正所谓,“一山总比一山高”。所以,向他们看齐吧!

6、学习再学习。正如第5点所说,我经常会在手里拿一本计算机或编程相关的杂志或书(不信,可以问我的朋友)。诚然,总有很多你不知道的技术,你可以从中学习以保持不落后。如果你有一种灵巧的方式来获取你需要的新技术,那你每天都应该坚持学习。

7. 永恒的变化你 对待技术/编程知识,就应像你对待股票一样:多样化。不要在某一特定技术上自我感觉良好。如果那种技术或语言已经没有足够支持,那你还不如现在就开始更新 你的简历,并启动培训新计划。我能保持前行的主要原则是什么呢?至少了解两到三种语言,所以,如果某种语言过时了,你在学习新技术的时候还可以依靠另一种 语言。

8. 提携新人。协助并且培养初级/入门的开发人员学习优秀的编程方法和技巧。也许你还不知道,在帮助他们向更高一层前进时,你自己也在向更高一层提升,你会更加自信。

9. 简化算法。代码如恶魔,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。

10. 编写文档。无 论是Web服务的API,还是一个简单的类,你尽量编写相应文档。我曾经引以为豪的代码注释,因过度注释而有人指责。给三行代码加一行注释,只需要你几秒 时间。如果那是一个比较难以理解的技术,千万别担心过多注释。如果你能很好做好自己的工作,大多数架构师、后备程序员、支持组都会感激你。

11. 测试、测试再测试。我是一名黑盒测试粉丝。当你完成编码后,你“被认可”的时候就开始了。如果你们公司有QA部门,如果你的代码中有错误,那你得到的评论,会比项目经理还多。如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。

12. 庆祝每一次成功。我见过很多程序员在解决编程技术难题后,会和同伴握手、击掌或甚至手舞足蹈。每个人在生命中都会碰到“顿悟”。如果一个程序员高兴地跑来叫你去看他的非凡代码,也许你已经看过这样的代码100遍了,但你也应该为了这个家伙而庆祝第101次。(编者注:《庆祝成功的九种方式》。)

13. 经常检查代码。 在公司,你的代码要经常检查(包括自查和其他同事检查)。不要把别人的检查,看成是对代码风格的苛求。应该把它们看作是有建设性的批评。对个人来说,经常检查你的代码并且自问,“我怎样才能写得更好呢?” 这会让你加速你的成长,让你成为一个更优秀的程序员。

14. 回顾你的代码。在 看到自己以前的代码时,通常会有两种方式:“难以至信,这代码是我写的”和“难以至信,这代码是我写的”。第一种往往是厌恶的语气,并在想如何改进它。你 也许会惊叹,旧代码也能复活成为一种更好的程序,甚至是一个完整的产品。第二种通常带着惊奇和成就感。开发人员应该一到两个自己完成的项目成果,能让众人 不禁而立并注目而观的项目。同样,基于你优越的编程能力,你可以把过去的程序或项目拿出来,把它们更新为更加优秀的产品或想法。

15. 幽默是不可缺的。在我20年的开发生涯中,我还没有碰到哪位程序员是没有幽默感的。实际上,干我们这行,幽默是一项必备品。

16. 谨防那些无所不知的程序员,不愿分享的程序员,还有经验不足的程序员。当你遇到这几种程序员时,你自己要谦虚。无所不知的程序员,更想当一个英雄而不是团队成员;保守的程序员则是在编写着他们独享的代码;而经验不足的程序员则会每十分钟就来问你一下,当代码完成后,代码已经是你的,而不是他们。

17. 任何项目都不会那么简单。朋 友、家人和同事曾请求我仓促做一些事情,仓促做一个程序或者网站。对于这样的事,应该从双方做计划,才能做出令两方都会满意的东西。如果某人起初只是需要 一个使用Microsoft Access的、只有有3个页面的网站,但来就很可能变成一个有15个页面的网站,并使用SQL Server,有一个论坛,还有一个定制的CMS(内容管理系统)。

18. 任何时候不要想当然。假如你承接一个简单的项目,你可能会认为某个部分可以轻松完成。千万别这样想!除非你有一个类、组件、或者一段已经写好的代码,并且在现有的项目已经测试通过。不要认为这将是很容易的。

19. 没有已经完成的软件。曾经有一位程序员告诉我,没有软件是已经完成的,它只是“暂时完成了”。这是明智的忠告。如果客户还在使用你写的程序,并经受了时间的考验。如果有机会,你仍在更新它,这并不是什么坏事,这让你不断地前行。

20. 耐心是一种美德。当 客户、朋友或家庭成员用电脑的时候,他们也许会受挫,进而想砸电脑,或气冲冲地离开。我一直在告诉他们,“是你掌控电脑,不是电脑掌控你。”对于用作编程 的电脑,你要有一定的耐心。一旦程序员知道问题所在后,他们就会站在电脑的角度看问题,并且说 “哦,这就是为什么它是这样做。”

编者后话

对本文深有感触!虽然本文没有华丽的辞藻,其中朴实的道理,其实并非只适用程序员,同样可以扩展到其他行业。记得以前练字时,总感觉当时写得很好,但后来回头再看时,也会想“这居然是我写的字!”

在阅读本文的朋友,不知你是否也有看到了自己的身影呢?欢迎你在微博或评论中和大家一起分享感触。


本文是使用 B3log Solocannysquirrel's blog 进行同步发布的

posted @ 2010-11-16 19:32 squirrel 阅读(125) | 评论 (0)编辑 收藏

A java based workflow suite,include engine、designer...

一个java工作流套件,包含引擎、设计器等等。欢迎大家积极报告错误,同时也欢迎大家加入Fireflow。

QQ群号是:200人高级群 80347522(已满)

500人超级群 32897788

官方论坛:www.fireflow.org

Fire Workflow的开发计划

  • 流程模型+引擎:已于2009年2月2日发布预览版本
  • netbeans设计器-模拟器插件:已经发布预览版本。
  • eclipse设计器-模拟器插件:已于2009年2月2日发布预览版本。
  • 图形化流程实例跟踪:即在浏览器中显示流程执行的进度情况,使用SVG技术。尚无明确时间表。
  • 基于Web的流程自定义程序:严格说是对系统已经存在的流程作局部调整,而不是完全的自定义。这个东东是否有必要,怎么实现,正在考虑中。

本文是使用 B3log SoloSolo 示例 进行同步发布的

posted @ 2010-11-15 10:50 squirrel 阅读(115) | 评论 (0)编辑 收藏

A java based workflow suite,include engine、designer...

一个java工作流套件,包含引擎、设计器等等。欢迎大家积极报告错误,同时也欢迎大家加入Fireflow。

QQ群号是:200人高级群 80347522(已满)

500人超级群 32897788

官方论坛:www.fireflow.org

Fire Workflow的开发计划

  • 流程模型+引擎:已于2009年2月2日发布预览版本
  • netbeans设计器-模拟器插件:已经发布预览版本。
  • eclipse设计器-模拟器插件:已于2009年2月2日发布预览版本。
  • 图形化流程实例跟踪:即在浏览器中显示流程执行的进度情况,使用SVG技术。尚无明确时间表。
  • 基于Web的流程自定义程序:严格说是对系统已经存在的流程作局部调整,而不是完全的自定义。这个东东是否有必要,怎么实现,正在考虑中。

本文是使用 B3log SoloSolo 示例 进行同步发布的

posted @ 2010-11-15 10:50 squirrel 阅读(168) | 评论 (0)编辑 收藏

A java based workflow suite,include engine、designer...

一个java工作流套件,包含引擎、设计器等等。欢迎大家积极报告错误,同时也欢迎大家加入Fireflow。

QQ群号是:200人高级群 80347522(已满)

500人超级群 32897788

官方论坛:www.fireflow.org

Fire Workflow的开发计划

  • 流程模型+引擎:已于2009年2月2日发布预览版本
  • netbeans设计器-模拟器插件:已经发布预览版本。
  • eclipse设计器-模拟器插件:已于2009年2月2日发布预览版本。
  • 图形化流程实例跟踪:即在浏览器中显示流程执行的进度情况,使用SVG技术。尚无明确时间表。
  • 基于Web的流程自定义程序:严格说是对系统已经存在的流程作局部调整,而不是完全的自定义。这个东东是否有必要,怎么实现,正在考虑中。

本文是使用 B3log SoloSolo 示例 进行同步发布的

posted @ 2010-11-15 10:50 squirrel 阅读(121) | 评论 (0)编辑 收藏

Google app engine开发JAVA Hello Word

After hearing the buzz about java support in Google App Engine I decided to write a hello, world application and run it on Google App Engine.

在听说GAP 支持java以后,我决定写一个在gap 上运行的java hello world程序。我使用的开发工具是eclipse 3.4,google推出了gap的Eclipse插件,以方便开发者。 

添加EclipseGoogle app engine  plugin

 第一步: 打开eclipse,选择 帮助>软件更新>添加站点。站点的url 是:

1.       http://dl.google.com/eclipse/plugin/3.4  

 

 勾选sdk,plugin,toolkit 可选,点击安装,重启Eclipse等更新完成。 

创建工程 

创建一个新的web application ,点击file >New >project,在对话框中选择google下面的google web application。 

 

 

 指定web应用的名称和包的名称。为了保持应用的简单,不要勾选‘use GWT’ and check ‘,勾选‘Use app engine’,之后点击完成。  

 

 

这样就生产了应用文件,工程结构如下:

 

  

本地运行web应用 

Right click on your application and click on Run as… > Web Application.

右键点击helloword工程,选择Run as… > Web Application.

 

 

 

 

Eclipse将启动web app服务器在端口8080,你可以通过这个url访问应用:

1.       http://localhost:8080/helloworld  

Create a Google App Engine account

创建gap 帐号 

Before you can deploy you hello world application to google app engine, you need to create an account on google app engine.

在你把web应用部署在gap以前,你必须创建一个gap帐号。可以登录http://appengine.google.com/按照步骤创建app帐号。

 首先通过已有的google帐号登录,当你第一次创建app帐号的时间必须通过短消息验证。我们选择 其他国家和地区,手机号码输入:+086 13888886666 (13888886666是你的手机号码,可以接受短信),之后在下一步的验证中输入你的手机收到的验证码。

 

 选择一个唯一的application ID

Application id, 就像登录名字一样必须是唯一的。在操作之前你必须选择一个唯一的id。在你选择application id后,http://<你的 application id>.appspot.com 就是你的应用的地址。

 

 

配置eclipse  applicationapplication id

右键点击 helloworld工程,google >app engine settings。

输入你的application id。也可修改appengine-web.xml中的application标签。

<application>wjjapp</application>  

 

 

 

部署你的appGoogle app engine

 右击 你的应用> Google > Deploy to app engine.输入google帐号名,和密码,点击部署即可。

 

 

完成上面的步骤后,你的web应用就部署到了Google app engine.如果部署失败,收到这样的消息:

java.io.IOException: Error posting to URL: http://appengine.google.com/api/appversion/...  

1.       400 Bad Request  

2.       Invalid runtime specified.  

3.         

4.       Unable to upload app: Error posting to URL: http://appengine.google.com/api/appversion/...  

5.       400 Bad Request  

6.       Invalid runtime specified.  

这是由于你没有访问java version的权限,你可以点击 here申请。

申请成功的话,你将会收到google的mail通知,这个过程一般需要1到2天的时间。Email如下:

 


 

再次尝试部署web应用,这次将会成功,你将看到下面的控制台输出:

1.       Creating staging directory  

2.       Scanning for jsp files.  

3.       Scanning files on local disk.  

4.       Initiating update.  

5.       Cloning 1 static files.  

6.       Cloning 13 application files.  

7.       Uploading 5 files.  

8.       Uploaded 1 files.  

9.       Uploaded 2 files.  

10.   Uploaded 3 files.  

11.   Uploaded 4 files.  

12.   Uploaded 5 files.  

13.   Deploying new version.  

14.   Will check again in 1 seconds  

15.   Closing update: new version is ready to start serving.  

16.   Uploading index definitions.  

17.   Deployment completed successfully  

在线访问你的应用 

登录 google app engine,你将看到你的application页面。

 

你将看到你的版本号为1的web应用,点击链接,打开应用。链接如下的格式:http://<applicationid>.appspot.com, 例http://wjjapp.appspot.com/.


本文是使用 B3log SoloSolo 示例 进行同步发布的

posted @ 2010-11-12 21:18 squirrel 阅读(428) | 评论 (0)编辑 收藏

对于 Java 程序员来说,除 SSH 之外,的另一个选择:

Nutz

当然,它是开源的,并且是完全免费的,同时也是商业友好的(Licensed under the Apache License, Version 2.0)。

同传统的 SSH 相比,它具备如下特点:

  • -- 当前最新版,整个 jar 文件共 820k
  • -- 针对 JDBC 的薄封装,无缓存
  • -- 提供了 Dao (ORM, SQL 管理), Ioc, Aop, Mvc, Json解析 等必要功能
  • -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate
  • -- 它所有功能均不依赖第三方 jar 文件。
这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了

 

当然你要使用其它的连接池,数据库驱动,打印PDF支持等功能,还需要自行添置 jar 包。

Nutz 为谁而设计?

  • 如果你觉得 Hibernate 控制比较繁琐,iBatis 编写SQL又比较麻烦,Nutz.Dao 专为你设计。
  • 如果你觉得在多个服务器部署或者修改 Spring 配置文件很麻烦,Nutz.Ioc 专为你设计
  • 如果你觉得直接写 XML 配置文件很麻烦,可视化编辑器又没控制感,Nutz.Mvc 专为你设计
  • 如果你觉得 JSON 转换很麻烦(要写超过一行以上的代码),Nutz.Json 专为你设计
  • 如果你觉得 Java 语法不如 Ruby 便捷, Nutz.Castor 以及 Nutz.Lang 专为你设计
  • 如果你以前根本没接触过 SSH ,只使用 JDBC 编程, 整个 Nutz 专门为你设计
  • 你只要在你的 classpath 下部署这个 800多K 的小 jar 包,你会得到上述所有好处

我要使用 Nutz,该从那里入手呢?

  1. 下载 Nutz -- 包括文档和源码都包含在下载包中
  2. 阅读文档 -- Wiki 页面 有充分的介绍,每个部分都有 Hello World
  3. 运行 Demo -- Demo 在不断的添加中 ... 现在已有 7 个可用 Demo
  4. 编译 -- 请看详细介绍
  5. 运行测试 -- 请看详细介绍

另外:

  1. Amosleaf 写了一个 Nutz.Dao 入门的例子
  2. Peter Tung 写的 Nutz Json Book 几分钟可以让你对 Json 解析入门

Nutz 的质量

托社区的福,截至到现在为止,Nutz 一共通过了超过 500JUnit测试。其中有 152 个用例针对数据库,并在如下数据库中工作良好:

 

截止到 1.a.31 为止,大约有 66% 的代码被 JUnit 测试用例覆盖:
更多详情,请请 查看最新emma测试报告
在一个功能告一段落以后,我通常会花1-2个晚上在一边咂着廉价的红酒一边颇有成就感的书写JUnit测试。 通常我会用 JUnit 把我自己击溃,紧接着的那几天我都努力让那个该死红条变绿,之后,又想方设法写出 新的Junit测试试图让它再度变红。并且我还要保证所做的修改不能让代码膨胀,这的确让我死掉了不少脑 细胞。这些测试中,不仅涵盖各种功能上的测试,也涵盖了一些跨越线程的测试。在以后,我会针对代码执 行的效率加入一些新的测试。

 

我能保证的就是Nutz的代码是小巧的,以及通过尽可能多的 JUnit 测试。但是所有我能做的也就只是 这些了,找出剩下的那些代码上的缺陷,就应该交给 Nutz 第一批“小白”们了。“小白”们,加油!我 支持你们...
小白: 是小白鼠的简称。小白鼠是实验室的最爱,实验室是产生新东西的地方。
注: 从 09年9月开始,随着“小白”们的不断增多,项目的 Issue 列表越来越长,不断的有人发现缺陷,也不断的有人 提交修复,现在,基本上是整个社区在决定 Nutz 的品质。

 


Nutz 的未来

Nutz 是一个新兴的开源项目

 

它没有过去,只有未来
我可以保证,在未来,Nutz 的代码 绝对不会膨胀。 所有的功能设计的出发点就是最大限度给予程序员实惠。
  • 下面一些计划会被执行,但是不一定按照我给出的顺序:
  •   *  Nutz  Ioc  Mvc 开发一个代码生成器
     
    * Nutz.mvc 支持自动生成缩略图
     
    * Nutz 建立一个官方网站,提供讨论区和 Wiki
     
    * 提供英文文档

  • Nutz 会是一个长期的项目,因为
  •  
       1. 我写它不花钱
       
    2. 我喜欢写代码
       
    3. 我不担心自己的生计
       
    4. 社区很活跃,越来越多的人在贡献代码,测试,提交问题

本文是使用 B3log SoloSolo 示例 进行同步发布的

posted @ 2010-11-12 21:10 squirrel 阅读(493) | 评论 (0)编辑 收藏

http://www.zentao.net/

禅道项目管理软件(ZenTaoPMS)是一款国产的,基于LGPL协议,开源免费的项目管理软件,它集产品管理、项目管理、测试管理于一体,同时还包含了事务管理、组织管理等诸多功能,是中小型企业项目管理的首选。
禅道项目管理软件主要理念基于scrum,因此它也是一款好用的scrum管理工具。
禅道项目管理软件使用PHP + MySQL开发,基于自主的PHP开发框架──ZenTaoPHP而成。第三方开发者或者企业可以非常方便的开发插件或者进行定制。


本文是使用 B3log SoloSolo 示例 进行同步发布的

posted @ 2010-11-12 21:08 squirrel 阅读(186) | 评论 (0)编辑 收藏

http://www.playframework.org/documentation/1.1/firstapp

本文是使用 B3log SoloSolo 示例 进行同步发布的。

posted @ 2010-11-07 11:29 squirrel 阅读(157) | 评论 (0)编辑 收藏

http://code.google.com/p/javabloger-mini-books/

本文是使用 B3log SoloSolo 示例 进行同步发布的。

posted @ 2010-10-30 20:41 squirrel 阅读(1479) | 评论 (0)编辑 收藏

mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量 数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database。我对于文档型数据库有一些个人的偏好,这种偏好是从半年前研究couchdb而来的,因为我觉得用它来描述一个具有个性化特征的实体对 象正合适,比如网站上的用户或商品书籍之类的条目。

一些概念:

跟mysqld一样,一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个 collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中。跟关系型数据库不一样的地方是,它是的以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文 档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储 了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。可以说是兼备了key-value数据库的方便高效与关系型数据库的强大功 能。

索引

跟关系型数据库类似,mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引。当然建立索引就意味着增加空间开销,我 的建议是,如果你能把一个文档作为一个对象的来考虑,在线上应用中,你通常只要对对象ID建立一个索引即可,根据ID取出对象某些数据放在 memcache即可。如果是后台的分析需要,响应要求不高,查询非索引的字段即便直接扫表也费不了太多时间。如果还受不了,就再建一个索引得了。

默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个unique的key为_id,通常用对象的ID比较合适,比如商品的ID。

capped collection

capped collection是一种特殊的表,它的建表命令为:

db.createCollection("mycoll", {capped:true, size:100000})

允许在建表之初就指定一定的空间大小,接下来的插入操作会不断地按顺序APPEND数据在这个预分配好空间的文件中,如果已经超出空间大小,则回到 文件头覆盖原来的数据继续插入。这种结构保证了插入和查询的高效性,它不允许删除单个记录,更新的也有限制:不能超过原有记录的大小。这种表效率很高,它 适用于一些暂时保存数据的场合,比如网站中登录用户的session信息,又比如一些程序的监控日志,都是属于过了一定的时间就可以被覆盖的数据。

复制与分片

mongodb的复制架构跟mysql也很类似,除了包括master-slave构型和master-master构型之外,还有一个 Replica pairs构型,这种构型在平常可以像master-slave那样工作,一但master出现问题,应用会自动了连接slave。要做复制也很简单,我 自己使用过master-slave构型,只要在某一个服务启动时加上–master参数,而另一个服务加上–slave与–source参数,即可实现 同步。

分片是个很头疼的问题,数据量大了肯定要分片,mysql下的分片正是成为无数DBA的噩梦。在mongodb下,文档数据库类似key- value数据库那样的易分布特性就显现出来了,无论构造分片服务,新增节点还是删除节点都非常容易实现。但mongodb在这方面做还不足够成熟,现在 分片的工作还只做到alpha2版本(mongodb v1.1),估计还有很多问题要解决,所以只能期待,就不多说了。

性能

在我的使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。写入性能同样很令人满意,同样写入百万级别的数 据,mongodb比我以前试用过的couchdb要快得多,基本10分钟以下可以解决。补上一句,观察过程中mongodb都远算不上是CPU杀手。

GridFS

gridfs是mongodb一个很有趣的类似文件系统的东西,它可以用一大块文件空间来存放大量的小文件,这个对于存储web2.0网站中常见的大量小文件(如大量的用户头像)特别有效。使用起来也很方便,基本上跟一般的文件系统类似。

用合适的数据库做适合的事情

mongodb的文档里提到的user case包括实时分析、logging、全文搜索,国内也有人使用mongodb来存储分析网站日志,但我认为mongodb用来处理有一定规模的网站日 志其实并不合适,最主要的就是它占空间过于虚高,原来1G的日志数据它可以存成几个G,如此下去,一个硬盘也存不了几天的日志。另一方面,数据量大了肯定 要考虑sharding,而mongodb的sharding到现在为止仍不太成熟。由于日志的不可更新性的,往往只需APPEND即可,又因为对日志的 操作往往只集中于一两列,所以最合适作为日志分析的还是列存储型的数据库,特别是像infobright那样的为数据仓库而设计的列存储数据库。

由于mongodb不支持事务操作,所以事务要求严格的系统(如果银行系统)肯定不能用它。

mongodb占用空间过大的原因,在官方的FAQ中,提到有如下几个方面:

1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、 256M那样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。

2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上作为权衡了。我曾建议作者把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长 了。但作者的担忧也不无道理,这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。现在的实现算是 拿空间来换取时间吧。

3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。

4、可以定期运行db.repairDatabase()来整理记录,但这个过程会比较缓慢。

因为官方文档中对各方面的内容已经有很详细的叙述,所以我并没有再过多的引用原文与代码,只是结合自己的使用归纳一些心得,有兴趣的朋友不妨直接去翻文档中自己感兴趣的问题,超群的博客上有一个很好的入门介绍。

最后总结一句,文档型数据库有点像波粒二象性,总能在适当的时候表现出它作为关系型数据库或key-value数据库的优势来。

实战案例:

昨天我访问mongodb的python程序开始出错,经常抛出AssertionError异常,经查证只是master查询异常,slave正常,可判断为master的数据出了问题。

修复过程:

1、在master做db.repairDatabase(),不起作用;

2、停止slave的同步;

3、对slave作mongodump,备份数据;

4、对master作mongostore,把备份数据恢复,使用–drop参数可以先把原表删除。

5、恢复slave的同步。

本文是使用 B3log SoloSolo 示例 进行同步发布的。

posted @ 2010-10-30 20:06 squirrel 阅读(282) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页