关于作者

姓名:董黎伟

性别:男

出生日期:1982-06-05

地区:家乡-贵阳

联系电话:

QQ:27205370婚否:未婚
用户名:gzdlw
笔名:干煸四季豆
地区: 家乡-贵阳
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



资源

nice blog

访问统计:
文章个数:205
评论个数:108
留言条数:19




Powered by BlogDriver 2.1

干煸四季豆

 

给我一支烟,吞云吐雾间,让所有烦累疲劳能够过往如云烟~~~

我的能力是协助团队取得成功并尽快掌握新知识。

文章

唉,一年了,终于得偿所愿呀。书终于出版了。  (作者置顶)

辛苦了一年,我的书终于出版了,现在网上已经开始宣传,http://www.cdbook.cn/book.asp?id=9272
3月下旬书店应该就有卖了,娃哈哈哈哈。得偿所愿呀~~~开心开心~~

 

查看图片实际尺寸
深入浅出Tapestry(含光盘1张)
作 者:董黎伟编著
出版社:电子工业出版社
日 期:2007年3月
开 本:16开    版 次:1次
页 数:0页
装 帧:简装
ISBN :9787121037399
市场价:
   49.00元
会员价:
   43.12 元
节  省:
   5.88 元
图书简介
    本书以循序渐进的方式,从Tapestry框架技术的基本概念入手,讲解Tapestry框架在J2EE Web应用程序中的整体架构实现。使读者在学习如何使用Tapestry框架技术的同时,还能够获得在J2EE Web应用程序中应用Tapestry框架的先进经验。本书详细介绍了Hivemind框架的原理与应用,使读者不但可以通过Hivemind来重构Tapestry的官方实现,还可以使用Hivemind来搭建J2EE Web应用程序的业务层。在本书还提供了一个以Hibernate+Hivemind+Tapestry 4.0为架构的J2EE Web应用程序示例,为读者提供一个完整的J2EE Web应用程序解决方案。本书在介绍内容安排上,充分考虑到Tapestry对主流Java应用支持的功能。介绍了对Spring、Hibernate、Ajax等技术的融合。这样用Tapestry可以开发非常热门的web应用。本书还介绍了作者为Tapestry扩展的额外功能,即页面流程,详细阐述了该功能的作者思维与源代码实现过程,并提供了应用示例。为了方便读者在应用Tapestry框架时对各种知识点进行查阅,本书的各个章节相互独立,因此本书不但可以作为一部学习教程,也以作为一本工具参考书。本书适合Web框架技术的爱好者、Tapestry入门学习者、Tapestry表现层开发人员和关注下一代的Web开发技术的公司与个人用户。

- 作者: 干煸四季豆 2007年03月9日, 星期五 10:59  回复(3) |  引用(0) 加入博采

已锁定  (作者置顶)
此日志的浏览权限已被作者锁定,请同作者联系,发送短消息,如果你的身份符合作者的要求,点击此处可以进行浏览

- 作者: 干煸四季豆 2005年11月10日, 星期四 13:20  回复(0) |  引用(0) 加入博采

很久没有写BLOG了。太忙太忙~

今天接到出版商的电话,说出版社终于已经把稿子审查完毕(工作效率真快~靠),但是有几张图太小,需要改改。。。又说出版社认为每年的是十一月、十二月是销售淡季,因此印刷书的时间要退后到年底(真TMD靠)~~~唉

- 作者: 干煸四季豆 2006年10月17日, 星期二 19:50  回复(2) |  引用(0) 加入博采

《Tapestry4.0深入浅出》电子工业出版社
8月10日书稿提交出版社,审核印刷约需两月,具体视出版社排稿而定。希望能快点吧:)也也

- 作者: 干煸四季豆 2006年08月10日, 星期四 21:43  回复(8) |  引用(55) 加入博采

这个星期内书稿就会提交给出版社印刷,《Tapestry4.0深入浅出》

一旦提交出版社,那么等到出版社排期结束,就基本知道什么时候能在书店买到书了,终于熬到头咯,娃哈哈哈~~~

和Howard交涉了两个星期了,想请他给写个序言。不过那家伙回信真的很慢,说来说去,稿子也发给他了,最后他来了句:“I was able to read the files but, as I don't read any version of chinese, so it's hard for me to really determine what's going on.”是呀,这也不怪他,咋办呢?我就只好建议他写点对Tapestry的看法,写点对中国程序员的鼓励。到现在已经两天了,还没有收到他的答复呢,不知道他愿不愿意写。反正现在稿子已经快提交出版社了,即便他愿意写,也只能在这个星期之内。不愿意也就算了,其实也无所谓。

最近忙了点,每天睡眠都不足6个小时,再加上今年天气特忽悠人,忽冷忽热的,搞得我一会发烧感冒一会又热伤风。不过嘛,即便遇上一小点点艰难坎坷,革命还是得继续地~~~嘿嘿。总体来看,一切都非常顺利,基本按照计划行事,所以心里也甚感安慰。

- 作者: 干煸四季豆 2006年08月8日, 星期二 22:53  回复(7) |  引用(0) 加入博采

紫荆花路88号

      2006218到杭州,19日找到出租屋,就住在紫荆花路88号。最搞笑的是那个片区的派出所,在紫荆花路110。呵呵。

      杭州很漂亮,“上有天堂、下有苏杭”,记得找工作面试的时候,每次都要问我为什么要来杭州。其实我去杭州的理由非常非常之简单。原本和朋友商量去深圳、广州或者北京,但是朋友一直担心深圳和广州的治安实在太差,这方面的负面报道实在太多。至于北京,沙尘暴的名声并不好听。后来有一天,我在报纸上看到,杭州从人居环境、自然环境、经济环境什么什么综合排名上,位居全国第一。呵呵,于是乎,就这么选择了杭州。

      去杭州的第二天,我就去 Spring嘟嘟 那里报到了。后来就在他的公司一直干到我离开杭州,算一算似乎正好100天。呵呵。。。Spring嘟嘟对于HibernateSpring确实有很深的造诣,当然了,还有他最看好的Ajax

      除了气候以外,其实我还满喜欢杭州的。城市的一半是喧嚣的人类,另外的一半则是寂静的大自然。常常下班之后,一趟公车半个小时,就可以和朋友坐在西湖边边上看月亮,仿佛已经脱离了凡尘俗世,实在是惬意非常呢~:)

      离开杭州的时候,虽然传说中的梅雨季节尚未开始,但是已经下了两个多星期月,实在不爽,家里什么都生霉了。我和朋友甚至不敢在家做饭吃,因为我们没有冰箱,第二天肯定会霉变。杭州实在太热了,5月开始气温就在2530度之间徘徊,而室外实际温度估计准上了30。。。呵呵,在贵阳,一年中也不过就只有一个星期的时间,气温会上30度而已。。。看来在杭州,离了空调准活不了(至少非常难熬),呵呵,我还记得第一次接到房东的电费单,自己心中那种惊愕的心情。两个月花了800元电费,而我们就只有一个空调、一个热水器、一台电脑以及常常在家用电磁炉做饭,原来杭州的电价高达8毛,是贵阳或成都电价的一倍。一问同事才知道,原来这还是房东人好,一般出租屋的电价都高达1元。。。呵呵。在贵阳家里做饭什么的,全部也用电,即便在冬天开电炉,也顶多一个月电费150多。刚去杭州,不适应那里冬天的寒冷,所以整天开着空调。。于是五一的时候,我赶快去买了台电扇以便开展夏日节电计划,这是我生平第一次注意节电。。。

      杭州人还比较热情,可能是旅游城市,人们见惯了外地人,也肯定了外地人对当地经济发展所带来的贡献,所以杭州对外地人比较热情。如果拿个地图在外面走,有些大妈老太太级别的杭州人还会主动问你想去哪里,告诉你什么路什么路该坐几路车该怎么走。说起坐车,杭州公车真破,特别是发动机的声音,好比你正坐在一架战斗机中。杭州公车车费也很乱,从1元到5元,什么价格都有。呵呵,记得我刚到杭州的时候,还坐了趟霸王公车。那时候下了火车,看见K900路,正好到我想去的浙江大学附近,因为成都和贵阳的公车都是一元,所以想当然地投了一元。等过了几天逐渐熟悉杭州公车情况之后才知道,原来K900是三元一人。呵呵。。。。杭州公车好差哟~~~又贵,又吵。。不过说贵,还算不上杭州出租车贵,出租车10元起步三公里,然后每公里1元。。相比之下成都就好便宜,5元起步一公里,然后每公里才1.4元。所以在杭州,能不坐出租车就尽量不坐出租车。呵呵,上班起床晚了,打次出租车,我半天的工资就没了。

      杭州早餐比成都丰富,不过我惊讶杭州人吃早餐怎么像猪一样。两元钱的糯米饭有拳头那么大,里面居然还夹了根油条。早上9点吃这么多的东西,我感觉自己连午饭都可以省了。我有一次跟那个店家说,我只要一元钱的糯米饭,而且里面不要夹油条。那个店家居然跟我说,这么少的糯米饭,他包不起来,汗~~~所以我只在杭州吃过三次糯米饭,记得以前在贵阳,我最喜欢吃的早餐之一就是糯米饭。杭州买的蛋饼卷油条味道不错,店家在火炉上架个铁板,铁板烤的火热,店家舀一勺灰面汤,浇在铁板上,然后用一根前端扁平的棍子在铁板上拨弄一圈,一个面饼就OK了,然后店家在上面打个鸡蛋,刷点辣椒酱和甜酱,放点榨菜,放根油条一卷,OK,香喷喷的蛋饼卷油条就好了,我在杭州几乎天天早上吃这个。:)其实要说街边小吃,成都也好,杭州也罢,都比不上贵阳那么多那么丰富。

      杭州生活成本比成都高些,不过要比贵阳低。如果能找到平民化的餐馆,虽然看起来赃一些,不过也很便宜。杭州吃鱼比成都贵阳便宜多了,但是蔬菜却很贵。特别是所谓的有机蔬菜,让我第一天去买菜的时候吓了一跳。那我最爱四季豆来讲,成都一元一斤,最便宜的时候七八毛也买得到。贵阳大概也就是一元多吧。而杭州,三元多一斤刀豆(杭州称四季豆为刀豆),如果去买有机的所谓什么美国刀豆,7元多一斤。呵呵,所以,每次我去买刀豆,心里总忍不住要怀念成都和贵阳。

      杭州软件行业比较发达,杭州有所谓的“程序员的天堂”之称。我的朋友做美工,是转行过来的,之前只跟我接了一个兼职自学了一个月美工。到了杭州,三个星期面试了340家公司,每次她去面试,就把面试时考官要求的东西在家做出来,这样面试下一家的时候就多了一些资本。就这样她几乎是边面试边学习如何做美工,最后才终于找到一家。提到这个我都忍不住感叹,杭州市场太大了,成都和贵阳简直不可能相比。成都顶多能面试10家,而贵阳一家面试的都找不到。杭州的程序员,两年工作经验的,大概在4000左右(税后),以杭州的生活水平,我觉得还是很不错的,杭州除了租房贵,如果能找到我说的平民饭店,吃方面消费并不会太多。如果一个人过日子,平常节约点,2K应该是随便可以存到的。两年工作经验在上海或深圳,顶多也就5K左右,但是那边的生活水平高了就只一截了。

      说起来,我到是比较讨厌杭州有一点,就是只要你有钱,就可以随便放爆竹。在杭州,不论是新公司成立,还是旧公司搬家,甚至人们搬新家办丧事都喜欢放爆竹,那种很大很响的爆竹。危险就不说了,扰民呀,有两次晚上都睡觉了,社区有人搬家,平平砰砰就放起来了。还有一次,早上9点半在公司开会,淘宝网搬家搬到对面大楼,也是平平砰砰放了一刻钟,我们开会说话都听不清楚。杭州是比较发达一些,让我感觉只要有钱,干什么都可以。。。

      说起发达,从人们开的车就看得出来,成都最大众化的车是奥托,成都人称为坨坨车,一般也就2W多一辆。杭州最普遍的是10W左右的车,340W的奥迪和奔驰随处可见。杭州的房价号称全国第一,其实是被有钱人炒起来的。记得我第一见包租婆(房东)的时候,她拿出一串钥匙,那串钥匙就如同学校宿舍管理拿的那串那么多,说:“你们应该相信我,我不会骗你们的。”。。呵呵,汗~~所以我们就给房东起了个外号叫包租婆。所以嘛,像我这样的草根阶级,除了每天悲愤房价为什么那么高以外,又能咋样呢?

      621,我离开了杭州。离开的理由嘛,其实很简单。这次我去杭州才真正见识到了什么叫code worker。就这么流浪下去又能怎样?房子反正买不起,总是飘飘荡荡连找女朋友都不安心。即便将来去了上海,年薪10W又能怎样?从家乡人的眼光看似乎风光照人,其实龌不龌龊就只有心里知道。每天赶几个小时公车地铁,累得跟牛一样。最经典的是朋友公司的经理,已经29岁了,年薪应该10W了吧,那个公司的三分之一都归他管,每天至少加班到晚上10点,还没有女朋友。有一天公司的老总对他排排肩膀:“好好干,等赚了钱还怕没有女人?”。。。。。呵呵,我不知道那位仁兄听了老板这话心里是何种滋味。反正我觉得挺没有意思的,至少我不愿意几年后成为他那样。所以,还是回贵阳吧,树根小旗子,自己给自己干吧,是死是活也要赌一把,不了背一债再出来打工。。。。想当年,快从大学毕业的时候,看着那些早一年毕业(3年大专)的初高中同学,凭着爸妈的关系,在事业单位捞了个位子,薪水到是高,工作也稳定,听起来也风光,但是每天八个小时应付着自己不喜欢的工作,下了班就去歌舞厅挥霍颓废,我感觉他们真像行尸走肉。所以当时毕业时才坚决转行跑去做程序员,爸妈介绍进电信的机会也放弃了(呵呵,爸妈过了一年多都还在生我气呢~)。。。这次嘛,我只有更努力了,我才不希望真的有一天卷起包袱出来打工还债呢~~~:)

     

 

 

 

 

 

 

 

 

 

 

 

 

- 作者: 干煸四季豆 2006年07月3日, 星期一 14:08  回复(3) |  引用(0) 加入博采

前天飞了趟成都,修改了写书合同,即将获得解脱~
        原来的合同是飞多多和我共同写作《Tapestry4.0深入浅出》,从2月到4月30日截稿。那么飞多多一人负责一半,我的那部分在5月7日前就已完成初稿,而飞多多却因为工作一直太忙,只字未写,因此我的写作任务任务也由原计划的50%扩展到后来的80%。终于我实在忍受不住这种拖延,飞多多那边拖稿遥遥无期,虽然出版商是我学长,但是合同始终是具有法律效应的。因此,前天我飞了一趟成都,废除了原来的合同。
    新合同的全部写作任务由我一人承担,目前书稿现已完成95%。已经进入最后的审稿和编辑排版阶段。我打算这个星期发E-mail给Howard大哥,如果他不介意,希望他可以给我写一篇序言:)。。。
    预计所有写作在这个星期就可以完结,如果出版社速度快,那么应该一两个月后就可以看见新书面试,我也终于可以解脱了。。。。这次的写书任务,累就一个字,唉~~~

- 作者: 干煸四季豆 2006年07月3日, 星期一 12:19  回复(3) |  引用(0) 加入博采

Object-relation mapping without the container

转自:http://www-128.ibm.com/developerworks/library/j-hibern/?ca=dnt-515

Develop a transactional persistence layer using Hibernate and Spring

Richard Hightower (rhightower@arc-mind.com), Developer, ArcMind Inc.

- 作者: 干煸四季豆 2006年06月25日, 星期日 17:32  回复(0) |  引用(0) 加入博采

简化Spring配置文件

转自: http://www.blogjava.net/calvin/archive/2005/08/21/10530.html

作者:江南白衣 

1.1.autowire="byName" /"byType"

     假设Controller有一个属性名为customerDAO,Spring就会在配置文件里查找有没有名字为CustomerDAO的bean, 自动为Controller注入。
     如果bean有两个属性,一个想默认注入,一个想自定义,只要设定了autowire,然后显式的声明那个想自定义的,就可以达到要求。这就应了需求,在需要特别配置的时候提供配置,否则给我一个默认注入。

     还有一个更懒的地方,在最最根部的<beans>节点写一句default-autovwrie="byName",可以让文件里的所有bean 都默认autowrie。
    不过Rod认为开发期可以这样,但Production Server上不应该使用Autowire。而我觉得那些自定义一次的地方比如TranscationManager应该详细定义,而Dao,Controller这种大量重复定义的bean就可以偷点懒了。

1.2.<bean>节点之间抽象公共定义和 Inner Bean

    这太方便懒人了,想不到两个独立的XML节点都可以玩继承和派生,子节点拥有父节点的全部属性。
    最好用的地方就是那个Transtion Proxy的定义。先定义一个又长又冗的父类,然后用子类去继承它。
   
    另外,还有一个Inner Bean的机制,可以把DAO写成Proxy的内部类。为什么要写成内部类?为了让Proxy冒名顶替它去让Controller Autowire。(详见后面的示例)

1.3. 宽松的配置, To XML or Not to XML 
    据说Spring比Struts的配置宽松了很多,这就给人把东西从配置文件中撤回原码中的机会。
    不赞成什么都往配置文件里晒,造成了Rich Information的配置文件,修改或者查看的时候,要同时打开配置文件和原码才能清楚一切。
    而我希望配置文件就集中做一些整体的配置,还有框架必须的、无需管理的冗余代码。而一些细节的变化不大的配置和逻辑,就尽量别往里塞了。因此,Success/Fail View 的配置,不建议放在里面。

2.简化后的配置文件

1.Controller只剩下一句

<bean name="customerController" class="org.springside.bookstore.web.CustomerController" autowire="byName"/>


2.DAO也只剩一句

<bean id="customerDAO" class="org.springside.bookstore.dao.CustomerDao"/>

3.Service类只剩下5行

  <bean id="customerManager" parent="baseTxService">
        
<property name="target">
            
<bean class="org.springside.bookstore.service.CustomerManager"/>
        
</property>
    
</bean>

3.Spring 1.2后xml语法简化

 
最主要的简化是把属性值和引用bean从子节点变回了属性值,对不喜欢autowire的兄弟比较有用。
 当然,如果value要CDATA的时候还是要用子节点。另外,list的值可以用空格隔开也比较实用。

1.属性值

  <property name="foo">
     
<value>fooValue</value>
  </property>
  简化为
  <property name="foo" value="fooValue"/>

2.引用 bean
<property name="foo">
   
<ref bean="fooBean">
</property>
简化为
<property name="foo" ref="fooBean"/>


3. list可以简化为空格分开的字符串
 
<property name="myFriendList">
  
<list>
     
<value>gigix</value>
        <value>wuyu</value>
  
</list>
</property>
简化为
<property name="myFriendList" value="gigix wuyu"/>
   
  
4.Spring 2.0来了
   如果没什么外力刺激,spring xml 可能就这样不会变了。但现在xml成了过街老鼠,被ror的默认配置和JDK5的annotation逼得不行,当然就要继续求变。
   比如有好事者认为,节点名必须以bean打头,附加一个属性id来表示bean名;属性值必须搞一个property子节点,子节点上有个属性name来表示属性名,是给机器看的很不直观的东西。
<bean id="customerDAO" class="org.springside...CustomerDAO">
 
<property name="maxCount" value="10">
</bean>

给人看的东西应该就写成
<customerDAO class="org.springside....CustomerDAO" maxCount="10"/>

Spring 2.0正用schema实现类似的语法,具体请看它的JPetStore sample。

- 作者: 干煸四季豆 2006年06月25日, 星期日 17:31  回复(0) |  引用(0) 加入博采

MySQL服务维护笔记

转自:http://www.chedong.com/tech/mysql.html

作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com

内容摘要:使用MySQL服务的一些经验,主要从以下几个方面考虑的MySQL服务规划设计。对于高负载站点来说PHP和MySQL运行在一起(或者说任何应用和数据库运行在一起的规划)都是性能最大的瓶颈,这样的设计有如让人一手画圆一手画方,这样2个人的工作效率肯定不如让一个人专门画圆一个人专门画方效率高,让应用和数据库都跑在一台高性能服务器上说不定还不如跑在2台普通服务器上快。

以下就是针对MySQL作为专门的数据库服务器的优化建议:

  1. MySQL服务的安装/配置的通用性;
  2. 系统的升级和数据迁移方便性;
  3. 备份和系统快速恢复;
  4. 数据库应用的设计要点;
  5. 一次应用优化实战;

MySQL服务器的规划
=================
为了以后维护,升级备份的方便和数据的安全性,最好将MySQL程序文件和数据分别安装在“不同的硬件”上。

         /   / 
| /usr <== 操作系统
| /home/mysql <== mysql主目录,为了方便升级,这只是一个最新版本目录的链接
硬盘1==>| /home/mysql-3.23.54/ <== 最新版本的mysql /home/mysql链接到这里
\ /home/myql-old/ <== 以前运行的旧版本的mysql

/ /data/app_1/ <== 应用数据和启动脚本等
硬盘2==>| /data/app_2/
\ /data/app_3/


MySQL服务的安装和服务的启动:
MySQL一般使用当前STABLE的版本:
尽量不使用--with-charset=选项,我感觉with-charset只在按字母排序的时候才有用,这些选项会对数据的迁移带来很多麻烦。
尽量不使用innodb,innodb主要用于需要外键,事务等企业级支持,代价是速度比MYISAM有数量级的下降。
./configure --prefix=/home/mysql --without-innodb
make
make install

服务的启动和停止
================
1 复制缺省的mysql/var/mysql到 /data/app_1/目录下,
2 MySQLD的启动脚本:start_mysql.sh
#!/bin/sh
rundir=`dirname "$0"`
echo "$rundir"
/home/mysql/bin/safe_mysqld --user=mysql --pid-file="$rundir"/mysql.pid --datadir="$rundir"/var "$@"\
-O max_connections=500 -O wait_timeout=600 -O key_buffer=32M --port=3402 --socket="$rundir"/mysql.sock &

注释:
--pid-file="$rundir"/mysql.pid --socket="$rundir"/mysql.sock --datadir="$rundir"/var
目的都是将相应数据和应用临时文件放在一起;
-O 后面一般是服务器启动全局变量优化参数,有时候需要根据具体应用调整;
--port: 不同的应用使用PORT参数分布到不同的服务上去,一个服务可以提供的连接数一般是MySQL服务的主要瓶颈;

修改不同的服务到不同的端口后,在rc.local文件中加入:
/data/app_1/start_mysql.sh
/data/app_2/start_mysql.sh
/data/app_3/start_mysql.sh
注意:必须写全路径

3 MySQLD的停止脚本:stop_mysql.sh
#!/bin/sh
rundir=`dirname "$0"`
echo "$rundir"
/home/mysql/bin/mysqladmin -u mysql -S"$rundir"/mysql.sock shutdown

使用这个脚本的好处在于:
1 多个服务启动:对于不同服务只需要修改脚本中的--port[=端口号]参数。单个目录下的数据和服务脚本都是可以独立打包的。
2 所有服务相应文件都位于/data/app_1/目录下:比如:mysql.pid mysql.sock,当一台服务器上启动多个服务时,多个服务不会互相影响。但都放到缺省的/tmp/下则有可能被其他应用误删。
3 当硬盘1出问题以后,直接将硬盘2放到一台装好MySQL的服务器上就可以立刻恢复服务(如果放到my.cnf里则还需要备份相应的配置文件)。

服务启动后/data/app_1/下相应的文件和目录分布如下:
/data/app_1/
    start_mysql.sh 服务启动脚本
    stop_mysql.sh 服务停止脚本
    mysql.pid 服务的进程ID
    mysql.sock 服务的SOCK
    var/ 数据区
       mysql/ 用户库
       app_1_db_1/ 应用库
       app_1_db_2/
...
/data/app_2/
...

查看所有的应用进程ID:
cat /data/*/mysql.pid

查看所有数据库的错误日志:
cat /data/*/var/*.err

个人建议:MySQL的主要瓶颈在PORT的连接数上,因此,将表结构优化好以后,相应单个MySQL服务的CPU占用仍然在10%以上,就要考虑将服务拆分到多个PORT上运行了。

服务的备份
==========
尽量使用MySQL DUMP而不是直接备份数据文件,以下是一个按weekday将数据轮循备份的脚本:备份的间隔和周期可以根据备份的需求确定
/home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f>/path/to/backup/db_name.`data +%w`.dump.gz
因此写在CRONTAB中一般是:
15 4 * * * /home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f>/path/to/backup/db_name.`data +\%w`.dump.gz
注意:
1 在crontab中'%'需要转义成'\%'
2 根据日志统计,应用负载最低的时候一般是在早上4-6点

先备份在本地然后传到远程的备份服务器上,或者直接建立一个数据库备份帐号,直接在远程的服务器上备份,远程备份只需要将以上脚本中的-S /path/to/msyql.sock改成-h IP.ADDRESS即可。

数据的恢复和系统的升级
======================
日常维护和数据迁移:在数据盘没有被破坏的情况下
硬盘一般是系统中寿命最低的硬件。而系统(包括操作系统和MySQL应用)的升级和硬件升级,都会遇到数据迁移的问题。
只要数据不变,先装好服务器,然后直接将数据盘(硬盘2)安装上,只需要将启动脚本重新加入到rc.local文件中,系统就算是很好的恢复了。

灾难恢复:数据库数据本身被破坏的情况下
确定破坏的时间点,然后从备份数据中恢复。

应用的设计要点
==============
如果MySQL应用占用的CPU超过10%就应该考虑优化了。

  1. 如果这个服务可以被其他非数据库应用代替(比如很多基于数据库的计数器完全可以用WEB日志统计代替)最好将其禁用:
    非用数据库不可吗?虽然数据库的确可以简化很多应用的结构设计,但本身也是一个系统资源消耗比较大的应用。在某些情况下文本,DBM比数据库是更好的选择,比如:很多应用如果没有很高的实时统计需求的话,完全可以先记录到文件日志中,定期的导入到数据库中做后续统计分析。如果还是需要记录简单的2维键-值对应结构的话可以使用类似于DBM的HEAP类型表。因为HEAP表全部在内存中存取,效率非常高,但服务器突然断电时有可能出现数据丢失,所以非常适合存储在线用户信息,日志等临时数据。即使需要使用数据库的,应用如果没有太复杂的数据完整性需求的化,完全可以不使用那些支持外键的商业数据库,比如MySQL。只有非常需要完整的商业逻辑和事务完整性的时候才需要Oracle这样的大型数据库。对于高负载应用来说完全可以把日志文件,DBM,MySQL等轻量级方式做前端数据采集格式,然后用Oracle MSSQL DB2 Sybase等做数据库仓库以完成复杂的数据库挖掘分析工作。
    有朋友和我说用标准的MyISAM表代替了InnoDB表以后,数据库性能提高了20倍。

  2. 数据库服务的主要瓶颈:单个服务的连接数
    对于一个应用来说,如果数据库表结构的设计能够按照数据库原理的范式来设计的话,并且已经使用了最新版本的MySQL,并且按照比较优化的方式运行了,那么最后的主要瓶颈一般在于单个服务的连接数,即使一个数据库可以支持并发500个连接,最好也不要把应用用到这个地步,因为并发连接数过多数据库服务本身用于调度的线程的开销也会非常大了。所以如果应用允许的话:让一台机器多跑几个MySQL服务分担。将服务均衡的规划到多个MySQL服务端口上:比如app_1 ==> 3301 app_2 ==> 3302...app_9 ==> 3309。一个1G内存的机器跑上10个MySQL是很正常的。让10个MySQLD承担1000个并发连接效率要比让2个MySQLD承担1000个效率高的多。当然,这样也会带来一些应用编程上的复杂度;

  3. 使用单独的数据库服务器(不要让数据库和前台WEB服务抢内存),MySQL拥有更多的内存就可能能有效的进行结果集的缓存;在前面的启动脚本中有一个-O key_buffer=32M参数就是用于将缺省的8M索引缓存增加到32M(当然对于)

  4. 应用尽量使用PCONNECT和polling机制,用于节省MySQL服务建立连接的开销,但也会造成MySQL并发链接数过多(每个HTTPD都会对应一个MySQL线程);

  5. 表的横向拆分:让最常被访问的10%的数据放在一个小表里,90%的历史数据放在一个归档表里(所谓:快慢表),数据中间通过定期“搬家”和定期删除无效数据来节省,毕竟大部分应用(比如论坛)访问2个月前数据的几率会非常少,而且价值也不是很高。这样对于应用来说总是在一个比较小的结果级中进行数据选择,比较有利于数据的缓存,不要指望MySQL中对单表记录条数在10万级以上还有比较高的效率。而且有时候数据没有必要做那么精确,比如一个快表中查到了某个人发表的文章有60条结果,快表和慢表的比例是1:20,那么就可以简单的估计这个人一共发表了1200篇。Google的搜索结果数也是一样:对于很多上十万的结果数,后面很多的数字都是通过一定的算法估计出来的。

  6. 数据库字段设计:表的纵向拆分(过渡范化):将所有的定长字段(char, int等)放在一个表里,所有的变长字段(varchar,text,blob等)放在另外一个表里,2个表之间通过主键关联,这样,定长字段表可以得到很大的优化(这样可以使用HEAP表类型,数据完全在内存中存取),这里也说明另外一个原则,对于我们来说,尽量使用定长字段可以通过空间的损失换取访问效率的提高。在MySQL4中也出现了支持外键和事务的InnoDB类型表,标准的MyISAM格式表和基于HASH结构的HEAP内存表,MySQL之所以支持多种表类型,实际上是针对不同应用提供了不同的优化方式;

  7. 仔细的检查应用的索引设计:可以在服务启动参数中加入 --log-slow-queries[=file]用于跟踪分析应用瓶颈,对于跟踪服务瓶颈最简单的方法就是用MySQL的status查看MySQL服务的运行统计和show processlist来查看当前服务中正在运行的SQL,如果某个SQL经常出现在PROCESS LIST中,一。有可能被查询的此时非常多,二,里面有影响查询的字段没有索引,三,返回的结果数过多数据库正在排序(SORTING);所以做一个脚本:比如每2秒运行以下show processlist;把结果输出到文件中,看到底是什么查询在吃CPU。

  8. 全文检索:如果相应字段没有做全文索引的话,全文检索将是一个非常消耗CPU的功能,因为全文检索是用不上一般数据库的索引的,所以要进行相应字段记遍历。关于全文索引可以参考一下基于Java的全文索引引擎lucene的介绍

  9. 前台应用的记录缓存:比如一个经常使用数据库认证,如果需要有更新用户最后登陆时间的操作,最好记录更新后就把用户放到一个缓存中(设置2个小时后过期),这样如果用户在2个小时内再次使用到登陆,就直接从缓存里认证,避免了过于频繁的数据库操作。

  10. 查询优先的表应该尽可能为where和order by字句中的字段加上索引,数据库更新插入优先的应用索引越少越好。

总之:对于任何数据库单表记录超过100万条优化都是比较困难的,关键是要把应用能够转化成数据库比较擅长的数据上限内。也就是把复杂需求简化成比较成熟的解决方案内。

一次优化实战
============
以下例子是对一个论坛应用进行的优化:

  1. 用Webalizer代替了原来的通过数据库的统计。
  2. 首先通过TOP命令查看MySQL服务的CPU占用左右80%和内存占用:10M,说明数据库的索引缓存已经用完了,修改启动参数,增加了-O key_buffer=32M,过一段时间等数据库稳定后看的内存占用是否达到上限。最后将缓存一直增加到64M,数据库缓存才基本能充分使用。对于一个数据库应用来说,把内存给数据库比给WEB服务实用的多,因为MySQL查询速度的提高能加快web应用从而节省并发的WEB服务所占用的内存资源。
  3. 用show processlist;统计经常出现的SQL:

    每分钟运行一次show processlist并记录日志:
    * * * * * (/home/mysql/bin/mysql -uuser -ppassword < /home/chedong/show_processlist.sql >>  /home/chedong/mysql_processlist.log)

    show_processlist.sql里就一句:
    show processlist;

    比如可以从日志中将包含where的字句过滤出来:
    grep where mysql_processlist.log
    如果发现有死锁,一定要重新审视一下数据库设计了,对于一般情况:查询速度很慢,就将SQL where字句中没有索引的字段加上索引,如果是排序慢就将order by字句中没有索引的字段加上。对于有%like%的查询,考虑以后禁用和使用全文索引加速。

  4. 还是根据show processlist;看经常有那些数据库被频繁使用,考虑将数据库拆分到其他服务端口上。

MSSQL到MySQL的数据迁移:ACCESS+MySQL ODBC Driver

在以前的几次数据迁移实践过程中,我发现最简便的数据迁移过程并不是通过专业的数据库迁移工具,也不是MSSQL自身的DTS进行数据迁移(迁移过程中间会有很多表出错误警告),但通过将MSSQL数据库通过ACCESS获取外部数据导入到数据库中,然后用ACCESS的表==>右键==>导出,制定ODBC,通过MySQL的DSN将数据导出。这样迁移大部分数据都会非常顺利,如果导出的表有索引问题,还会出添加索引提示(DTS就不行),然后剩余的工作就是在MySQL中设计字段对应的SQL脚本了。

- 作者: 干煸四季豆 2006年06月21日, 星期三 13:48  回复(0) |  引用(0) 加入博采

一首动漫歌歌词

并非偶然,
两人的相遇,
是很久以前便已注定的命运,

每次闭上眼睛,
每次仰望天空,
都会想起那如梦似幻的每一天,
每次往前迈进,却又变的更远,
但只要一直向前走,
我就能看到那和你在一起的未来。
你也心中了然,
不管时光如何变迁,
依然会遵守这个约定,
在悲伤的时候,
想留在对方身边。

- 作者: 干煸四季豆 2006年06月21日, 星期三 10:28  回复(0) |  引用(0) 加入博采

用xplanner管理项目

 转自:http://www.zahui.com/html/6/40488.htm

1:下载xplanner(目前版本是0.6.2)
http://sourceforge.net/project/showfiles.php?group_id=49017

2: 配置ant

http://www.apache.org下载ant,将这个解压如d:\ant,设定ant_home=d:\ant,然后就可以用了

3:新建数据库,如我在mysql中建立一个xplanner的数据库

4:用ant建表

将下载的xplanner解压缩,进入resources文件夹,修改xplanner.properties文件,将数据库和用户名修改为之前自己建立的名称。

hibernate.connection.url=jdbc:mysql://127.0.0.1/xplanner?autoReconnect=true

hibernate.connection.username=root

hibernate.connection.password=
找到build.xml

在DOS下进入build.xml所在目录,
执行ant install.db.schema

在这一步中将会在数据库中建表,以及假如一个用户名为“sysadmin“密码为“admin“的初始用户


5:运行ant create.db.schema.script
这个将会生成一个hibernate_schema.sql 文件

6:配置email
xplanner.properties文件中找到
xplanner.mail.smtp.host=localhost        # enter your SMTP host
xplanner.mail.from=xplanner@example.org  # enter the email sender for XPlanner messages
将他改成你的配置

7 Build the xplanner.war 文件
到xplanner(有build.xml文件)的目录,运行
$ ant build.war

这样就会在xplanner.war 文件生成

8:copy xplanner.war 到tomcat下的webapp目录下,启动tomcat
在浏览器中输入http://localhost:8080/xplanner/ 就会看到如下界面

- 作者: 干煸四季豆 2006年06月20日, 星期二 23:00  回复(0) |  引用(0) 加入博采

警示自己:java.util.Arrays的BUG - 二分搜索算法

这个问题告诉我们, 无论什么时候, 我们都不要想当然我们的程序是完美的. 我们需要细心的设计,测试再测试,符合规范的方法等等

原文:http://www.matrix.org.cn/resource/news/768_Joshua+Bloch+Bug.html

- 作者: 干煸四季豆 2006年06月7日, 星期三 13:20  回复(0) |  引用(0) 加入博采

简单加密/解密方法(转)

转自:http://www.lihuasoft.net/article/show.php?id=2222

import java.security.*;
import javax.crypto.*;
public class Crypt {

  private static String Algorithm="DES"; //定义 加密算法,可用 DES,DESede,Blowfish

  static boolean debug = false;

 &nbs;static{
    Security.addProvider(new com.sun.crypto.provider.SunJCE());
  }

  //生成密钥, 注意此步骤时间比较长
  public static byte[] getKey() throws Exception{
    KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
    SecretKey deskey = keygen.generateKey();
    if (debug)
      System.out.println("生成密钥:"+byte2hex(deskey.getEncoded()));
    return deskey.getEncoded();
  }

  //加密
  public static byte[] encode(byte[] input,byte[] key) throws Exception{
    SecretKey deskey = new javax.crypto.spec.SecretKeySpec(key,Algorithm);
    if (debug){
      System.out.println("加密前的二进串:"+byte2hex(input));
      System.out.println("加密前的字符串:"+new String(input));
    }
    Cipher c1 = Cipher.getInstance(Algorithm);
    c1.init(Cipher.ENCRYPT_MODE,deskey);
    byte[] cipherByte=c1.doFinal(input);
    if (debug)
      System.out.println("加密后的二进串:"+byte2hex(cipherByte));
    return cipherByte;
  }

  //解密
  public static byte[] decode(byte[] input,byte[] key) throws Exception{
    SecretKey deskey = new javax.crypto.spec.SecretKeySpec(key,Algorithm);
    if (debug)
      System.out.println("解密前的信息:"+byte2hex(input));
    Cipher c1 = Cipher.getInstance(Algorithm);
    c1.init(Cipher.DECRYPT_MODE,deskey);
    byte[] clearByte=c1.doFinal(input);
    if (debug){
      System.out.println("解密后的二进串:"+byte2hex(clearByte));
      System.out.println("解密后的字符串:"+(new String(clearByte)));
    }
    return clearByte;
  }

  //md5()信息摘要, 不可逆
  public static byte[] md5(byte[] input) throws Exception{
    java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5"); //or "SHA-1"
    if (debug){
      System.out.println("摘要前的二进串:"+byte2hex(input));
      System.out.println("摘要前的字符串:"+new String(input));
    }
    alg.update(input);
    byte[] digest = alg.digest();
    if (debug)
      System.out.println("摘要后的二进串:"+byte2hex(digest));
    return digest;
  }

  //字节码转换成16进制字符串
  public static String byte2hex(byte[] b) {
    String hs="";
    String stmp="";
    for (int n=0;n<b.length;n++){
      stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
      if (stmp.length()==1)
        hs=hs+"0"+stmp;
      else hs=hs+stmp;
        if (n<b.length-1)  hs=hs+":";
      }
    return hs.toUpperCase();
  }

  public static void main(String[] args) throws Exception{
    debug = true;
//    byte[] key = getKey();
    byte[] key = "好好学习".getBytes();
    decode(encode("测试加密".getBytes(),key),key);
    md5("测试加密".getBytes());
  }
}

- 作者: 干煸四季豆 2006年05月26日, 星期五 13:50  回复(0) |  引用(0) 加入博采

说得非常好:所有漂亮的代码跑哪里去了?

Google公司软件架构师Hohpe认为:其中的首要原因就是拙劣的代码引起更多拙劣的代码。他的理论是,如果某个应用程序的最初的开发人员不将自己的代码规划清晰,让任何程序员都可以理解,那么潘多拉的盒子就会被打开。

摘自:http://www.matrix.org.cn/resource/article/44/44414_beauty+code.html

维护中山项目两个多月,深有体会呀~

- 作者: 干煸四季豆 2006年05月15日, 星期一 14:05  回复(0) |  引用(1) 加入博采

互联网信息服务管理办法
中华人民共和国国务院令第292号
    
    《互联网信息服务管理办法》已经2000年9月20日国务院第31次常务会议通过,现予公布施行。

                                                        总 理 朱镕基
                                                   二零零零年九月二十五日

                          《互联网信息服务管理办法》

    第一条 为了规范互联网信息服务活动,促进互联网信息服务健康有序发展,制定本办法。

    第二条 在中华人民共和国境内从事互联网信息服务活动,必须遵守本办法。

    本办法所称互联网信息服务,是指通过互联网向上网用户提供信息的服务活动。

    第三条 互联网信息服务分为经营性和非经营性两类。

    经营性互联网信息服务,是指通过互联网向上网用户有偿提供信息或者网页制作等服务活动。
非经营性互联网信息服务,是指通过互联网向上网用户无偿提供具有公开性、共享性信息的服务活动。

    第四条 国家对经营性互联网信息服务实行许可制度;对非经营性互联网信息服务实行备案制度。未取得许可或者未履行备案手续的,不得从事互联网信息服务。

    第五条 从事新闻、出版、教育、医疗保健、药品和医疗器械等互联网信息服务,依照法律、行政法规以及国家有关规定须经有关主管部门审核同意的,在申请经营许可或者履行备案手续前,应当依法经有关主管部门审核同意。

    第六条 从事经营性互联网信息服务,除应当符合《中华人民共和国电信条例》规定的要求外,还应当具备下列条件:
    (一)有业务发展计划及相关技术方案;
    (二)有健全的网络与信息安全保障措施,包括网站安全保障措施、信息安全保密管理制度、用户信息安全管理制度;
    (三)服务项目属于本办法第五条规定范围的,已取得有关主管部门同意的文件。

     第七条从事经营性互联网信息服务,应当向省、自治区、直辖市电信管理机构或者国务院信息产业主管部门申请办理互联网信息服务增值电信业务经营许可证(以下简称经营许可证)。省、自治区、直辖市电信管理机构或者国务院信息产业主管部门应当自收到申请之日起60日内审查完毕,作出批准或者不予批准的决定。予以批准的,颁发经营许可证;不予批准的,应当书面通知申请人并说明理由。申请人取得经营许可证后,应当持经营许可证向企业登记机关办理登记手续。

    第八条 从事非经营性互联网信息服务,应当向省、自治区、直辖市电信管理机构或者国务院信息产业主管部门办理备案手续。办理备案时,应当提交下列材料:
    (一)主办单位和网站负责人的基本情况;
    (二)网站网址和服务项目;
    (三)服务项目属于本办法第五条规定范围的,已取得有关主管部门的同意文件。

    省、自治区、直辖市电信管理机构对备案材料齐全的,应当予以备案并编号。

    第九条 从事互联网信息服务,拟开办电子公告服务的,应当在申请经营性互联网信息服务许可或者办理非经营性互联网信息服务备案时,按照国家有关规定提出专项申请或者专项备案。

    第十条 省、自治区、直辖市电信管理机构和国务院信息产业主管部门应当公布取得经营许可证或者已履行备案手续的互联网信息服务提供者名单。

     第十一条互联网信息服务提供者应当按照经许可或者备案的项目提供服务,不得超出经许可或者备案的项目提供服务。非经营性互联网信息服务提供者不得从事有偿服务。互联网信息服务提供者变更服务项目、网站网址等事项的,应当提前30日向原审核、发证或者备案机关办理变更手续。

    第十二条 互联网信息服务提供者应当在其网站主页的显著位置标明其经营许可证编号或者备案编号。

    第十三条 互联网信息服务提供者应当向上网用户提供良好的服务,并保证所提供的信息内容合法。

     第十四条从事新闻、出版以及电子公告等服务项目的互联网信息服务提供者,应当记录提供的信息内容及其发布时间、互联网地址或者域名;互联网接入服务提供者应当记录上网用户的上网时间、用户帐号、互联网地址或者域名、主叫电话号码等信息。互联网信息服务提供者和互联网接入服务提供者的记录备份应当保存60日,并在国家有关机关依法查询时,予以提供。

    第十五条 互联网信息服务提供者不得制作、复制、发布、传播含有下列内容的信息:
    (一)反对宪法所确定的基本原则的;
    (二)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;
    (三)损害国家荣誉和利益的;
    (四)煽动民族仇恨、民族歧视,破坏民族团结的;
    (五)破坏国家宗教政策,宣扬邪教和封建迷信的;
    (六)散布谣言,扰乱社会秩序,破坏社会稳定的;
 &nbs;  (七)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;
    (八)侮辱或者诽谤他人,侵害他人合法权益的;
    (九)含有法律、行政法规禁止的其他内容的。

    第十六条 互联网信息服务提供者发现其网站传输的信息明显属于本办法第十五条所列内容之一的,应当立即停止传输,保存有关记录,并向国家有关机关报告。

    第十七条 经营性互联网信息服务提供者申请在境内境外上市或者同外商合资、合作,应当事先经国务院信息产业主管部门审查同意;其中,外商投资的比例应当符合有关法律、行政法规的规定。

    第十八条国务院信息产业主管部门和省、自治区、直辖市电信管理机构,依法对互联网信息服务实施监督管理。新闻、出版、教育、卫生、药品监督管理、工商行政管理和公安、国家安全等有关主管部门,在各自职责范围内依法对互联网信息内容实施监督管理。

     第十九条违反本办法的规定,未取得经营许可证,擅自从事经营性互联网信息服务,或者超出许可的项目提供服务的,由省、自治区、直辖市电信管理机构责令限期改正,有违法所得的,没收违法所得,处违法所得3倍以上5倍以下的罚款;没有违法所得或者违法所得不足5万元的,处10万元以上100万元以下的罚款;情节严重的,责令关闭网站。违反本办法的规定,未履行备案手续,擅自从事非经营性互联网信息服务,或者超出备案的项目提供服务的,由省、自治区、直辖市电信管理机构责令限期改正;拒不改正的,责令关闭网站。

    第二十条制作、复制、发布、传播本办法第十五条所列内容之一的信息,构成犯罪的,依法追究刑事责任;尚不构成犯罪的,由公安机关、国家安全机关依照《中华人民共和国治安管理处罚条例》、《计算机信息网络国际联网安全保护管理办法》等有关法律、行政法规的规定予以处罚;对经营性互联网信息服务提供者,并由发证机关责令停业整顿直至吊销经营许可证,通知企业登记机关;对非经营性互联网信息服务提供者,并由备案机关责令暂时关闭网站直至关闭网站。

    第二十一条 未履行本办法第十四条规定的义务的,由省、自治区、直辖市电信管理机构责令改正;情节严重的,责令停业整顿或者暂时关闭网站。

    第二十二条 违反本办法的规定,未在其网站主页上标明其经营许可证编号或者备案编号的,由省、自治区、直辖市电信管理机构责令改正,处5000元以上5万元以下的罚款。

    第二十三条违反本办法第十六条规定的义务的,由省、自治区、直辖市电信管理机构责令改正;情节严重的,对经营性互联网信息服务提供者,并由发证机关吊销经营许可证,对非经营性互联网信息服务提供者,并由备案机关责令关闭网站。

    第二十四条 互联网信息服务提供者在其业务活动中,违反其他法律、法规的,由新闻、出版、教育、卫生、药品监督管理和工商行政管理等有关主管部门依照有关法律、法规的规定处罚。

     第二十五条电信管理机构和其他有关主管部门及其工作人员,玩忽职守、滥用职权、徇私舞弊,疏于对互联网信息服务的监督管理,造成严重后果,构成犯罪的,依法追究刑事责任;尚不构成犯罪的,对直接负责的主管人员和其他直接责任人员依法给予降级、撤职直至开除的行政处分。

    第二十六条 在本办法公布前从事互联网信息服务的,应当自本办法公布之日起60日内依照本办法的有关规定补办有关手续。

    第二十七条 本办法自公布之日起施行。 

- 作者: 干煸四季豆 2006年05月15日, 星期一 12:24  回复(0) |  引用(0) 加入博采