blogjava-凯发k8网页登录

blogjava-凯发k8网页登录http://www.blogjava.net/chenpengyi/category/3026.htmlmysql资料,java技术,管理思想,博弈论,ajax,xp极限编程,物流知识zh-cnthu, 01 nov 2007 07:40:03 gmtthu, 01 nov 2007 07:40:03 gmt60使用future模式完成耗时的背景作业[jdk1.5 concurrency]http://www.blogjava.net/chenpengyi/archive/2007/11/01/157464.html陈朋奕陈朋奕thu, 01 nov 2007 05:11:00 gmthttp://www.blogjava.net/chenpengyi/archive/2007/11/01/157464.htmlhttp://www.blogjava.net/chenpengyi/comments/157464.htmlhttp://www.blogjava.net/chenpengyi/archive/2007/11/01/157464.html#feedback0http://www.blogjava.net/chenpengyi/comments/commentrss/157464.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/157464.html
个人理解
future 模式就是在主线程中当需要进行比较耗时的作业,但不想阻塞主线程的作业时,将耗时作业交由 future 对象在后台中完成,当主线程将来(这个 future 的意义也就体现在这里了)需要时即可通过 future 对象获得已经作业对象。  

这里写了一个简单的例子来说明这种模式,其实写这个例子主要是自己想熟悉一下 jdk5 concurrency 包中 futuretask 的用法了。例子模拟的是一个会计算账的过程,主线程中已经获得其他帐户的总额了,为了不让主线程等待 privateaccount 返回而启用新的线程去处理,并使用 futuretask 对象来监控,最后需要计算总额的时候再尝试去获得 privateaccount 的信息。

 

代码如下:

 1 package  testcallable;
 2
 3 import  java.util.random;
 4 import  java.util.concurrent.callable;
 5 import  java.util.concurrent.executionexception;
 6 import  java.util.concurrent.futuretask;
 7
 8 /**
 9  *  @author  chenpengyi
10   */

11 public   class  sumaccountexample  {
12
13      public   static   void  main(string[] args)  {
14          //  init callable object and future task
15         callable paccount  =   new  privateaccount();
16         futuretask futuretask  =   new  futuretask(paccount);
17         
18          //  create a new thread to do so
19         thread paccountthread  =   new  thread(futuretask);
20         paccountthread.start();
21         
22          //  do something else in the main thread
23         system.out.println( " doing something else here. " );
24         
25          //  get the total money from other accounts 
26          int  totalmoney  =   new  random().nextint( 100000 );
27         system.out.println( " you have  "    totalmoney    "  in your other accounts. " );
28         system.out.println( " waiting for data from private account " );
29          //  if the future task is not finished, we will wait for it
30          while ( ! futuretask.isdone()) {
31              try   {
32                 thread.sleep( 5 );
33             }
  catch  (interruptedexception e)  {
34                 e.printstacktrace();
35             }

36         }

37         integer privataaccountmoney  =   null ;
38          //  since the future task is done, get the object back
39          try   {
40             privataaccountmoney  =  (integer)futuretask.get();
41         }
  catch  (interruptedexception e)  {
42             e.printstacktrace();
43         }
  catch  (executionexception e)  {
44             e.printstacktrace();
45         }

46         system.out.println( " the total moeny you have is  "    (totalmoney   privataaccountmoney.intvalue()));
47     }

48
49 }

50
51
52 class  privateaccount  implements  callable {
53
54     integer totalmoney;
55     
56     @override
57      public  integer call()  throws  exception  {
58          //  simulates a time conusimg task, sleep for 10s
59         thread.sleep( 10000 );
60         totalmoney  =   new  integer( new  random().nextint( 10000 ));
61         system.out.println( " you have  "    totalmoney    "  in your private account. " );
62          return  totalmoney;
63     }

64     
65 }

主线程获得了返回后即完成了总额的计算。

陈朋奕 2007-11-01 13:11 发表评论
]]>
java concurrency in practice java并发(线程)最佳书籍 【下载】http://www.blogjava.net/chenpengyi/archive/2007/10/18/153977.html陈朋奕陈朋奕thu, 18 oct 2007 10:46:00 gmthttp://www.blogjava.net/chenpengyi/archive/2007/10/18/153977.htmlhttp://www.blogjava.net/chenpengyi/comments/153977.htmlhttp://www.blogjava.net/chenpengyi/archive/2007/10/18/153977.html#feedback9http://www.blogjava.net/chenpengyi/comments/commentrss/153977.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/153977.html 好久没有上来更新过了,最近在学习线程池实现,参考了 tomcat jetty 的线程池的实现后,还是比较佩服他们的实现的,佩服瞬间突然回忆起来以前看过的书里面提到过 jdk1.5 带了 doug lea concurrency 包, doug lea 算是对 java 世界影响最大的人物之一了,其对 java 的贡献绝对超过 james gosling java 世界的“言论”巨头(我认为而已)。这位可爱的老教授为 jdk 中的 collection 和如今的 concurrency 包作出的贡献是不可估量的,同时他还是 dlmalloc 的作者,相信 c 背景的程序员对这个 malloc 的新实现会比较熟悉,还出过关于 java 并发的书,不过这里先不提啦,因为我看的不是这个,而是《 java concurrency in practice 》,这本书是多人合著的,作者中不乏牛人,有 joshua bloch effective java 作者)和 doug lea (不认识的, j )等等(中文中惯用的表示牛人多的说法)。

既然得到了好书就要分享一下,这里不多做介绍了,赶紧把电子版传上来跟大家分享一下。





陈朋奕 2007-10-18 18:46 发表评论
]]>
mysql新强大特性——事件,mysql dba必看!http://www.blogjava.net/chenpengyi/archive/2006/10/29/77931.html陈朋奕陈朋奕sun, 29 oct 2006 14:05:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/10/29/77931.htmlhttp://www.blogjava.net/chenpengyi/comments/77931.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/10/29/77931.html#feedback2http://www.blogjava.net/chenpengyi/comments/commentrss/77931.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/77931.html mysql的事件特性是一个相当有用的特性,特别对于mysql单机和集群的数据库管理员dba,相信是dba必定要掌握的知识。也肯定当mysql的dba学习完了这个特性后,将这个特性用好,可以给自己省下60%的工作量。
正文在mysql栏目中,已经做成pdf供大家下载了,地址是:
http://www.blogjava.net/chenpengyi/articles/77933.html

下面是一些内容节选:

设定事件并运行

我们从mysql downloads page上下载了mysql 5.1 beta版,安装到xp上,启动mysql服务,用root用户打开mysql客户端:

mysql> use test;

database changed

mysql> create table test.t (s1 timestamp);

query ok, 0 rows affected (0.11 sec)

 

mysql> create event e on schedule every 1 second do

       insert into test.t values (current_timestamp);

query ok, 1 row affected (0.00 sec)

 

mysql> set global event_scheduler = 1;

query ok, 0 rows affected (0.00 sec)

 

/* 3-second delay */

  mysql> select * from test.t;

---------------------

| s1                  |

---------------------

| 2006-04-05 15:44:26 |

| 2006-04-05 15:44:27 |

| 2006-04-05 15:44:28 |

---------------------

上面是mysql “事件”特性的“hello world”例子,给大家演示的是每隔一秒钟向行内插入一条时间的记录。



陈朋奕 2006-10-29 22:05 发表评论
]]>
mysql 5.1 提供xml内置支持(xpath)http://www.blogjava.net/chenpengyi/archive/2006/07/11/57578.html陈朋奕陈朋奕mon, 10 jul 2006 16:12:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/07/11/57578.htmlhttp://www.blogjava.net/chenpengyi/comments/57578.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/07/11/57578.html#feedback4http://www.blogjava.net/chenpengyi/comments/commentrss/57578.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/57578.html前些天说到了mysql5提供了内置的xml文件解析和修改函数,今天找了点mysql网站上的资料和例子,翻译了一下,希望能给使用数据库存储xml和xslt的同志一些帮助。
mysql 5.1.5版本中添加了对xml文档进行查询和修改的函数,分别是extractvalue()和updatexml(),下面是这两个函数的使用示例:
还是一样我们首先建立一个示例数据库,然后将范例中使用的xml文档输入到数据库中:
create table x (doc varchar(150));
insert into x values
('

a guide to the sql standard

cj
date


');
insert into x values
('

sql:1999

j
melton


');
大家可以看到,doc列的内容中包含了自己的层次结构,以xml格式体现包含书名和作者的书本,其中作者还包含名字简写大写以及姓。这是流行的排版和储存格式,字母"" 和"是标记,使用户更容易理解内部的层次结构。
下面先看看extractvalue()的用法吧
语法:
extractvalue (xml_document, xpath_string);
第一个参数:xml_document是string格式,为xml文档对象的名称,文中为doc
第二个参数:xpath_string (xpath格式的字符串) ,如果不了解xpath语法,可以在网上查找教程。
作用:从目标xml中返回包含所查询值的字符串
示例#e1:
mysql> select extractvalue(doc,'/book/author/initial') from x;
------------------------------------------
| extractvalue(doc,'/book/author/initial') |
------------------------------------------
| cj |
| j |
------------------------------------------
2 rows in set (0.01 sec)
可以看到,extractvalue()函数将/book/author/initial节点中的值取出来,并通过select返回。因此需要简单的查找xml文档中的值,只要在xpath_string参数中指定好层次和节点就行了。
示例#e2
mysql> select extractvalue(doc,'/*/*/initial') from x;
----------------------------------
| extractvalue(doc,'/*/*/initial') |
----------------------------------
| cj |
| j |
----------------------------------
2 rows in set (0.01 sec)
如果查询前并不知道层次关系,你也可以使用通配符进行层次的匹配,不过当xml文档比较大的时候查找速度会很慢滴。
示例#e3
mysql> select extractvalue(doc,'/book/child::*') from x;
---------------------------------------------
| extractvalue(doc,'/book/child::*') |
---------------------------------------------
| a guide to the sql standard |
| sql:1999 |
---------------------------------------------
2 rows in set (0.00 sec)
使用/book/child::语句我们可以找到book节点下的首个节点,文中是title。除了child以外,我们还有其他的参数:
child ... 指定节点的下一子节点)
descendant ... 节点下包含的所有层次中的数据
parent ... 指定节点的上一节点
ancestor ... 节点以上所有层次的数据
following-sibling ... 同一层次的下一个节点
preceding-sibling ... 同一层次的上一个节点
self ... 自身
示例#e4
mysql> select
extractvalue(doc,'/book/author/surname[self:text()="date"]') from x;
--------------------------------------------------------------
| extractvalue(doc,'/book/author/surname[self:text()="date"]') |
--------------------------------------------------------------
| date |
| |
--------------------------------------------------------------
2 rows in set (0.00 sec)
这里是一个使用条件表达式进行数据查找的例子,具体就不解释了,都是符合xpath语法的,大家可以参考一下xpath表达式的用法。
虽然上面的extractvalue()函数都使用在select列表中,其实该函数是可以使用在任何一个允许使用表达式的语句中的。
这里提示一点,使用这个函数可以轻松将xml文档列与全文检索结合起来。
来到updatexml()函数了
语法
updatexml (xml_document, xpath_string, new_value);
第一个参数:xml_document是string格式,为xml文档对象的名称,文中为doc
第二个参数:xpath_string (xpath格式的字符串) ,如果不了解xpath语法,可以在网上查找教程。
第三个参数:new_value,string格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
示例#u1
mysql> select updatexml(doc,'/book/author/initial','!!') from x;
----------------------------------------------------------
| updatexml(doc,'/book/author/initial','!!') |
----------------------------------------------------------
|

a guide to the sql standard

!!
date

|
|

sql:1999

!!
melton

|
----------------------------------------------------------
2 rows in set (0.00 sec)
updatexml函数的前两个参数用法以及写法与extractvalue是一样的,因为这里需要查找到符合条件的数据节点。第三个参数就是为了替换节点字符串的。文中我们就使用!!字符串替换了book/author/initial节点的值。返回值是整个改变后的xml文档。这里记住,由于我们使用的是select语句,因此并没有对真正的数据进行修改,而是在内存中将取出的数据进行修改然后返回给用户。如果需要彻底的修改文档内容,可以使用下面语句:
update x set doc = updatexml(doc,/book/author/initial','!!');
细心的人也许发现这里有一个错误,也许是bug,因为我们并不想修改结构化的文档,而仅仅需要修改内容,但updatexml函数将cj>整个文本改成了!!,这样就不是我们所想要的了,因为它改变了整个文档结构。因此如果你需要的仅仅是修改这个结构化文档的内容部分,而不是整个文本,可以使用:
updatexml(doc,'/book/author/initial','!!') from x;
示例#u2
mysql> select
extractvalue(
updatexml(doc,'/book/author/initial','!!'),'/book/author/
initial') from x;
---------------------------------------------------------------------------
--------------------------
|
extractvalue(
updatexml(doc,'/book/author/initial','!!'),'/book/author/
initial') |
---------------------------------------------------------------------------
--------------------------
| !!
|
| !!
|
---------------------------------------------------------------------------
--------------------------
2 rows in set (0.01 sec)
最后一个例子,extractvalue()函数和updatexml()函数的嵌套使用,结果是给我们展示将initial节点的值改成!!后选择查询initial节点的内容,结果大家也能看到了。
上面只是这两个函数的最基本用法,如果大家还需要更多的资料,或有一些自己的心得,欢迎一起讨论。


陈朋奕 2006-07-11 00:12 发表评论
]]>
使用skype免费拨打美国、加拿大国际长途http://www.blogjava.net/chenpengyi/archive/2006/07/09/57329.html陈朋奕陈朋奕sun, 09 jul 2006 04:11:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/07/09/57329.htmlhttp://www.blogjava.net/chenpengyi/comments/57329.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/07/09/57329.html#feedback6http://www.blogjava.net/chenpengyi/comments/commentrss/57329.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/57329.html     可能有心的 skype 用户也留意到了,前段时间 skype 给大家发了一封邮件,说什么可以免费拨打美国加拿大的固定电话和手机,但尝试了后都发现不成功,都提示需要 skype 的点数。那时候甚至看到有人说 skype 公司无耻,欺骗客户。但其实 skype 没有骗人,因为这项服务只提供给加拿大和美国的用户,让这些美加本地的人打本地的电话免费而已。
   
由此有一部分人展开了讨论, skype 是通过什么方式去限制其他地区的人呢?可能有人认为是通过账户信息上的国家名称,提出这个想法呢,就真的有点看不起 skype 公司人员的智商了,当然这是我开玩笑了。有网络知识的人也知道, skype 应该是通过 ip 地址的归属地去限制用户拨打国际长途的。因此就有了一系列的尝试,代理服务器等等的使用 skype 免费拨打国际长途的说话就来了。方法是很多的,所以我这里就举出我所知道的几个方法,如何使用 skype 拨打国际长途(仅限美国加拿大),这个虽然来说不属于 blogjava 的讨论内容,但对我们这些手头不阔绰的程序员来说是相当有用的,甚至可以考虑通过这个创业哦,因为如果你通过下面的方法架设好后,再开一个话吧,你需要的仅仅是一些跟电脑连通的话机和上网费用及电脑,然后就是很低的运营成本了。

 

方法 1

通过 vpn 网络,让自己在美国或加拿大的朋友为自己建立一个 vpn 的网络,然后拨号过去,再启动一个 skype ,就可以实现。够简单吧,呵呵,我说起来当然简单了,但做起来就不一定了。

这里最难的就是如何架设 vpn 网络了,首先讲怎么建立 vpn 服务器,其实这个在 xp 中就自带了,大家可以根据我的教程试试看。不过这里的 vpn 服务器一定要是美国加拿大本地的,你可以跟那里的朋友说好,让他 24 小时开机就可以了。

建立 vpn 网络服务器的连接教程如下:

微软的 vpn 教学如下:

而如何让客户端拨号到 vpn 网络的方法也很简单,步骤如下:

开始 --> 连接到 --> 显示所有连接或者是控制面板 --> 网络连接 --> 新建连接 --> 选择连接到我的工作场所的网络 --> 虚拟专用网络连接 --> 输入一个你想要工作场所的名字(随意输入) --> 如果你是拨号上网的用户,最好选择自动的初始连接为你的拨号连接,其他的就无所谓的  --> 然后输入你的主机的 ip 地址就 ok 了。

最后就是双击这个新的连接,输入你设置的用户名和密码就好了。

这里我补充一点,很多人想过使用代理服务器来实现,但必须保证你的 skype 的通向外网的连接都通过这个服务器实现。

 

方法 2

更简单,不需要设置什么 skype 专用的 vpn ,那就是使用 skype 的三方通话,首先让美加本地的一台电脑拨打你需要的那个号码,然后在邀请你的 skype 加入三方通话,这样你就可以实现拨打美加的电话了。其实这样也是很方便的,让对方的电脑给你开一个远程用户,你需要的时候只要登陆他的电脑,然后用 skype 拨打本地号码,接通后邀请国内的 skype 就可以了。

方法 3

还有很多灵活的方法,大家也可以提供讨论一下,最后的方法就是找我咯, ^_^ ,写信或者留言给我都行。



陈朋奕 2006-07-09 12:11 发表评论
]]>
精彩(看疯了)小说——《输赢》转载http://www.blogjava.net/chenpengyi/archive/2006/05/19/46939.html陈朋奕陈朋奕thu, 18 may 2006 16:42:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/05/19/46939.htmlhttp://www.blogjava.net/chenpengyi/comments/46939.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/05/19/46939.html#feedback8http://www.blogjava.net/chenpengyi/comments/commentrss/46939.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/46939.html 开火老兄的小说《输赢》确实不错,转过来给blogjava的兄弟看看。

这个小说已经在网上被看疯了,我个人觉得可以看看,以后不从事编程工作了就有用了。

我把前142回都收集了,为了方便大家观看,只分了四页,不用感谢我的,哈哈。

地址是:
http://www.blogjava.net/chenpengyi/category/11305.html

如果开火兄弟对转载有意见,可以给我写信,我立刻撤下。

陈朋奕 2006-05-19 00:42 发表评论
]]>
如何在工作中学习英文——忙里偷闲听英语电台http://www.blogjava.net/chenpengyi/archive/2006/05/14/46141.html陈朋奕陈朋奕sun, 14 may 2006 15:24:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/05/14/46141.htmlhttp://www.blogjava.net/chenpengyi/comments/46141.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/05/14/46141.html#feedback6http://www.blogjava.net/chenpengyi/comments/commentrss/46141.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/46141.html 如何在繁忙的工作中学习英文——忙里偷闲听英语电台

给大家介绍一个学习英语的好办法,一边做其他轻松的事情的时候戴上耳机听英语电台,这样比你听音乐好多了,而且还能让自己找到语感。所以这里给大家提供了部分这些电台的收听地址,希望能给各位blogjava的同事们带来点帮助。

这里需要大家安装realplayer,这些废话就不需要跟blogjava的兄弟们说了,不会就怪了。

澳大利亚 abc 在线英语广播电台

还可以的地方,推荐可以去。
 





美国 npr 在线英语广播电台

我个人比较喜欢的,因为新闻比较多,而且连接比较容易连上。
 





美国 bloomberg 在线英语广播电台

美国迪,不评论了,比较综合的
 




英国 bbc(1台) the best new music

最新最hot的外文音乐
 





英国 bbc(2台) the nation's favourite

全民公爱,呵呵,不是中国的,是英国的
 





英国 bbc(3台) live music and arts

现场音乐会等
 





英国 bbc (6 台)     playing what we like


音乐和新闻的
 




美国 cnn 在线英语广播电台

cnn,很出名的哦,不过这里只是topstory报告






英国 bbc(7台) comedy and drama

歌剧话剧台,听故事的地方
 




英国 bbc(asian network) british asian radio

bbc的亚洲电台,不过感觉india口音居多

 


英国bbc(wales威尔士)在线英语广播电台

这个速度一般,不过有晚上不错的音乐。:)
 



英国 bbc new black music

黑人电台?呵呵,估计是,听音乐风格就是






新西兰 rnzi 在线英语广播电台

不太熟悉的电台,有些新闻和音乐
 

希望能给大家带来一些帮助咯,如果各位有什么更好的方法一起讨论。


陈朋奕 2006-05-14 23:24 发表评论
]]>
受益终生的十大经典管理学定律[转]http://www.blogjava.net/chenpengyi/archive/2006/05/12/45752.html陈朋奕陈朋奕thu, 11 may 2006 16:27:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/05/12/45752.htmlhttp://www.blogjava.net/chenpengyi/comments/45752.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/05/12/45752.html#feedback1http://www.blogjava.net/chenpengyi/comments/commentrss/45752.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/45752.html     1、彼得原理 

  每个组织都是由各种不同的职位、等级或阶层的排列所组成,每个人都隶属于其中的某个等级。彼得原理是美国学者劳

 

·彼得在对组织中人员晋升的相关现象研究后,得出一个结论:在各种组织中,雇员总是趋向于晋升到其不称职的地位。彼得原理有时也被称为向上爬的原理。 这种现象在现实生活中无处不在:一名称职的教授被提升为大学校长后,却无法胜任;一个优秀的运动员被提升为主管体育的官员,而无所作为。对一个组织而言,一旦相当部分人员被推到其不称职的级别,就会造成组织的人浮于事,效率低下,导致平庸者出人头地,发展停滞。因此,这就要求改变单纯的根据贡献决定晋升的企业员工晋升机制,不能因某人在某个岗位上干得很出色,就推断此人一定能够胜任更高一级的职务。将一名职工晋升到一个无法很好发挥才能的岗位,不仅不是对本人的奖励,反而使其无法很好发挥才能,也给企业带来损失。

  2、酒与污水定律

  酒与污水定律是指把一匙酒倒进一桶污水,得到的是一桶污水;如果把一匙污水倒进一桶酒,得到的还是一桶污水。在任何组织里,几乎都存在几个难弄的人物,他们存在的目的似乎就是为了把事情搞糟。最糟糕的是,他们像果箱里的烂苹果,如果不及时处理,它会迅速传染,把果箱里其他苹果也弄烂。 烂苹果的可怕之处,在于它那惊人的破坏力。一个正直能干的人进入一个混乱的部门可能会被吞没,而一个无德无才者能很快将一个高效的部门变成一盘散沙。组织系统往往是脆弱的,是建立在相互理解、妥协和容忍的基础上的,很容易被侵害、被毒化。破坏者能力非凡的另一个重要原因在于,破坏总比建设容易。一个能工巧匠花费时日精心制作的陶瓷器,一头驴子一秒钟就能毁坏掉。如果一个组织里有这样的一头驴子,即使拥有再多的能工巧匠,也不会有多少像样的工作成果。如果你的组织里有这样的一头驴子,你应该马上把它清除掉,如果你无力这样做,就应该把它拴起来。

  3、木桶定律

  水桶定律是讲一只水桶能装多少水,这完全取决于它最短的那块木板。这就是说任何一个组织,可能面临的一个共同问题,即构成组织的各个部分往往是优劣不齐的,而劣势部分往往决定整个组织的水平。水桶定律与酒与污水定律不同,后者讨论的是组织中的破坏力量,最短的木板却是组织中有用的一个部分,只不过比其他部分差一些,你不能把它们当成烂苹果扔掉。强弱只是相对而言的,无法消除,问题在于你容忍这种弱点到什么程度,如果严重到成为阻碍工作的瓶颈,你就不得不有所动作。

  4、马太效应

  《新约·马太福音》中有这样一个故事:一个国王远行前,交给3个仆人每人一锭银子,吩咐道:你们去做生意,等我回来时,再来见我。国王回来时,第一个仆人说:主人,你交给我的一锭银子,我已赚了10锭。于是,国王奖励他10座城邑。第二个仆人报告:主人,你给我的一锭银子,我已赚了5锭。于是,国王奖励他5座城邑。第三仆人报告说:主人,你给我的1锭银子,我一直包在手帕里,怕丢失,一直没有拿出来。于是,国王命令将第三个仆人的1锭银子赏给第一个仆人,说:凡是少的,就连他所有的,也要夺过来。凡是多的,还要给他,叫他多多益善,这就是马太效应,反应当今社会中存在的一个普遍现象,即赢家通吃。对企业经营发展而言,马太效应告诉我们,要想在某一个领域保持优势,就必须在此领域迅速做大。当你成为某个领域的领头羊时,即便投资回报率相同,你也能更轻易地获得比弱小的同行更大的收益。而若没有实力迅速在某个领域做大,就要不停地寻找新的发展领域,才能保证获得较好的回报。

  5、零和游戏原理

  零和游戏是指一项游戏中,游戏者有输有赢,一方所赢正是另一方所输,游戏的总成绩永远为零,零和游戏原理之所以广受关注,主要是因为人们在社会的方方面面都能发现与零和游戏类似的局面,胜利者的光荣后面往往隐藏着失败者的辛酸和苦涩。 20世纪,人类经历两次世界大战、经济高速增长,科技进步、全球一体化以及日益严重的环境污染,零和游戏观念正逐渐被双赢观念所取代。人们开始认识到利已不一定要建立在损人的基础上。通过有效合作皆大欢喜的结局是可能出现的。但从零和游戏走向双赢,要求各方面要有真诚合作的精神和勇气,在合作中不要小聪明,不要总想占别人的小便宜,要遵守游戏规则,否则双赢的局面就不可能出现,最终吃亏的还是合作者自己。

  6、华盛顿合作规律

  华盛顿合作规律说的是一个人敷衍了事,两个人互相推诿,三个人则永无成事之日。多少有点类似于我们三个和尚的故事。人与人的合作,不是人力的简单相加,而是要复杂和微妙得多。在这种合作中,假定每个人的能力都为1,那么,10个人的合作结果有时比10大得多,有时,甚至比1还要小。因为人不是静止物,而更像方向各异的能量,相互推动时,自然事半功倍,相互抵触时,则一事无成。 我们传统的管理理论中,对合作研究得并不多,最直观的反映就是,目前的大多数管理制度和行为都是致力于减少人力的无谓消耗,而非利用组织提高人的效能。换言之,不妨说管理的主要目的不是让每个人做得更好,而是避免内耗过多。

  7、手表定理

  手表定理是指一个人有一只表时,可以知道现在是几点钟,当他同时拥有两只表时,却无法确定。两只手表并不能告诉一个人更准确的时间,反而会让看表的人失去对准确时间的信心。手表定理在企业经营管理方面,给我们一种非常直观的启发,就是对同一个人或同一个组织的管理,不能同时采用两种不同的方法,不能同时设置两个不同的目标,甚至每一个人不能由两个人同时指挥,否则将使这个企业或这个人无所适从。手表定理所指的另一层含义在于,每个人都不能同时选择两种不同的价值观,否则,你的行为将陷于混乱。

  8、不值得定律

  不值得定律最直观的表述是:不值得做的的事情,就不值得做好。这个定律再简单不过了,重要性却时时被人们忽视遗忘。不值得定律反映人们的一种心理,一个人如果从事的是一份自认为不值得做的事情,往往会保持冷嘲热讽,敷衍了事的态度,不仅成功率低,而且即使成功,也不觉得有多大的成就感。 因此,对个人来说,应在多种可供选择的奋斗目标及价值观中挑选一种,然后为之奋斗。选择你所爱的,爱你所选择的,才可能激发我们的斗志,也可以心安理得。而对一个企业或组织来说,则要很好地分析员工的性格特性,合理分配工作,如让成就欲较强的职工单独或牵头完成具有一定风险和难度的工作,并在其完成时,给予及时的肯定和赞扬;让依附欲较强的职工,更多地参加到某个团体*同工作;让权力欲较强的职工,担任一个与之能力相适应的主管。同时要加强员工对企业目标的认同感,让员工感觉到自己所做的工作是值得的,这样才能激发职工的热情。

  9、蘑菇管理

  蘑菇管理是许多组织对待初出茅庐者的一种管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。相信很多人都有过这样一段蘑菇的经历,这不一定是什么坏事,尤其是当一切刚刚开始的时候,当几天蘑菇,能够消除我们很多不切实际的幻想,让我们更加接近现实,看问题也更加实际。一个组织,一般对新进的人员都是一视同仁,从起薪到工作都不会有大的差别。无论你是多么优秀的人才,在刚开始的时候,都只能从最简单的事情做起,蘑菇的经历,对于成长中的年轻人来说,就象蚕茧,是羽化前必须经历的一步。所以,如何高效率地走过生命的这一段,从中尽可能汲取经验,成熟起来,并树立良好的值得信赖的个人形象,是每个刚入社会的年轻人必须面对的课题。

  10、奥卡姆剃刀定律

  12世纪,英国奥卡姆的威廉主张唯名论,只承认确实存在的东西,认为那些空洞无物的普遍性概念都是无用的累赘,应当被无情地剃除。他主张如无必要,勿增实体。这就是常说的奥卡姆剃刀。这把剃刀曾使很多人感到威胁,被认为是异端邪说,威廉本人也因此受到迫害。然而,并未损害这把刀的锋利,相反,经过数百年的岁月,奥卡姆剃刀已被历史磨得越来越快,并早已超载原来狭窄的领域,而具有广泛、丰富、深刻的意义。  奥卡姆剃刀定律在企业管理中可进一步演化为简单与复杂定律:把事情变复杂很简单,把事情变简单很复杂。这个定律要求,我们在处理事情时,要把握事情的主要实质,把握主流,解决最根本的问题,尤其要顺应自然,不要把事情人为地复杂化,这样才能把事情处理好。

陈朋奕 2006-05-12 00:27 发表评论
]]>
通过分区(partition)提升mysql性能[原创翻译]http://www.blogjava.net/chenpengyi/archive/2006/05/05/44631.html陈朋奕陈朋奕fri, 05 may 2006 06:39:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/05/05/44631.htmlhttp://www.blogjava.net/chenpengyi/comments/44631.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/05/05/44631.html#feedback4http://www.blogjava.net/chenpengyi/comments/commentrss/44631.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/44631.html阅读全文

陈朋奕 2006-05-05 14:39 发表评论
]]>
mustang jvm(1.6)与tiger jvm(1.5)单项性能测试http://www.blogjava.net/chenpengyi/archive/2006/05/01/44279.html陈朋奕陈朋奕mon, 01 may 2006 08:00:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/05/01/44279.htmlhttp://www.blogjava.net/chenpengyi/comments/44279.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/05/01/44279.html#feedback7http://www.blogjava.net/chenpengyi/comments/commentrss/44279.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/44279.html阅读全文

陈朋奕 2006-05-01 16:00 发表评论
]]>
面向服务的体系结构概述(转自ibm developerworks)http://www.blogjava.net/chenpengyi/archive/2006/04/19/42023.html陈朋奕陈朋奕wed, 19 apr 2006 15:29:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/04/19/42023.htmlhttp://www.blogjava.net/chenpengyi/comments/42023.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/04/19/42023.html#feedback2http://www.blogjava.net/chenpengyi/comments/commentrss/42023.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/42023.html 下面是来自ibm的关于soa的一篇好文,以前念书的时候看过,不是特别理解,今天翻出来再看看感觉真的讲的很不错。很多人对soa的理解更多的只是在听说的程度,因此听得很多,但却实际并不是很了解到底什么是soa,所以希望借这篇文章跟大家分享对soa的理解和作为自己重新加深理解的学习笔记,同时能大家一起讨论一下。
相信大家看了这篇文章后能对soa有个更清晰的看法。
, international technical support organization, raleigh center

2004 年 6 月 01 日

在这一节中,我们简要地描述了面向服务的体系结构的发展。然后,我们探究了面向组件的开发与面向服务的体系结构之间的关系,并且说明了如何将组件作为实现服务的基础设施。

虽然 it 经理一直面临着削减成本和最大限度地利用现有技术的难题,但是与此同时,他们还必须不断地努力,以期更好地服务客户,更快地响应企业战略重点,从而赢得更大的竞争力。

在所有这些压力之下,有两个基本的主题:异构和改变。现在,大多数企业都有各种各样的系统、应用程序以及不同时期和技术的体系结构。集成来自多个厂商跨不同平台的产品简直就像一场噩梦。但是我们也不能单单使用一家厂商的产品,因为改变应用程序套件和支持基础设施是如此之难。

在当今 it 经理面临的问题之中,改变是第二个主题。全球化和电子商务加快了改变的步伐。全球化带来了激烈的竞争,产品周期缩短了,每个公司都想赢得超过竞争对手的优势。在竞争产品和可以从 internet 上获得的大量产品信息的推动下,客户要求更快速地进行改变。因而,在改进产品和服务方面展开的竞争进一步加剧了。

为了满足客户提出的越来越多的新要求,技术方面的改进也在不断地加快。企业必须快速地适应这种改变,否则就难以生存,更别提在这个动荡不安竞争激烈的环境中取得成功了,而 it 基础设施必须支持企业提高适应能力。

因此,企业组织正在从上世纪八十年代或更早的时期的相互隔离的垂直业务部门,到上世纪八十年代和九十年代关注业务流程的水平结构,向新的生态系统业务范例发展。重点是扩展供应链,支持客户和凯发k8网页登录的合作伙伴访问业务服务。第 19 页的图 2-1 展示了企业的这种发展。




我如何使我的 it 环境更灵活且更快地响应不断改变的业务需求呢? 我们如何使这些异构系统和应用程序尽可能无缝地进行通信呢?我们如何达到企业目标而不使企业走向破产的深渊呢?

it 响应者/支持者是随着企业的这种发展而并行发展的,如图 2-2 所示。现在,许多 it 经理和专业人员都同样相信,我们真的快找到了一种满意的答案——面向服务的体系结构。

图 2-2 体系结构的发展




为了减少异构性、互操作性和不断改变的要求的问题,这样的体系结构应该提供平台来构建具有下列特征的应用程序服务:

  • 松散耦合
  • 位置透明
  • 协议独立

基于这样的面向服务的体系结构,服务使用者甚至不必关心与之通信的特定服务,因为底层基础设施或服务“总线”将代表使用者做出适当的选择。基础设施对请求者隐藏了尽可能多的技术。特别地,来自不同实现技术(如 j2ee 或 .net)的技术规范不应该影响 soa 用户。如果已经存在一个服务实现,我们就还应该重新考虑用一个“更好”的服务实现来代替,新的服务实现必须具有更好的服务质量。




 


自从“软件危机”促进软件工程的开创以来,it 界一直在努力寻求解决上述问题的方案。在过去几年里,下面简要概述的核心技术进展使我们走到了今天。我们将简要讨论这些核心技术,而我们重点关注的将是这些技术如何帮助解决 it 问题。

在“applying uml and patterns - an introduction to object-oriented analysis and design”中,larman 将面向对象的分析和设计的本质描述为“从对象(物体、概念或实体)的角度考虑问题域和逻辑凯发天生赢家一触即发官网的解决方案”。在“object-oriented softwareengineering: a use case driven approach”中,jacobson 等将这些对象定义为“特点在于具有许多操作和状态(记忆这些操作的影响)的物体”。

在面向对象的分析中,这样的对象是用问题域来标识和描述的,而在面向对象的设计中,它们转变成逻辑软件对象,这些对象最终将用面向对象的编程语言进行实现。

通过面向对象的分析和设计,可以封装对象(或对象组)的某些方面,以简化复杂业务场景的分析。为了降低复杂性,也可以抽象对象的某些特征,这样就可以只捕获重要或本质的方面。

基于组件的设计并不是一种新技术。它是从对象范例中自然发展而来的。在面向对象的分析和设计的早期,细粒度的对象被标榜为提供“重用”的机制,但是这样的对象的粒度级别太低了,没有适当的标准可以用来使重用广泛应用于实践之中。在应用程序开发和系统集成中,粗粒度组件越来越成为重用的目标。这些粗粒度对象通过内聚一些更细粒度的对象来提供定义良好的功能。通过这种方式,还可以将打包的凯发天生赢家一触即发官网的解决方案套件封装成这样的“组件”。

一旦组织在更高层次上实现了基于完全独立的功能组件的完备体系结构,就可以将支持企业的应用程序划分成一组粒度越来越大的组件。可以将组件看作是打包、管理和公开服务的机制。它们可以共同使用一组技术:实现企业级用况的大粒度企业组件可以通过更新的面向对象的软件开发与遗留系统相结合来实现

在“component-based development for enterprise systems”中,allen 涉及了服务的概念,“它是将组件描述成提供相关服务的物理黑盒封装的可执行代码单元。它的服务只能通过一致的已发布接口(它包括交互标准)进行访问。组件必须能够连接到其他组件(通过通信接口)以构成一个更大的组”。服务通常实现为粗粒度的可发现软件实体,它作为单个实例存在,并且通过松散耦合的基于消息通信模型来与应用程序和其他服务交互。第 22 页的图 2-3 展示了重要的面向服务术语:

  • 服务:逻辑实体,由一个或多个已发布接口定义的契约。
  • 服务提供者:实现服务规范软件实体。
  • 服务使用者(或请求者):调用服务提供者的软件实体。传统上,它称为“客户端”。服务使用者可以是终端用户应用程序或另一个服务。
  • 服务定位器:一种特殊类型的服务提供者,它作为一个注册中心,允许查找服务提供者接口和服务位置。
  • 服务代理:一种特殊类型的服务提供者,它可以将服务请求传送到一个或多个其他的服务提供者。




在组件和服务开发中,都需要进行接口设计,这样软件实体就可以实现和公开其定义的关键部分。因此,在基于组件和面向服务的系统中,“接口”的概念对于成功的设计非常关键。下面是一些与接口有关的重要定义:

  • 接口:定义一组公共方法签名,它按照逻辑分组但是没有提供实现。接口定义服务的请求者和提供者之间的契约。接口的任何实现都必须提供所有的方法。
  • 已发布接口:一种可唯一识别和可访问的接口,客户端可以通过注册中心来发现它。
  • 公共接口:一种可访问的接口,可供客户端使用,但是它没有发布,因而需要关于客户端部分的静态知识。
  • 双接口:通常是成对开发的接口,这样,一个接口就依赖于另一个接口;例如,客户端必须实现一个接口来调用请求者,因为该客户端接口提供了某些回调机制。

第 23 页的图 2-4 定义了客户关系管理 (crm) 服务的 uml 定义,它表示为一个 uml 组件,实现接口 accountmanagement、contactmanagement 和 systemsmanagement。在这些接口中只有头两个接口是已发布接口,不过,后者是公共接口。注意,systemsmanagement 接口和 managementservice 接口构成了双接口。crmservice 可以实现许多这样的接口,但是它以多种方式行为的能力取决于客户端在行为的实现方面是否允许有大的灵活性。甚至有可能给特定类型的客户端提供不同或附加的服务。在一些运行时环境中,这样的功能也用于在单个组件或服务上支持相同接口的不同版本。




如前所述,面向对象的技术和语言是实现组件的极好方式。虽然组件是实现服务的最好方法,但是您必须理解的一点是,好的基于组件的应用程序未必就构成好的面向服务的应用程序。一旦理解了服务在应用程序体系结构中所起的作用,组件开发人员就很有可能会利用现有的组件。进行这种转变的关键是认识到面向服务的方法意味着附加的应用程序体系结构层。第 24 页中的图 2-5 演示了如何将技术层应用于程序体系结构以提供粒度更粗的实现(它更靠近应用程序的使用者)。为称呼系统的这一部分而创造的术语是“应用程序边界”,它反映了服务是公开系统的外部视图的极好方法的事实(通过内部重用并结合使用传统组件设计)。







 


面向服务的体系结构提供了一种方法,通过这种方法,可以构建分布式系统来将应用程序功能作为服务提供给终端用户应用程序或其他服务。其组成元素可以分成功能元素和服务质量元素。第 25 页的图 2-6 展示了体系结构堆栈以及在一个面向服务的体系结构可能观察到的元素。

注意:面向服务的体系结构堆栈可能是一个容易引起争议的问题,因为各方面的支持者已经提出了几种不同的堆栈。我们的堆栈不是作为服务堆栈提出的。我们之所以在此提出它,是因为我们想要搭建一个有用的框架,在本书的剩余章节中,我们将通过这个框架来组织对 soa 的讨论。




体系结构堆栈分成两半,左边的一半集中于体系结构的功能性方面,而右边的一半集中于体系结构的服务质量方面。这些元素详细描述如下:

功能性方面包括:

  • 传输是一种机制,用于将来自服务使用者的服务请求传送给服务提供者,并且将来自服务提供者的响应传送给服务使用者。
  • 服务通信协议是一种经过协商的机制,通过这种机制,服务提供者和服务使用者可以就将要请求的内容和将要返回的内容进行沟通。
  • 服务描述是一种经过协商的模式,用于描述服务是什么、应该如何调用服务以及成功地调用服务需要什么数据。
  • 服务描述实际可供使用的服务。
  • 业务流程是一个服务的集合,可以按照特定的顺序并使用一组特定的规则进行调用,以满足业务要求。注意,可以将业务流程本身看作是服务,这样就产生了业务流程可以由不同粒度的服务组成的观念。
  • 服务注册中心是一个服务和数据描述的存储库,服务提供者可以通过服务注册中心发布它们的服务,而服务使用者可以通过服务注册中心发现或查找可用的服务。服务注册中心可以给需要集中式存储库的服务提供其他的功能。

服务质量方面包括:

  • 策略是一组条件和规则,在这些条件和规则之下,服务提供者可以使服务可用于使用者。策略既有功能性方面,也有与服务质量有关的方面;因此,我们在功能和服务质量两个区中都有策略功能。
  • 安全性是规则集,可以应用于调用服务的服务使用者的身份验证、授权和访问控制。
  • 传输是属性集,可以应用于一组服务,以提供一致的结果。例如,如果要使用一组服务来完成一项业务功能,则所有的服务必须都完成,或者没有一个完成。
  • 管理是属性集,可以应用于管理提供的服务或使用的服务。

图 2-7 展示了面向服务的体系结构中的协作。这些协作遵循“查找、绑定和调用”范例,其中,服务使用者执行动态服务定位,方法是查询服务注册中心来查找与其标准匹配的服务。如果服务存在,注册中心就给使用者提供接口契约和服务的端点地址。下图展示了面向服务的体系结构中协作支持“查找、绑定和调用”范例的实体。




面向服务的体系结构中的角色包括:

  • 服务使用者:服务使用者是一个应用程序、一个软件模块或需要一个服务的另一个服务。它发起对注册中心中的服务的查询,通过传输绑定服务,并且执行服务功能。服务使用者根据接口契约来执行服务。
  • 服务提供者:服务提供者是一个可通过网络寻址的实体,它接受和执行来自使用者的请求。它将自己的服务和接口契约发布到服务注册中心,以便服务使用者可以发现和访问该服务。
  • 服务注册中心:服务注册中心是服务发现的支持者。它包含一个可用服务的存储库,并允许感兴趣的服务使用者查找服务提供者接口。

面向服务的体系结构中的每个实体都扮演着服务提供者、使用者和注册中心这三种角色中的某一种(或多种)。面向服务的体系结构中的操作包括:

  • 发布:为了使服务可访问,需要发布服务描述以使服务使用者可以发现和调用它。
  • 发现:服务请求者定位服务,方法是查询服务注册中心来找到满足其标准的服务。
  • 绑定和调用:在检索完服务描述之后,服务使用者继续根据服务描述中的信息来调用服务。

面向服务的体系结构中的构件包括:

  • 服务:可以通过已发布接口使用服务,并且允许服务使用者调用服务。
  • 服务描述:服务描述指定服务使用者与服务提供者交互的方式。它指定来自服务的请求和响应的格式。服务描述可以指定一组前提条件、后置条件和/或服务质量 (qos) 级别。

除了动态服务发现和服务接口契约的定义之外,面向服务的体系结构还具有以下特征:

  • 服务是自包含和模块化的。
  • 凯发k8网页登录的服务支持互操作性。
  • 服务是松散耦合的。
  • 服务是位置透明的。
  • 服务是由组件组成的组合模块。

这些特征也是满足电子商务按需操作环境的要求的主要特征,如第 301 页“e-business on demand and service-oriented architecture”所定义的。

最后,我们需要说明的是,面向服务的体系结构并不是一个新的概念。如图 2-8 所示,面向服务的体系结构所涉及的技术至少包括 corba、dcom 和 j2ee。面向服务的体系结构的早期采用者还曾成功地基于消息传递系统(如 ibm websphere mq)创建过他们自己的面向服务企业体系结构。最近,soa 的活动舞台已经扩展到包括 world wide web (www) 和 web 服务。




在面向服务的体系结构中,映射到业务功能的服务是在业务流程分析的过程中确定的。服务可以是细粒度的,也可以是粗粒度的,这取决于业务流程。每个服务都有定义良好的接口,通过该接口就可以发现、发布和调用服务。 企业可以选择将自己的服务向外发布到业务凯发k8网页登录的合作伙伴,也可以选择在组织内部发布服务。服务还可以由其他服务组合而成。

服务是粗粒度的处理单元,它使用和产生由值传送的对象集。它与编程语言术语中的对象不同。相反,它可能更接近于业务事务(如 cics 或 ims 事务)的概念而不是远程 corba 对象的概念。

服务是由一些组件组成的,这些组件一起工作,共同提供服务所请求的业务功能。因此,相比之下,组件比服务的粒度更细。另外,虽然服务映射到业务功能,但是组件通常映射到业务实体和操作它们的业务规则。作为一个示例,让我们看一看 ws-i 供应链管理(ws-i supply chain management)样本的定购单(purchaseorder)组件模型,如图 2-9 所示。




在基于组件的设计中,可以创建组件来严格匹配业务实体(如顾客(customer)、定购单(purchase order)、定购项(order item)),并且封装匹配这些实体所期望的行为的行为。

例如,定购单(purchase order)组件提供获取关于已定购的产品列表和定购的总额的信息的功能;定购项(order item)组件提供获取关于已定购的产品的数量和价格的信息的功能。每个组件的实现都封装在接口的后面。因此,定购单(purchase order)组件的用户不知道定购单(purchase order)表的模式、计算税金的算法、以及定单总额中的回扣和/或折扣。

在面向服务的设计中,不能基于业务实体设计服务。相反,每个服务都是管理一组业务实体中的操作的完整单元。例如,顾客服务将响应来自任何其他系统或需要访问顾客信息的服务的请求。顾客服务可以处理更新顾客信息的请求;添加、更新、删除投资组合;以及查询顾客的定单历史。顾客服务拥有所有与它管理的顾客有关的数据,并且能够代表调用方进行其他服务查询,以提供统一的顾客服务视图。这意味着服务是一个管理器对象,它创建和管理它的一组组件。




 


如前所述,企业正在处理两个问题:迅速地改变的能力和降低成本的要求。为了保持竞争力,企业必须快速地适应内部因素(如兼并和重组)或外部因素(如竞争能力和顾客要求)。需要经济而灵活的 it 基础设施来支持企业。

我们可以认识到,采用面向服务的体系结构将给我们带来几方面的好处,有助于我们在今天这个动荡的商业环境中取得成功:

soa 提供了一个抽象层,通过这个抽象层,企业可以继续利用它在 it 方面的投资,方法是将这些现有的资产包装成提供企业功能的服务。组织可以继续从现有的资源中获取价值,而不必重新从头开始构建。

在面向服务的体系结构中,集成点是规范而不是实现。这提供了实现透明性,并将基础设施和实现发生的改变所带来的影响降到最低限度。通过提供针对基于完全不同的系统构建的现有资源和资产的服务规范,集成变得更加易于管理,因为复杂性是隔离的。当更多的企业一起协作提供价值链时,这会变得更加重要。

从现有的服务中组合新的服务的能力为需要灵活地响应苛刻的商业要求的组织提供了独特的优势。通过利用现有的组件和服务,可以减少完成软件开发生命周期(包括收集需求、进行设计、开发和测试)所需的时间。这使得可以快速地开发新的业务服务,并允许组织迅速地对改变做出响应和减少上市准备时间。

通过以松散耦合的方式公开的业务服务,企业可以根据业务要求更轻松地使用和组合服务。这意味资源副本的减少、以及重用和降低成本的可能性的增加。

通过 soa,企业可以未雨绸缪,为未来做好充分的准备。soa 业务流程是由一系列业务服务组成的,可以更轻松地创建、修改和管理它来满足不同时期的需要。

soa 提供了灵活性和响应能力,这对于企业的生存和发展来说是至关重要的。但是面向服务的体系结构决不是灵丹妙药,而迁移到 soa 也并非一件可以轻而易举就完成的事情。请别指望一个晚上就将整个企业系统迁移到面向服务的体系结构,我们推荐的方法是,在业务要求出现或露出苗头时迁移企业功能的适当部分。



陈朋奕 2006-04-19 23:29 发表评论
]]>
soa的三个方面http://www.blogjava.net/chenpengyi/archive/2006/04/08/39957.html陈朋奕陈朋奕sat, 08 apr 2006 03:18:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/04/08/39957.htmlhttp://www.blogjava.net/chenpengyi/comments/39957.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/04/08/39957.html#feedback45http://www.blogjava.net/chenpengyi/comments/commentrss/39957.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/39957.html soa 的三个方面(译)

原始 url:

这两天看到了一篇不错的关于 soa 的文章,不敢独享,只可惜是 e 文,所以抽空翻译了一下,跟大家分享。

 

以下为本博客使用说明

我们的 blogjava 博客特别为大家的方便阅读提供了以下快捷功能:

需要查找关键字―――――――――――――――――请按 ctrl f

想以后还能看(添加到收藏夹)――――――――――请按 ctrl d

想刷新一下网页内容―――――――――――――――请按 f5

(应该不需要的,因为 blogjava 已经完全实现了 ajax

想保存到硬盘上―――――――――――――――――请按 ctrl s

需要调用本地( jini )服务查看源代码――――――――在网页空白处点击鼠标右键+ v

不想看了――――――――――――――――――――请按 alt f4

如果是标签页浏览器―――――――――――――――请按 ctrl w

 

实话说,我们比 google gmail 还早实现方便的快捷方式,厉害吧。这里不需要对我表示敬意,只需要对博客的建设者 dudu 老兄留言表示一下感谢就好了。

 

在开始的时候先介绍一下 soa 的概念。

 

什么是 soa

 

soa 的全称是 service oriented architecture ,面向服务架构。

 

她是指为了解决在 internet 环境下业务集成的需要,通过连接能完成特定任务的独立功能实体实现的一种软件系统架构。这句话的意思就是 soa 不是一门语言或具体的技术,而是一种软件的系统架构,应该说更像一种模式,是一种为了解决复杂的 internet 业务应用而提出的一种体系结构(在我感觉里,这种架构的提出更像 mvc 模式的提出,不过我们总喜欢用模式啊,架构啊的话来体现自己是行业内专业的人,但其实无论说是模式还是架构,这都只是一些名词,如果组合现拥有的技术去实现自己的应用才是最有用的,就不用多谈所谓的架构还是模式了)。

 

译文 ( 翻译:陈朋奕,如果有错误请来我的博客指出 )

 

在做软件开发的人,架构这个词经常被用在三种不同的场合中:应用体系架构( application architecture ),基础体系架构 (infrastructure architecture) 以及企业架构体系 (enterprise architecture) 。而 soa 的概念横跨了这三种体系,然而很多人在谈到 soa 的时候总喜欢不自觉的把 soa 跟其中的一种混为一谈。

 

譬如开发者大多对如何建立 soa 应用感兴趣,因此他们关注的趋向更多是 soa 中的应用程序的体系架构方面。而 web serivces 管理工具的卖主一般认为 soa 主要是关于基础组件体系结构的,同样的,用户群体会认为 soa 是用于企业业务应用结构的。

 

这三种观点都是有意义的,因为这映射了 soa 的三个应用层面。下面是关于这三个方面的一些简单的讲解:

 

―――― soa 应用体系架构:是建立 soa 服务的指导、模式以及实现的方法。关注面向服务软件平台和个体应用的开发者会特别强调这个方面。如 microsoft’s windows communication foundation wcf 微软视窗通讯基础组件)以及最近提出的 service component architecture (sca 服务构件体系 ) 就是跟 soa 这个方面的应用实现。

 

―――― soa 基础体系架构:是管理和操作 soa 服务的指导、模式以及实现的方法。 soa 的大思想家们有时也会承认自己在这个方面有不足,但真正去实现这些功能的人却知道这些方面的重要性。一般来说,卖主会特别喜欢把关注点和行动实现集中在这里。

 

―――― soa 业务体系架构:利用 soa 并从 soa 中获得商业利益的指导、模式以及实现的方法。而关于技术的讨论仍然会在这里出现,但更多的关注点已经转移到了人的身上(以人为本?事实上,我对 soa 面临的最大挑战是人的观点——人通常比技术更多问题——有一些自己的看法)。不过,来自 zapthink 的分析家们通常对 soa 提出的建议都是在强调这个方面。

 

       我看到过很多人关于 soa 的意义(甚至是价值)的争论,其实他们的争论只是关于应用程序体系架构主导还是企业体系架构主导而已。这些专业术语仅仅是在我们都认同的情况下才会体现其价值的,因此当别人在讨论这个被过度使用的术语的时候我们应该保持清晰的思路,清楚我们到底讲的是什么才是我们应该把握的方向。



陈朋奕 2006-04-08 11:18 发表评论
]]>
计算机缩写术语完全介绍(转自chinaunix)http://www.blogjava.net/chenpengyi/archive/2006/04/08/39953.html陈朋奕陈朋奕sat, 08 apr 2006 02:26:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/04/08/39953.htmlhttp://www.blogjava.net/chenpengyi/comments/39953.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/04/08/39953.html#feedback0http://www.blogjava.net/chenpengyi/comments/commentrss/39953.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/39953.html阅读全文

陈朋奕 2006-04-08 10:26 发表评论
]]>
java 6 mustang 从老虎变成了野马……好事还是坏事?http://www.blogjava.net/chenpengyi/archive/2006/04/02/38674.html陈朋奕陈朋奕sat, 01 apr 2006 17:06:00 gmthttp://www.blogjava.net/chenpengyi/archive/2006/04/02/38674.htmlhttp://www.blogjava.net/chenpengyi/comments/38674.htmlhttp://www.blogjava.net/chenpengyi/archive/2006/04/02/38674.html#feedback17http://www.blogjava.net/chenpengyi/comments/commentrss/38674.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/38674.html 上个月就知道 java 6 已经推出了,但还是不知道到底如何,也因为工作忙的关系没有机会去体验这个 java 6 到底有什么改变。只是知道改了个名字,从 java 5.0 tiger (老虎)变成了 mustang (墨西哥和北美平原的野马),呵呵,个人感觉好像是弱了,从这么猛的一个庞然大物变成了没有攻击力的野马,虽然只是名字的改变,不过从一个 java 程序员心里想来也许会觉得有点悲哀,说实话,看见这个名字,有种心有戚戚焉的感觉。

也许这正是 java 无奈现状的体现吧,本来是大户人家的宝贝,现在变成沦落荒野的野马,要跟荒原的狐狗抢食 …… 在桌面程序上面,出了 ibm 那么热心的开发了 eclipse 之外,似乎 java 毫无建树,而 web 上, java 更是被 .net 和其他带脚本性质的语言蚕食领地, .net 当然是没话说的,因为这可是大户人家的孩子,身上带着微软皇族的血统,背靠如此雄厚的资本,自然不会弱,而 php/python 等语言也以其灵活的结构和多年积累的成熟的多样的开发框架一步一步的侵食 java 的领地,我想让 java 世界最痛心的也许不是这些,而是由 ruby 语言引起的 java 世界的内讧 ……

ruby 这门语言,说实话,我真的不以为然,甚至觉得这不算语言。当初学习 java 的时候,是从 c 语言转过来的, java 给我的印象真的太美丽了,那么美妙的结构,竟然能如此完美的用程序语言去体现世界。而接触 ruby ,一点也没有接触 java 时候的那种感觉,但是我不得不承认 ruby on rails 真的是快捷而且方便的 web 开发平台。那么轻松的几百行代码就能够完成 java jsp servlet )上千行代码(有个朋友跟我说,他尝试过将一个 java 的简单 web 程序,据说好像是网上商城,改到 ruby 平台,上 4 5 千行的 java 代码,仅仅用了 800 ruby 代码)。这样的结果难道还不够震撼吗?

java 语言的优美是大家公认的,但如果是为了仅有的优美而付出大量的劳动,真的必要吗?也许正如 lansa 公司的高级程序设计师 roc.chen 说的那样, java 更适合在学校里进行 oo 软件的教学,因为他真的很美丽。当年 smalltalk 也是很优美的语言,为什么还是没有流行呢?语言的流行程度也许真的跟优美有否没有直接关系,想来 vb 真的是一门很烂的语言,但如此流行,也不能不承认这个道理的正确性了。

也许改名是因为要将 java 这个重量级的语言从吃遍四方的笨重的老虎变成可以轻松跑跳的野马吧,现在 java 的世界太笨重了,有复杂的 ejb ,多种不互相兼容开发模式( tomcat/sunj2ee 等下各有各的开发模式),多个巨头在做自己不同的ideeclipse /net beans/ idea/ j builders/ workshop等),多个企业在做自己的j2ee服务器(geronimo /web sphere/ weblogic)……意见经常不能统一,在这点上我真的认同微软的方式,这样至少使用的人能很快的上手,能更快更好的完善自己的开发模式和开发平台。

我觉得 java 已经在让自己变得轻量级,变得灵巧了,让自己在各个方面都能适应快速开发,就像现在的 ruby 一样,而 spring 的受欢迎程度和《 j2ee without ejb 》的热卖也说明了这点。也许 ruby 语言的出现对 java 来说是好事,因为至少这打击不是致命的,能让 java 的设计者痛定思痛,寻求变革。

java 6 mustang 的出现也许正是为了这个目的吧。那下面就说说 java 6 的特点吧:

l         支持 web service java web 的开发心头之痛啊,终于搞定了)

l         提高 jvm 性能,对比 java 5.0 mustang hotspot jvm 58 %的性能提升(早该如此了, java 的诟病就是慢,但我还没尝试过)

l         直接嵌入 jsr-223 规定的脚本语言

l         增加对 javascript 的支持,嵌入了 rhino (即 javascript )解释器(好东西来的,也许是因为 ruby 内置的 ajax 对其的影响吧)

l         支持 jdbc 4 规范

l         扩展 java.io.file ,充分利用磁盘空间

l         安全上新增了对 xml 数字签名的支持,整合 java generic security services kerberos ,支持国际域名和资源标识符和网络参数标题访问

l         还有好多,不过就没前面的那么重要了

sun 已经提供了演示版本的下载,我已经下载了,同时也下载了 sun net beans ide ,准备对这个新的 jdk 进行测试,测试结果会以最快的速度向同志们报告。
===============================================================================
/听了白痴兄弟的话,想说几句话/
上面只是我一个人的看法,也只是随便说说而已,犯不着大家这么生气的。况且这仅仅是晚上涂鸦写写,告诉大家一些消息,评论只是个人观点。
 



陈朋奕 2006-04-02 01:06 发表评论
]]>
投资组合和财富(最近的阅读论文)http://www.blogjava.net/chenpengyi/archive/2005/11/11/19238.html陈朋奕陈朋奕thu, 10 nov 2005 16:16:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/11/11/19238.htmlhttp://www.blogjava.net/chenpengyi/comments/19238.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/11/11/19238.html#feedback1http://www.blogjava.net/chenpengyi/comments/commentrss/19238.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/19238.html阅读全文

陈朋奕 2005-11-11 00:16
]]>
股利政策的几个大理论http://www.blogjava.net/chenpengyi/archive/2005/11/11/19237.html陈朋奕陈朋奕thu, 10 nov 2005 16:14:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/11/11/19237.htmlhttp://www.blogjava.net/chenpengyi/comments/19237.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/11/11/19237.html#feedback0http://www.blogjava.net/chenpengyi/comments/commentrss/19237.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/19237.html股利信号传递理论。其理论基础是米勒和莫迪格利安尼(miller and modigliani1961)的股利无关论定理(简称mm定理)。他们认为,在完全的资本市场条件(mm的基本假设)下,股利政策不会影响公司的价值,公司的价值增加与否完全由其投资决策决定。也就是说,在公司投资决策给定的条件下,股利政策不会产生任何效果。mm运用股利传递公司未来盈利信息理论解释了公司股票价格会随股利的增减而变动这一重要事实。具体地,股利的增减所引起的股票价格的变动,并不能归因于股利增减本身,而应归因于股利所包含的有关企业未来盈利的信息。

股利信号传递理论的实证分析工作由林特(john lintner1956)首先研究。林特通过对美国600家上市公司财务经理的问卷调查和实证分析,得出股利传递公司盈利信号内容的实证结果。他认为,在19461954年间,美国各上市公司一般都保持一个长期的目标股利支付率,公司的股利变化与长期可持续的净收益水平相一致;公司管理者特别注重股利水平的变化,除非管理者确信公司增长的收益足以支付长期增加的股利时,才会增发股利,并且,公司管理者不会轻易削减股利。

股利分配代理成本理论。该理论是由詹森、迈克林(jensen and meckling1976)和伊斯特布鲁克(easterbrook1984)创立的。詹森和迈克林以委托—代理理论为研究框架,通过研究公司股东、管理者和债权人三者的利益动机及分配关系,得出股利分配代理成本理论。他们认为,股东为避免自身利益损失,要监督和约束管理者的行为,势必导致代理成本的发生。但股东越保守,代理成本就越高,对债权人就越有利,对股东就越不利。因此,股东需要在这两者之间平衡利弊得失。伊斯特布鲁克认为,股利支付可以降低代理成本。股东可以通过保持一个稳定不变的股利支付水平,以避免权益资本的累积,同时,又促使企业向外部筹资。这就迫使管理者必须全力以赴经营企业,才能以优良的业绩在资本市场上筹集资金。结果,股东可以通过调节企业的负债比例来降低代理成本,以实现自身利益最大化。这就解释了为什么有些公司在发放股利的同时又对外筹资的现象。

股利顾客效应理论。该理论最先也是由米勒和莫迪格利安尼提出来的。他们注意到,有些股东偏好未来的资本利得,从而购买当期股利支付率低但成长性好的股票;有些股东则倾向于当期股利收入,因而喜欢股利支付高的股票,即所谓的股利顾客效应。mm认为,既然公司不可能同时满足所有股东的利益要求,公司就不必考虑股东对股利的具体意愿,而应根据自身的特点制定适合企业生产经营需要的股利政策,并且自然有一批投资者偏好公司的股票。



陈朋奕 2005-11-11 00:14
]]>
金融学最新的研究进展http://www.blogjava.net/chenpengyi/archive/2005/11/11/19235.html陈朋奕陈朋奕thu, 10 nov 2005 16:12:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/11/11/19235.htmlhttp://www.blogjava.net/chenpengyi/comments/19235.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/11/11/19235.html#feedback1http://www.blogjava.net/chenpengyi/comments/commentrss/19235.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/19235.html阅读全文

陈朋奕 2005-11-11 00:12 发表评论
]]>
重要的会计基本理论http://www.blogjava.net/chenpengyi/archive/2005/11/03/17942.html陈朋奕陈朋奕thu, 03 nov 2005 04:46:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/11/03/17942.htmlhttp://www.blogjava.net/chenpengyi/comments/17942.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/11/03/17942.html#feedback10http://www.blogjava.net/chenpengyi/comments/commentrss/17942.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/17942.html阅读全文

陈朋奕 2005-11-03 12:46 发表评论
]]>
从mysql得到最大的性能(转载)http://www.blogjava.net/chenpengyi/archive/2005/10/29/17324.html陈朋奕陈朋奕sat, 29 oct 2005 02:49:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/29/17324.htmlhttp://www.blogjava.net/chenpengyi/comments/17324.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/29/17324.html#feedback1http://www.blogjava.net/chenpengyi/comments/commentrss/17324.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/17324.html10 从mysql得到最大的性能

优化是一项复杂的任务,因为它最终需要对整个系统的理解。当用你的系统/应用的小知识做一些局部优化是可能的时候,你越想让你的系统更优化,你必须知道它也越多。

因此,本章将试图解释并给出优化mysql的不同方法的一些例子。但是记住总是有某些(逐渐变难)是系统更快的方法留着去做。

10.1 优化概述
为了使一个系统更快的最重要部分当然是基本设计。你也需要知道你的系统将做这样的事情,那就是你的瓶颈。

最常见的瓶颈是:

磁盘寻道。磁盘花时间找到一个数据,用在1999年的现代磁盘其平均时间通常小于10ms,因此理论上我们能大约一秒寻道 1000 次。这个时间用新磁盘提高很慢并且很难对一个表优化。优化它的方法是将数据散布在多个磁盘上。
当磁盘在我们需要读数据的正确位置时,磁盘读/写。用1999年的现代,一个磁盘传输类似10-20mb/s。这必寻道更容易优化,因为你能从多个磁盘并行地读。
cpu周期。当我们读数据进内存时,(或如果它已经在那里)我们需要处理它以达到我们的结果。当我们有相对内存较小的表时,这是最常见的限制因素,但是用小表速度通常不是问题。
内存带宽。当cpu需要超出适合cpu缓存的数据时,缓存带宽就成为内存的一个瓶颈。这是对大多数系统的一个不常见的瓶颈但是你应该知道它。
10.2 系统/编译时和启动参数的调节
我们以系统级的东西开始,因为这些决策的某一些很早就做好了。在其他情况下,快速浏览这部分可能就够了,因为它对大收获并不重要,但是有一个关于在这个层次上收获有多大的感觉总是好的。

使用的缺省os确实重要!为了最大程度地使用多cpu,应该使用solaris(因为线程工作得确实不错)或linux(因为2.2本的核心又确实不错的smp支持)。而且在32位的机器上,linux缺省有2g的文件大小限制。当新的文件系统被释出时( xfs ),希望这不久被修正。

因为我们没在很多平台上运行生产mysql,我们忠告你在可能选择它前,测试你打算运行的平台。

其他建议:

如果你有足够的ram,你能删除所有交换设备。一些操作系统在某些情况下将使用一个swap设备,即使你有空闲的内存。
使用--skip-locking的mysql选项避免外部锁定。注意这将不影响mysql功能,只要它仅运行在一个服务器上。只要在你运行myisamchk以前,记得要停掉服务器(或锁定相关部分)。在一些系统上这个开关是强制的,因为外部锁定不是在任何情况下都工作。当用mit-pthreads编译时,--skip-locking选项缺省为打开(on),因为flock()没在所有的平台上被mit-pthreads充分支持。唯一的情况是如果你对同一数据运行mysql服务器(不是客户),你不能使用--skip-locking之时,否则对没有先清掉(flushing)或先锁定mysqld服务器的表上运行myisamchk。你仍然能使用lock tables/ unlock tables,即使你正在使用--skip-locking。
10.2.1 编译和链接怎样影响mysql的速度
大多数下列测试在linux上并用mysql基准进行的,但是它们应该对其他操作系统和工作负载给出一些指示。

当你用-static链接时,你得到最快的可执行文件。使用unix套接字而非tcp/ip连接一个数据库也可给出好一些的性能。

在linux上,当用pgcc和-o6编译时,你将得到最快的代码。为了用这些选项编译“sql_yacc.cc”,你需要大约200m内存,因为gcc/pgcc需要很多内存使所有函数嵌入(inline)。在配置mysql时,你也应该设定cxx=gcc以避免包括libstdc 库(它不需要)。

只通过使用一个较好的编译器或较好的编译器选项,在应用中你能得到一个10-30%的加速。如果你自己编译sql服务器,这特别重要!

在intel上,你应该例如使用pgcc或cygnus codefusion编译器得到最大速度。我们已经测试了新的 fujitsu编译器,但是它是还没足够不出错来优化编译mysql。

这里是我们做过的一些测量表:

如果你以-o6使用pgcc并且编译任何东西,mysqld服务器是比用gcc快11%(用字符串99的版本)。
如果你动态地链接(没有-static),结果慢了13%。注意你仍能使用一个动态连接的mysql库。只有服务器对性能是关键的。
如果你使用tcp/ip而非unix套接字,结果慢7.5%。
在一个sun sparcstation 10上,gcc2.7.3是比sun pro c 4.2快13%。
在solaris 2.5.1上,在单个处理器上mit-pthreads比带原生线程的solaris慢8-12%。以更多的负载/cpus,差别应该变得更大。
由tcx提供的mysql-linux的分发用pgcc编译并静态链接。

10.2.2 磁盘问题
正如前面所述,磁盘寻道是一个性能的大瓶颈。当数据开始增长以致缓存变得不可能时,这个问题变得越来越明显。对大数据库,在那你或多或少地要随机存取数据,你可以依靠你将至少需要一次磁盘寻道来读取并且几次磁盘寻道写入。为了使这个问题最小化,使用有低寻道时间的磁盘。
为了增加可用磁盘轴的数量(并且从而减少寻道开销),符号联接文件到不同磁盘或分割磁盘是可能的。
使用符号连接
这意味着你将索引/数据文件符号从正常的数据目录链接到其他磁盘(那也可以被分割的)。这使得寻道和读取时间更好(如果磁盘不用于其他事情)。见10.2.2.1 使用数据库和表的符号链接。
分割
分割意味着你有许多磁盘并把第一块放在第一个磁盘上,在第二块放在第二个磁盘上,并且第 n块在第(n mod number_of_disks)磁盘上,等等。这意味着,如果你的正常数据大小于分割大小(或完美地排列过),你将得到较好一些的性能。注意,分割是否很依赖于os和分割大小。因此用不同的分割大小测试你的应用程序。见10.8 使用你自己的基准。注意对分割的速度差异很依赖于参数,取决于你如何分割参数和磁盘数量,你可以得出以数量级的不同。注意你必须选择为随机或顺序存取优化。
为了可靠,你可能想要使用袭击raid 0 1(分割 镜像),但是在这种情况下,你将需要2*n个驱动器来保存n个驱动器的数据。如果你有钱,这可能是最好的选择!然而你也可能必须投资一些卷管理软件投资以高效地处理它。
一个好选择是让稍重要的数据(它能再生)上存在raid 0磁盘上,而将确实重要的数据(像主机信息和日志文件)存在一个raid 0 1或raid n磁盘上。如果因为更新奇偶位你有许多写入,raid n可能是一个问题。
你也可以对数据库使用的文件系统设置参数。一个容易的改变是以noatime选项挂装文件系统。这是它跳过更新在inode中的最后访问时间,而且这将避免一些磁盘寻道。
10.2.2.1 为数据库和表使用符号链接
你可以从数据库目录移动表和数据库到别处,并且用链接到新地点的符号代替它们。你可能想要这样做,例如,转移一个数据库到有更多空闲空间的一个文件系统。

如果mysql注意到一个表是一个符号链接,它将解析符号链接并且使用其实际指向的表,它可工作在支持realpath()调用的所有系统上(至少linux和solaris支持realpath())!在不支持realpath()的系统上,你应该不同时通过真实路径和符号链接访问表!如果你这样做,表在任何更新后将不一致。

mysql缺省不支持数据库链接。只要你不在数据库之间做一个符号链接,一切将工作正常。假定你在mysql数据目录下有一个数据库db1,并且做了一个符号链接db2指向db1:

shell> cd /path/to/datadir
shell> ln -s db1 db2

现在,对在db1中的任一表tbl_a,在db2种也好象有一个表tbl_a。如果一个线程更新db1.tbl_a并且另一个线程更新db2.tbl_a,将有问题。

如果你确实需要这样,你必须改变下列在“mysys/mf_format.c”中的代码:

if (!lstat(to,&stat_buff)) /* check if it's a symbolic link */
if (s_islnk(stat_buff.st_mode) && realpath(to,buff))

把代码改变为这样:

if (realpath(to,buff))

10.2.3 调节服务器参数
你能用这个命令得到mysqld服务器缺省缓冲区大小:

shell> mysqld --help

这个命令生成一张所有mysqld选项和可配置变量的表。输出包括缺省值并且看上去象这样一些东西:

possible variables for option --set-variable (-o) are:
back_log current value: 5
connect_timeout current value: 5
delayed_insert_timeout current value: 300
delayed_insert_limit current value: 100
delayed_queue_size current value: 1000
flush_time current value: 0
interactive_timeout current value: 28800
join_buffer_size current value: 131072
key_buffer_size current value: 1048540
lower_case_table_names current value: 0
long_query_time current value: 10
max_allowed_packet current value: 1048576
max_connections current value: 100
max_connect_errors current value: 10
max_delayed_threads current value: 20
max_heap_table_size current value: 16777216
max_join_size current value: 4294967295
max_sort_length current value: 1024
max_tmp_tables current value: 32
max_write_lock_count current value: 4294967295
net_buffer_length current value: 16384
query_buffer_size current value: 0
record_buffer current value: 131072
sort_buffer current value: 2097116
table_cache current value: 64
thread_concurrency current value: 10
tmp_table_size current value: 1048576
thread_stack current value: 131072
wait_timeout current value: 28800

如果有一个mysqld服务器正在运行,通过执行这个命令,你可以看到它实际上使用的变量的值:

shell> mysqladmin variables

每个选项在下面描述。对于缓冲区大小、长度和栈大小的值以字节给出,你能用于个后缀“k”或“m” 指出以k字节或兆字节显示值。例如,16m指出16兆字节。后缀字母的大小写没有关系;16m和16m是相同的。

你也可以用命令show status自一个运行的服务器看见一些统计。见7.21 show语法(得到表、列的信息)。

back_log
要求mysql能有的连接数量。当主要mysql线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在mysql暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的tcp/ip连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 unix listen(2)系统调用的手册页应该有更多的细节。检查你的os文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。
connect_timeout
mysqld服务器在用bad handshake(糟糕的握手)应答前正在等待一个连接报文的秒数。
delayed_insert_timeout
一个insert delayed线程应该在终止之前等待insert语句的时间。
delayed_insert_limit
在插入delayed_insert_limit行后,insert delayed处理器将检查是否有任何select语句未执行。如果这样,在继续前执行允许这些语句。
delayed_queue_size
应该为处理insert delayed分配多大一个队列(以行数)。如果排队满了,任何进行insert delayed的客户将等待直到队列又有空间了。
flush_time
如果这被设置为非零值,那么每flush_time秒所有表将被关闭(以释放资源和sync到磁盘)。
interactive_timeout
服务器在关上它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用client_interactive选项的客户。也可见wait_timeout。
join_buffer_size
用于全部联结(join)的缓冲区大小(不是用索引的联结)。缓冲区对2个表间的每个全部联结分配一次缓冲区,当增加索引不可能时,增加该值可得到一个更快的全部联结。(通常得到快速联结的最佳方法是增加索引。)
key_buffer_size
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。记住既然mysql不缓存读取的数据,你将必须为os文件系统缓存留下一些空间。为了在写入多个行时得到更多的速度,使用lock tables。见7.24lock tables/unlock tables语法。
long_query_time
如果一个查询所用时间超过它(以秒计),slow_queries记数器将被增加。
max_allowed_packet
一个包的最大尺寸。消息缓冲区被初始化为net_buffer_length字节,但是可在需要时增加到max_allowed_packet个字节。缺省地,该值太小必能捕捉大的(可能错误)包。如果你正在使用大的blob列,你必须增加该值。它应该象你想要使用的最大blob的那么大。
max_connections
允许的同时客户的数量。增加该值增加mysqld要求的文件描述符的数量。见下面对文件描述符限制的注释。见18.2.4 too many connections错误。
max_connect_errors
如果有多于该数量的从一台主机中断的连接,这台主机阻止进一步的连接。你可用flush hosts命令疏通一台主机。
max_delayed_threads
不要启动多于的这个数字的线程来处理insert delayed语句。如果你试图在所有insert delayed线程在用后向一张新表插入数据,行将被插入,就像delayed属性没被指定那样。
max_join_size
可能将要读入多于max_join_size个记录的联结将返回一个错误。如果你的用户想要执行没有一个where子句、花很长时间并且返回百万行的联结,设置它。
max_sort_length
在排序blob或text值时使用的字节数(每个值仅头max_sort_length个字节被使用;其余的被忽略)。
max_tmp_tables
(该选择目前还不做任何事情)。一个客户能同时保持打开的临时表的最大数量。
net_buffer_length
通信缓冲区在查询之间被重置到该大小。通常这不应该被改变,但是如果你有很少的内存,你能将它设置为查询期望的大小。(即,客户发出的sql语句期望的长度。如果语句超过这个长度,缓冲区自动地被扩大,直到max_allowed_packet个字节。)
record_buffer
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。
sort_buffer
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速order by或group by操作。见18.5 mysql在哪儿存储临时文件。
table_cache
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。mysql对每个唯一打开的表需要2个文件描述符,见下面对文件描述符限制的注释。对于表缓存如何工作的信息,见10.2.4 mysql怎样打开和关闭表。
tmp_table_size
如果一张临时表超出该大小,mysql产生一个the table tbl_name is full形式的错误,如果你做很多高级group by查询,增加tmp_table_size值。
thread_stack
每个线程的栈大小。由crash-me测试检测到的许多限制依赖于该值。缺省队一般的操作是足够大了。见10.8 使用你自己的基准。
wait_timeout
服务器在关闭它之前在一个连接上等待行动的秒数。也可见interactive_timeout。
mysql使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给mysql更多的被存以得到更好的性能。

如果你有很多内存和很多表并且有一个中等数量的客户,想要最大的性能,你应该一些象这样的东西:

shell> safe_mysqld -o key_buffer=16m -o table_cache=128
-o sort_buffer=4m -o record_buffer=1m &

如果你有较少的内存和大量的连接,使用这样一些东西:
shell> safe_mysqld -o key_buffer=512k -o sort_buffer=100k
-o record_buffer=100k &

或甚至:
shell> safe_mysqld -o key_buffer=512k -o sort_buffer=16k
-o table_cache=32 -o record_buffer=8k -o net_buffer=1k &

如果有很多连接,“交换问题”可能发生,除非mysqld已经被配置每个连接使用很少的内存。当然如果你对所有连接有足够的内存,mysqld执行得更好。

注意,如果你改变mysqld的一个选项,它实际上只对服务器的那个例子保持。

为了明白一个参数变化的效果,这样做:

shell> mysqld -o key_buffer=32m --help

保证--help选项是最后一个;否则,命令行上在它之后列出的任何选项的效果将不在反映在输出中。

10.2.4 mysql怎样打开和关闭数据库表
table_cache, max_connections和max_tmp_tables影响服务器保持打开的文件的最大数量。如果你增加这些值的一个或两个,你可以遇到你的操作系统每个进程打开文件描述符的数量上强加的限制。然而,你可以能在许多系统上增加该限制。请教你的os文档找出如何做这些,因为改变限制的方法各系统有很大的不同。

table_cache与max_connections有关。例如,对于200个打开的连接,你应该让一张表的缓冲至少有200 * n,这里n是一个联结(join)中表的最大数量。

打开表的缓存可以增加到一个table_cache的最大值(缺省为64;这可以用mysqld的-o table_cache=#选项来改变)。一个表绝对不被关闭,除非当缓存满了并且另外一个线程试图打开一个表时或如果你使用mysqladmin refresh或mysqladmin flush-tables。

当表缓存满时,服务器使用下列过程找到一个缓存入口来使用:

不是当前使用的表被释放,以最近最少使用(lru)顺序。
如果缓存满了并且没有表可以释放,但是一个新表需要打开,缓存必须临时被扩大。
如果缓存处于一个临时扩大状态并且一个表从在用变为不在用状态,它被关闭并从缓存中释放。
对每个并发存取打开一个表。这意味着,如果你让2个线程存取同一个表或在同一个查询中存取表两次(用as),表需要被打开两次。任何表的第一次打开占2个文件描述符;表的每一次额外使用仅占一个文件描述符。对于第一次打开的额外描述符用于索引文件;这个描述符在所有线程之间共享。

10.2.5 在同一个数据库中创建大量数据库表的缺点
如果你在一个目录中有许多文件,打开、关闭和创建操作将会很慢。如果你执行在许多不同表上的select语句,当表缓存满时,将有一点开销,因为对每个必须打开的表,另外一个必须被关闭。你可以通过使表缓冲更大些来减少这个开销。

10.2.6 为什么有这么多打开的表?
当你运行mysqladmin status时,你将看见象这样的一些东西:

uptime: 426 running threads: 1 questions: 11082 reloads: 1 open tables: 12

如果你仅有6个表,这可能有点令人困惑。

mysql是多线程的,因此它可以同时在同一个表上有许多询问。为了是2个线程在同一个文件上有不同状态的问题减到最小,表由每个并发进程独立地打开。这为数据文件消耗一些内存和一个额外的文件描述符。索引文件描述符在所有线程之间共享。

10.2.7 mysql怎样使用内存
下表指出mysqld服务器使用存储器的一些方式。在应用的地方,给出与存储器使用相关的服务器变量的名字。

关键字缓冲区(变量key_buffer_size)由所有线程分享;当需要时,分配服务器使用的其他缓冲区。见10.2.3 调节服务器参数。
每个连接使用一些线程特定的空间;一个栈(缺省64k,变量thread_stack)、一个连接缓冲区(变量net_buffer_length)和一个结果缓冲区(变量net_buffer_length)。当需要时,连接缓冲区和结果缓冲区动态地被扩大到max_allowed_packet。当一个查询正在运行当前查询的一个拷贝时,也分配字符串。
所有线程共享同一基存储器。
目前还没有什么是内存映射的(除了压缩表,但是那是另外一个的故事)。这是因为4gb的32位存储器空间对最大的数据库来所不是足够大的。当一个64位寻址空间的系统变得更普遍时,我们可以为内存映射增加全面的支持。
每个做顺序扫描的请求分配一个读缓冲区(变量record_buffer)。
所有联结均用一遍完成并且大多数联结可以甚至不用一张临时表来完成。最临时的表是基于内存的(heap)表。有较大记录长度(以所有列的长度之和计算)的临时表或包含blob列的表在磁盘上存储。在mysql版本3.23.2前一个问题是如果一张heap表超过tmp_table_size的大小,你得到错误the table tbl_name is full。在更新的版本中,这通过必要时自动将在内存的(heap)表转变为一个基于磁盘(myisam)的表来处理。为了解决这个问题,你可以通过设置mysqld的tmp_table_size选项,或通过在客户程序中设置sql的sql_big_tables选项增加临时表的大小。见7.25 set option句法。在mysql 3.20中,临时表的最大尺寸是record_buffer*16,因此如果你正在使用这个版本,你必须增加record_buffer值。你也可以使用--big-tables选项启动mysqld以总将临时表存储在磁盘上,然而,这将影响许多复杂查询的速度。
大多数做排序的请求分配一个排序缓冲区和一个或二个临时文件。见18.5 mysql在哪儿存储临时文件。
几乎所有的语法分析和计算都在一家本地存储器中完成。对小项目没有内存开销并且一般的较慢存储器分配和释放被避免。内存仅为出乎意料的大字符串分配(这用malloc()和free()完成)。
每个索引文件只被打开一次,并且数据文件为每个并发运行的线程打开一次。对每个并发线程,分配一个表结构、对每列的列结构和大小为3 * n的一个缓冲区(这里n是最大的行长度,不算blob列)。一个blob使用5 ~ 8个字节加上blob数据。
对每个有blob列的表,一个缓冲区动态地被扩大以便读入更大的blob值。如果你扫描一个表,分配与最大blob值一样大的一个缓冲区。
对所有在用的表的表处理器被保存在一个缓存中并且作为一个fifo管理。通常缓存有64个入口。如果一个表同时被2个运行的线程使用,缓存为此包含2个入口。见10.2.4 mysql如何打开和关闭数据库表。
一个mysqladmin flush-tables命令关闭所有不在用的表并在当前执行的线程结束时,标记所有在用的表准备被关闭。这将有效地释放大多数在用的内存。
ps和其他系统状态程序可以报导mysqld使用很多内存。这可以是在不同的内存地址上的线程栈造成的。例如,solaris版本的ps将栈间未用的内存算作已用的内存。你可以通过用swap -s检查可用交换区来验证它。我们用商业内存漏洞探查器测试了mysqld,因此应该有没有内存漏洞。

10.2.8 mysql怎样锁定数据库表
mysql中所有锁定不会是死锁的。这通过总是在一个查询前立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。

对write,mysql使用的锁定方法原理如下:

如果在表上没有锁,放一个锁在它上面。
否则,把锁定请求放在写锁定队列中。
对read,mysql使用的锁定方法原理如下:

如果在表上没有写锁定,把一个读锁定放在它上面。
否则,把锁请求放在读锁定队列中。
当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。

这意味着,如果你在一个表上有许多更改,select语句将等待直到有没有更多的更改。

为了解决在一个表中进行很多insert和select操作的情况,你可在一张临时表中插入行并且偶尔用来自临时表的记录更新真正的表。

这可用下列代码做到:

mysql> lock tables real_table write, insert_table write;
mysql> insert into real_table select * from insert_table;
mysql> delete from insert_table;
mysql> unlock tables;

如果你在一些特定的情况字下区分检索的优先次序,你可以使用low_priority选项的insert。见7.14 insert句法。

你也能改变在“mysys/thr_lock.c”中的锁代码以使用一个单个队列。在这种情况下,写锁定和读锁定将有同样优先级,它可能帮助一些应用程序。

10.2.9 数据库表级锁定的问题
mysql的表锁定代码是不会死锁的。

mysql使用表级锁定(而不是行级锁定或列级锁定)以达到很高的锁定速度。对于大表,表级锁定对大多数应用程序来说比行级锁定好一些,但是当然有一些缺陷。

在mysql3.23.7和更高版本中,一个人能把行插入到myisam表同时其他线程正在读该表。注意,目前只有在表中内有删除的行时才工作。

表级锁定使很多线程能够同时读一个表,但是如果一个线程想要写一个表,它必须首先得到独占存取权。在更改期间,所有其他想要存取该特定表的线程将等到更改就绪。

因为数据库的更改通常被视为比select更重要,更新一个表的所有语句比从一个表中检索信息的语句有更高的优先级。这应该保证更改不被“饿死”,因为一个人针对一个特定表会发出很多繁重的查询。

从mysql 3.23.7开始,一个人可以能使用max_write_lock_count变量强制mysql在一个表上一个特定数量的插入后发出一个select。

对此一个主要的问题如下:

一个客户发出一个花很长时间运行的select。
然后其他客户在一个使用的表上发出一个update;这个客户将等待直到select完成。
另一个客户在同一个表上发出另一个select语句;因为update比select有更高的优先级,该select将等待update的完成。它也将等待第一个select完成!
对这个问题的一些可能的凯发天生赢家一触即发官网的解决方案是:

试着使select语句运行得更快;你可能必须创建一些摘要(summary)表做到这点。
用--low-priority-updates启动mysqld。这将给所有更新(修改)一个表的语句以比select语句低的优先级。在这种情况下,在先前情形的最后的select语句将在insert语句前执行。
你可以用low_priority属性给与一个特定的insert、update或delete语句较低优先级。
为max_write_lock_count指定一个低值来启动mysqld使得在一定数量的write锁定后给出read锁定。
通过使用sql命令:set sql_low_priority_updates=1,你可从一个特定线程指定所有的更改应该由用低优先级完成。见7.25 set option句法。
你可以用high_priority属性指明一个特定select是很重要的。见7.12 select句法。
如果你有关于insert结合select的问题,切换到使用新的myisam表,因为它们支持并发的select和insert。
如果你主要混合insert和select语句,delayed属性的insert将可能解决你的问题。见7.14 insert句法。
如果你有关于select和delete的问题,limit选项的delete可以帮助你。见7.11 delete句法。
10.3 使你的数据尽可能小
最基本的优化之一是使你的数据(和索引)在磁盘上(并且在内存中)占据的空间尽可能小。这能给出巨大的改进,因为磁盘读入较快并且通常也用较少的主存储器。如果在更小的列上做索引,索引也占据较少的资源。

你能用下面的技术使表的性能更好并且使存储空间最小:

尽可能地使用最有效(最小)的类型。mysql有很多节省磁盘空间和内存的专业化类型。
如果可能使表更小,使用较小的整数类型。例如,mediumint经常比int好一些。
如果可能,声明列为not null。它使任何事情更快而且你为每列节省一位。注意如果在你的应用程序中你确实需要null,你应该毫无疑问使用它,只是避免缺省地在所有列上有它。
如果你没有任何变长列(varchar、text或blob列),使用固定尺寸的记录格式。这比较快但是不幸地可能会浪费一些空间。见10.6 选择一种表类型。
每张桌子应该有尽可能短的主索引。这使一行的辨认容易而有效。
对每个表,你必须决定使用哪种存储/索引方法。见9.4 mysql表类型。也可参见10.6 选择一种表类型。
只创建你确实需要的索引。索引对检索有好处但是当你需要快速存储东西时就变得糟糕。如果你主要通过搜索列的组合来存取一个表,以它们做一个索引。第一个索引部分应该是最常用的列。如果你总是使用许多列,你应该首先以更多的副本使用列以获得更好的列索引压缩。
如果很可能一个索引在头几个字符上有唯一的前缀,仅仅索引该前缀比较好。mysql支持在一个字符列的一部分上的索引。更短的索引更快,不仅因为他们占较少的磁盘空间而且因为他们将在索引缓存中给你更多的命中率并且因此有更少磁盘寻道。见10.2.3 调节服务器参数。
在一些情形下,分割一个经常被扫描进2个表的表是有益的。特别是如果它是一个动态格式的表并且它可能使一个能用来扫描后找出相关行的较小静态格式的表。
10.4 mysql索引的使用
索引被用来快速找出在一个列上用一特定值的行。没有索引,mysql不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,mysql能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。

所有的mysql索引(primary、unique和index)在b树中存储。字符串是自动地压缩前缀和结尾空间。见7.27 create index句法。

索引用于:

快速找出匹配一个where子句的行。
当执行联结时,从其他表检索行。
对特定的索引列找出max()或min()值。
如果排序或分组在一个可用键的最左面前缀上进行(例如,order by key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随desc,键以倒序被读取。
在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。
假定你发出下列select语句:

mysql> select * from tbl_name where col1=val1 and col2=val2;

如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。

如果表有一个多列索引,任何最左面的索引前缀能被优化器使用以找出行。例如,如果你有一个3行列索引(col1,col2,col3),你已经索引了在(col1)、(col1,col2)和(col1,col2,col3)上的搜索能力。

如果列不构成索引的最左面前缀,mysql不能使用一个部分的索引。假定你下面显示的select语句:

mysql> select * from tbl_name where col1=val1;
mysql> select * from tbl_name where col2=val2;
mysql> select * from tbl_name where col2=val2 and col3=val3;

如果一个索引存在于(col1、col2、col3)上,只有上面显示的第一个查询使用索引。第二个和第三个查询确实包含索引的列,但是(col2)和(col2、col3)不是(col1、col2、col3)的最左面前缀。

如果like参数是一个不以一个通配符字符起始的一个常数字符串,mysql也为like比较使用索引。例如,下列select语句使用索引:

mysql> select * from tbl_name where key_col like "patrick%";
mysql> select * from tbl_name where key_col like "pat%_ck%";

在第一条语句中,只考虑有"patrick" <= key_col < "patricl"的行。在第二条语句中,只考虑有"pat" <= key_col < "pau"的行。

下列select语句将不使用索引:

mysql> select * from tbl_name where key_col like "%patrick%";
mysql> select * from tbl_name where key_col like other_col;

在第一条语句中,like值以一个通配符字符开始。在第二条语句中,like值不是一个常数。

如果 column_name 是一个索引,使用column_name is null的搜索将使用索引。

mysql通常使用找出最少数量的行的索引。一个索引被用于你与下列操作符作比较的列:=、>、>=、<、<=、between和一个有一个非通配符前缀象'something%'的like的列。

任何不跨越的在where子句的所有and层次的索引不用来优化询问。

下列where子句使用索引:

... where index_part1=1 and index_part2=2
... where index=1 or a=10 and index=2 /* index = 1 or index = 2 */
... where index_part1='hello' and index_part_3=5
/* optimized like "index_part1='hello'" */

这些where子句不使用索引:

... where index_part2=1 and index_part3=2 /* index_part_1 is not used */
... where index=1 or a=10 /* no index */
... where index_part1=1 or index_part2=10 /* no index spans all rows */

10.5 存取或更新数据的查询速度
首先,一件事情影响所有的询问。你有的许可系统设置越复杂,你得到更多的开销。

如果你不让任何grant语句执行,mysql将稍微优化许可检查。因此如果你有很大量,值得花时间来避免授权,否则更多的许可检查有更大的开销。

如果你的问题是与一些明显的mysql函数有关,你总能在mysql客户中计算其时间:

mysql> select benchmark(1000000,1 1);
------------------------
| benchmark(1000000,1 1) |
------------------------
| 0 |
------------------------
1 row in set (0.32 sec)

上面显示mysql能在pentiumii 400mhz上以0.32秒执行1,000,000个 表达式。

所有mysql函数应该被高度优化,但是以可能有一些例外并且benchmark(loop_count,expression)是找出是否你的查询有问题的一个极好工具。

10.5.1 估计查询性能
在大多数情况下,你能通过计算磁盘寻道估计性能。对小的表,你通常能在1次磁盘寻道中找到行(因为这个索引可能被缓冲)。对更大的表,你能估计它(使用 b 树索引),你将需要:log(row_count)/log(index_block_length/3*2/(index_length data_pointer_length)) 1次寻道找到行。

在mysql中,索引块通常是1024个字节且数据指针通常是4个字节,这对一个有一个索引长度为3(中等整数)的 500,000 行的表给你:log(500,000)/log(1024/3*2/(3 4)) 1= 4 次寻道。

象上面的索引将要求大约 500,000 * 7 * 3/2 = 5.2m,(假设索引缓冲区被充满到2/3(它是典型的)),你将可能在内存中有索引的大部分并且你将可能仅需要1-2调用从os读数据来找出行。

然而对于写,你将需要 4 次寻道请求(如上)来找到在哪儿存放新索引并且通常需2次寻道更新这个索引并且写入行。

注意,上述不意味着你的应用程序将缓慢地以 n log n 退化!当表格变得更大时,只要一切被os或sql服务器缓冲,事情将仅仅或多或少地更慢。在数据变得太大不能被缓冲后,事情将开始变得更慢直到你的应用程序仅仅受磁盘寻道限制(它以n log n增加)。为了避免这个增加,索引缓冲随数据增加而增加。见10.2.3 调节服务器参数。

10.5.2 select查询的速度
总的来说,当你想要使一个较慢的select ... where更快,检查的第一件事情是你是否能增加一个索引。见10.4 mysql 索引的使用。在不同表之间的所有引用通常应该用索引完成。你可以使用explain来确定哪个索引用于一条select语句。见7.22 explain句法(得到关于一条select的信息)。

一些一般的建议:

为了帮助mysql更好地优化查询,在它已经装载了相关数据后,在一个表上运行myisamchk --analyze。这为每一个更新一个值,指出有相同值地平均行数(当然,对唯一索引,这总是1。)
为了根据一个索引排序一个索引和数据,使用myisamchk --sort-index --sort-records=1(如果你想要在索引1上排序)。如果你有一个唯一索引,你想要根据该索引地次序读取所有的记录,这是使它更快的一个好方法。然而注意,这个排序没有被最佳地编写,并且对一个大表将花很长时间!
10.5.3 mysql怎样优化where子句
where优化被放在select中,因为他们最主要在那里使用里,但是同样的优化被用于delete和update语句。

也要注意,本节是不完全的。mysql确实作了许多优化而我们没有时间全部记录他们。

由mysql实施的一些优化列在下面:

删除不必要的括号:
((a and b) and c or (((a and b) and (c and d))))
-> (a and b and c) or (a and b and c and d)

常数调入:
(a-> b>5 and b=c and a=5

删除常数条件(因常数调入所需):
(b>=5 and b=5) or (b=6 and 5=5) or (b=7 and 5=6)
-> b=5 or b=6

索引使用的常数表达式仅计算一次。
在一个单个表上的没有一个where的count(*)直接从表中检索信息。当仅使用一个表时,对任何not null表达式也这样做。
无效常数表达式的早期检测。mysql快速检测某些select语句是不可能的并且不返回行。
如果你不使用group by或分组函数(count()、min()……),having与where合并。
为每个子联结(sub join),构造一个更简单的where以得到一个更快的where计算并且也尽快跳过记录。
所有常数的表在查询中的任何其他表前被首先读出。一个常数的表是:
一个空表或一个有1行的表。
与在一个unique索引、或一个primary key的where子句一起使用的表,这里所有的索引部分使用一个常数表达式并且索引部分被定义为not null。
所有下列的表用作常数表:

mysql> select * from t where primary_key=1;
mysql> select * from t1,t2
where t1.primary_key=1 and t2.primary_key=t1.id;

对联结表的最好联结组合是通过尝试所有可能性来找到:(。如果所有在order by和group by的列来自同一个表,那么当廉洁时,该表首先被选中。
如果有一个order by子句和一个不同的group by子句,或如果order by或group by包含不是来自联结队列中的第一个表的其他表的列,创建一个临时表。
如果你使用sql_small_result,mysql将使用一个在内存中的表。
因为distinct被变换到在所有的列上的一个group by,distinct与order by结合也将在许多情况下需要一张临时表。
每个表的索引被查询并且使用跨越少于30% 的行的索引。如果这样的索引没能找到,使用一个快速的表扫描。
在一些情况下,mysql能从索引中读出行,甚至不咨询数据文件。如果索引使用的所有列是数字的,那么只有索引树被用来解答查询。
在每个记录被输出前,那些不匹配having子句的行被跳过。
下面是一些很快的查询例子:

mysql> select count(*) from tbl_name;
mysql> select min(key_part1),max(key_part1) from tbl_name;
mysql> select max(key_part2) from tbl_name
where key_part_1=constant;
mysql> select ... from tbl_name
order by key_part1,key_part2,... limit 10;
mysql> select ... from tbl_name
order by key_part1 desc,key_part2 desc,... limit 10;

下列查询仅使用索引树就可解决(假设索引列是数字的):

mysql> select key_part1,key_part2 from tbl_name where key_part1=val;
mysql> select count(*) from tbl_name
where key_part1=val1 and key_part2=val2;
mysql> select key_part2 from tbl_name group by key_part1;

下列查询使用索引以排序顺序检索,不用一次另外的排序:

mysql> select ... from tbl_name order by key_part1,key_part2,...
mysql> select ... from tbl_name order by key_part1 desc,key_part2 desc,...

10.5.4 mysql怎样优化left join
在mysql中,a left join b实现如下:

表b被设置为依赖于表a。
表a被设置为依赖于所有用在left join条件的表(除b外)。
所有left join条件被移到where子句中。
进行所有标准的联结优化,除了一个表总是在所有它依赖的表之后被读取。如果有一个循环依赖,mysql将发出一个错误。
进行所有标准的where优化。
如果在a中有一行匹配where子句,但是在b中没有任何行匹配left join条件,那么在b中生成所有列设置为null的一行。
如果你使用left join来找出在某些表中不存在的行并且在where部分你有下列测试:column_name is null,这里column_name 被声明为not null的列,那么mysql在它已经找到了匹配left join条件的一行后,将停止在更多的行后寻找(对一特定的键组合)。
10.5.5 mysql怎样优化limit
在一些情况中,当你使用limit #而不使用having时,mysql将以不同方式处理查询。

如果你用limit只选择一些行,当mysql一般比较喜欢做完整的表扫描时,它将在一些情况下使用索引。
如果你使用limit #与order by,mysql一旦找到了第一个 # 行,将结束排序而不是排序整个表。
当结合limit #和distinct时,mysql一旦找到#个唯一的行,它将停止。
在一些情况下,一个group by能通过顺序读取键(或在键上做排序)来解决,并然后计算摘要直到键值改变。在这种情况下,limit #将不计算任何不必要的group。
只要mysql已经发送了第一个#行到客户,它将放弃查询。
limit 0将总是快速返回一个空集合。这对检查查询并且得到结果列的列类型是有用的。
临时表的大小使用limit #计算需要多少空间来解决查询。
10.5.6 insert查询的速度
插入一个记录的时间由下列组成:

连接:(3)
发送查询给服务器:(2)
分析查询:(2)
插入记录:(1 x 记录大小)
插入索引:(1 x 索引)
关闭:(1)
这里的数字有点与总体时间成正比。这不考虑打开表的初始开销(它为每个并发运行的查询做一次)。

表的大小以n log n (b 树)的速度减慢索引的插入。

加快插入的一些方法:

如果你同时从同一客户插入很多行,使用多个值表的insert语句。这比使用分开insert语句快(在一些情况中几倍)。
如果你从不同客户插入很多行,你能通过使用insert delayed语句得到更高的速度。见7.14 insert句法。
注意,用myisam,如果在表中没有删除的行,能在select:s正在运行的同时插入行。
当从一个文本文件装载一个表时,使用load data infile。这通常比使用很多insert语句快20倍。见7.16 load data infile句法。
当表有很多索引时,有可能多做些工作使得load data infile更快些。使用下列过程:
有选择地用create table创建表。例如使用mysql或perl-dbi。
执行flush tables,或外壳命令mysqladmin flush-tables。
使用myisamchk --keys-used=0 -rq /path/to/db/tbl_name。这将从表中删除所有索引的使用。
用load data infile把数据插入到表中,这将不更新任何索引,因此很快。
如果你有myisampack并且想要压缩表,在它上面运行myisampack。见10.6.3 压缩表的特征。
用myisamchk -r -q /path/to/db/tbl_name再创建索引。这将在将它写入磁盘前在内存中创建索引树,并且它更快,因为避免大量磁盘寻道。结果索引树也被完美地平衡。
执行flush tables,或外壳命令mysqladmin flush-tables。
这个过程将被构造进在mysql的某个未来版本的load data infile。

你可以锁定你的表以加速插入。
mysql> lock tables a write;
mysql> insert into a values (1,23),(2,34),(4,33);
mysql> insert into a values (8,26),(6,29);
mysql> unlock tables;

主要的速度差别是索引缓冲区仅被清洗到磁盘上一次,在所有insert语句完成后。一般有与有不同的insert语句那样夺的索引缓冲区清洗。如果你能用一个单个语句插入所有的行,锁定就不需要。锁定也将降低多连接测试的整体时间,但是对某些线程最大等待时间将上升(因为他们等待锁)。例如:

thread 1 does 1000 inserts
thread 2, 3, and 4 does 1 insert
thread 5 does 1000 inserts

如果你不使用锁定,2、3和4将在1和5前完成。如果你使用锁定,2、3和4将可能不在1或5前完成,但是整体时间应该快大约40%。因为insert, update和delete操作在mysql中是很快的,通过为多于大约5次连续不断地插入或更新一行的东西加锁,你将获得更好的整体性能。如果你做很多一行的插入,你可以做一个lock tables,偶尔随后做一个unlock tables(大约每1000行)以允许另外的线程存取表。这仍然将导致获得好的性能。当然,load data infile对装载数据仍然是更快的。

为了对load data infile和insert得到一些更快的速度,扩大关键字缓冲区。见10.2.3 调节服务器参数。

10.5.7 update查询的速度
更改查询被优化为有一个写开销的一个select查询。写速度依赖于被更新数据大小和被更新索引的数量。

使更改更快的另一个方法是推迟更改并且然后一行一行地做很多更改。如果你锁定表,做一行一行地很多更改比一次做一个快。

注意,动态记录格式的更改一个较长总长的记录,可能切开记录。因此如果你经常这样做,时不时地optimize table是非常重要的。见7.9 optimize table句法。

10.5.8 delete查询的速度
删除一个记录的时间精确地与索引数量成正比。为了更快速地删除记录,你可以增加索引缓存的大小。见10.2.3 调节服务器参数。

从一个表删除所有行比删除行的一大部分也要得多。


10.6 选择一种表类型
用mysql,当前(版本 3.23.5)你能从一个速度观点在4可用表的格式之间选择。

静态myisam
这种格式是最简单且最安全的格式,它也是在磁盘格式最快的。速度来自于数据能在磁盘上被找到的难易方式。当所定有一个索引和静态格式的东西时,它很简单,只是行长度乘以行数量。而且在扫描一张表时,用每次磁盘读取来读入常数个记录是很容易的。安全性来自于如果当写入一个静态myisam文件时,你的计算机崩溃,myisamchk能很容易指出每行在哪儿开始和结束,因此它通常能回收所有记录,除了部分被写入的那个。注意,在mysql中,所有索引总能被重建。
动态myisam
这种格式有点复杂,因为每一行必须有一个头说明它有多长。当一个记录在更改时变长时,它也可以在多于一个位置上结束。你能使用optimize table或myisamchk整理一张表。如果你在同一个表中有象某些varchar或blob列那样存取/改变的静态数据,将动态列移入另外一个表以避免碎片可能是一个好主意。
压缩myisam
这是一个只读类型,用可选的myisampack工具生成。
内存(heap 堆)
这种表格式对小型/中型查找表十分有用。对拷贝/创建一个常用的查找表(用联结)到一个(也许临时)heap表有可能加快多个表联结。假定我们想要做下列联结,用同样数据可能要几倍时间。
select tab1.a, tab3.a from tab1, tab2, tab3
where tab1.a = tab2.a and tab2.a = tab3.a and tab2.c != 0;

为了加速它,我们可用tab2和tab3的联结创建一张临时表,因为用相同列( tab1.a )查找。这里是创建该表和结果选择的命令。

create temporary table test type=heap
select
tab2.a as a2, tab3.a as a3
from
tab2, tab3
where
tab2.a = tab3.a and c = 0;
select tab1.a, test.a3 from tab1, test where tab1.a = test.a1;
select tab1.b, test.a3 from tab1, test where tab1.a = test.a1 and something;

10.6.1 静态(定长)表的特点
这是缺省格式。它用在表不包含varchar、blob或text列时候。
所有的char、numeric和decimal列充填到列宽度。
非常快。
容易缓冲。
容易在崩溃后重建,因为记录位于固定的位置。
不必被重新组织(用myisamchk),除非一个巨量的记录被删除并且你想要归还空闲磁盘空间给操作系统。
通常比动态表需要更多的磁盘空间。
10.6.2 动态表的特点
如果表包含任何varchar、blob或text列,使用该格式。
所有字符串列是动态的(除了那些长度不到4的列)。
每个记录前置一个位图,对字符串列指出哪个列是空的(''),或对数字列哪个是零(这不同于包含null值的列)。如果字符串列在删除尾部空白后有零长度,或数字列有零值,它在位图中标记并且不保存到磁盘上。非空字符串存储为一个长度字节加字符串内容。
通常比定长表占更多的磁盘空间。
每个记录仅使用所需的空间。如果一个记录变得更大,它按需要被切开多段,这导致记录碎片。
如果你与超过行长度的信息更新行,行将被分段。在这种情况中,你可能必须时时运行myisamchk -r以使性能更好。使用myisamchk -ei tbl_name做一些统计。
在崩溃后不容易重建,因为一个记录可以是分很多段并且一个连接(碎片)可以丢失。
对动态尺寸记录的期望行长度是:
3
(number of columns 7) / 8
(number of char columns)
packed size of numeric columns
length of strings
(number of null columns 7) / 8

对每个连接有6个字节的惩罚。无论何时更改引起记录的增大,一个动态记录被链接。每个新链接将至少是20个字节,因此下一增大将可能在同一链连中。如果不是,将有另外一个链接。你可以用myisamchk -ed检查有多少链接。所有的链接可以用 myisamchk -r 删除。

10.6.3 压缩表的特点
一张用myisampack实用程序制作的只读表。所有具有mysql扩展电子邮件支持的客户可以为其内部使用保留一个myisampack拷贝。
解压缩代码存在于所有mysql分发,以便甚至没有myisampack的客户能读取用myisampack压缩的表。
占据很小的磁盘空间,使磁盘使用量减到最小。
每个记录被单独压缩(很小的存取开销)。对一个记录的头是定长的(1-3 字节),取决于表中最大的记录。每列以不同方式被压缩。一些压缩类型是:
通常对每列有一张不同的哈夫曼表。
后缀空白压缩。
前缀空白压缩。
用值0的数字使用1位存储。
如果整数列的值有一个小范围,列使用最小的可能类型来存储。例如,如果所有的值在0到255的范围,一个bigint列(8个字节)可以作为一个tinyint列(1字节)存储。
如果列仅有可能值的一个小集合,列类型被变换到enum。
列可以使用上面的压缩方法的组合。
能处理定长或动态长度的记录,然而不能处理blob或text列。
能用myisamchk解压缩。
mysql能支持不同的索引类型,但是一般的类型是isam。这是一个b树索引并且你能粗略地为索引文件计算大小为(key_length 4)*0.67,在所有的键上的总和。(这是对最坏情况,当所有键以排序顺序被插入时。)

字符串索引是空白压缩的。如果第一个索引部分是一个字符串,它也将压缩前缀。如果字符串列有很多尾部空白或是一个总不能用到全长的varchar列,空白压缩使索引文件更小。如果很多字符串有相同的前缀,前缀压缩是有帮助的。


10.6.4 内存表的特点
堆桌子仅存在于内存中,因此如果mysqld被关掉或崩溃,它们将丢失,但是因为它们是很快,不管怎样它们是有用的。

mysql内部的heap表使用没有溢出区的100%动态哈希并且没有与删除有关的问题。

你只能通过使用在堆表中的一个索引的用等式存取东西(通常用=操作符)。

堆表的缺点是:

你要为你想要同时使用的所有堆表需要足够的额外内存。
你不能在索引的一个部分上搜索。
你不能顺序搜索下一个条目(即使用这个索引做一个order by)。
mysql也不能算出在2个值之间大概有多少行。这被优化器使用来决定使用哪个索引,但是在另一方面甚至不需要磁盘寻道。
10.7 其他优化技巧
对加快系统的未分类的建议是:

使用持久的连接数据库以避免连接开销。
总是检查你的所有询问确实使用你已在表中创建了的索引。在mysql中,你可以用explain命令做到。见7.22 explain句法(得到关于select的信息)。
尝试避免在被更改了很多的表上的复杂的select查询。这避免与锁定表有关的问题。
在一些情况下,使得基于来自其他表的列的信息引入一个“ 哈希”的列有意义。如果该列较短并且有合理的唯一值,它可以比在许多列上的一个大索引快些。在mysql中,很容易使用这个额外列:select * from table where hash='calculated hash on col1 and col2' and col_1='constant' and col_2='constant' and .. 。
对于有很多更改的表,你应该试着避免所有varchar或blob列。只要你使用单个varchar或blob列,你将得到动态行长度。见9.4 mysql表类型。
只是因为行太大,分割一张表为不同的表一般没有什么用处。为了存取行,最大的性能命冲击是磁盘寻道以找到行的第一个字节。在找到数据后,大多数新型磁盘对大多数应用程序来说足够快,能读入整个行。它确实有必要分割的唯一情形是如果其动态行尺寸的表(见上述)能变为固定的行大小,或如果你很频繁地需要扫描表格而不需要大多数列。见9.4 mysql表类型。
如果你很经常地需要基于来自很多行的信息计算(如计数),引入一个新表并实时更新计数器可能更好一些。类型的更改update table set count=count 1 where index_column=constant是很快的!当你使用象mysql那样的只有表级锁定(多重读/单个写)的数据库时,这确实重要。这也将给出大多数数据库较好的性能,因为锁定管理器在这种情况下有较少的事情要做。 11111111111111111111111
如果你需要从大的记录文件表中收集统计信息,使用总结性的表而不是扫描整个表。维护总结应该比尝试做“实时”统计要快些。当有变化而不是必须改变运行的应用时,从记录文件重新生成新的总结表(取决于业务决策)要快多了!
如果可能,应该将报告分类为“实时”或“统计”,这里统计报告所需的数据仅仅基于从实际数据产生的总结表中产生。
充分利用列有缺省值的事实。当被插入值不同于缺省值时,只是明确地插入值。这减少mysql需要做的语法分析并且改进插入速度。
在一些情况下,包装并存储数据到一个blob中是很方便的。在这种情况下,你必须在你的应用中增加额外的代码来打包/解包blob中的东西,但是这种方法可以在某些阶段节省很多存取。当你有不符合静态的表结构的数据时,这很实用。
在一般情况下,你应该尝试以第三范式保存数据,但是如果你需要这些以获得更快的速度,你应该不用担心重复或创建总结表。
存储过程或udf(用户定义函数)可能是获得更好性能的一个好方法,然而如果你使用某些不支持它的数据库,在这种情况中,你应该总是有零一个方法(较慢的)做这些。
你总是能通过在你的应用程序中缓冲查询/答案并尝试同时做很多插入/更新来获得一些好处。如果你的数据库支持锁定表(象mysql和oracle),这应该有助于确保索引缓冲在所有更新后只清空一次。
但你不知道何时写入你的数据时,使用insert /*! delayed */。这加快处理,因为很多记录可以用一次磁盘写入被写入。
当你想要让你的选择显得更重要时,使用insert /*! low_priority */。
使用select /*! high_priority */来取得塞入队列的选择,它是即使有人等待做一个写入也要完成的选择。
使用多行insert语句来存储很多有一条sql命令的行(许多sql服务器支持它)。
使用load data infile装载较大数量的数据。这比一般的插入快并且当myisamchk集成在mysqld中时,甚至将更快。
使用auto_increment列构成唯一值。
当使用动态表格式时,偶尔使用optimize table以避免碎片。见7.9o ptimize table句法。
可能时使用heap表以得到更快的速度。见9.4 mysql表类型。
当使用一个正常web服务器设置时,图象应该作为文件存储。这仅在数据库中存储的一本文件的引用。这样做的主要原因是是一个正常的web服务器在缓冲文件比数据库内容要好得多,因此如果你正在使用文件,较容易得到一个较快的系统。
对经常存取的不重要数据(象有关对没有cookie用户最后显示标语的信息)使用内存表。
在不同表中具有相同信息的列应该被声明为相同的并有相同的名字。在版本 3.23 前,你只能靠较慢的联结。尝试使名字简单化(在客户表中使用name而不是customer_name)。为了使你的名字能移植到其他sql服务器,你应该使他们短于18 个字符。
如果你需要确实很高的速度,你应该研究一下不同sql服务器支持的数据存储的底层接口!例如直接存取mysql myisam,比起使用sql 接口,你能得到2-5倍的速度提升。然而为了能做到它,数据必须是在与应用程序性在同一台机器的服务器上,并且通常它只应该被一个进程存取(因为外部文件锁定确实很慢)。通过在mysql服务器中引进底层myisam命令能消除以上问题(如果需要,这可能是获得更好性能的一个容易的方法)。借助精心设计的数据库接口,应该相当容易支持这类优化。
在许多情况下,从一个数据库存取数据(使用一个实时连接)比存取一个文本文件快些,只是因为数据库比文本文件更紧凑(如果你使用数字数据)并且这将涉及更少的磁盘存取。你也节省代码,因为你不须分析你的文本文件来找出行和列的边界。
你也能使用复制加速。见19.1 数据库复制。
10.8 使用你自己的基准测试
你决定应该测试你的应用程序和数据库,以发现瓶颈在哪儿。通过修正它(或通过用一个“哑模块”代替瓶颈),你能容易确定下一个瓶颈(等等)。即使对你的应用程序来说,整体性能“足够好”,你至少应该对每个瓶颈做一个“计划”,如果某人“确实需要修正它”,如何解决它。

对于一些可移植的基准程序的例子,参见mysql基准套件。见11 mysql 基准套件。你能利用这个套件的任何程序并且为你的需要修改它。通过这样做,你能尝试不同的你的问题的凯发天生赢家一触即发官网的解决方案并测试哪一个对你是最快的凯发天生赢家一触即发官网的解决方案。

在系统负载繁重时发生一些问题是很普遍的,并且我们有很多与我们联系的客户,他们在生产系统中有一个(测试)系统并且有负载问题。到目前为止,被一种这些的情况是与基本设计有关的问题(表扫描在高负载时表现不好)或os/库问题。如果系统已经不在生产系统中,它们大多数将很容易修正。

为了避免这样的问题,你应该把一些力气放在在可能最坏的负载下测试你的整个应用!

10.9 设计选择
mysql在分开的文件中存储行数据和索引数据。许多(几乎全部)其他数据库在同一个文件中混合行和索引数据。我们相信,mysql的选择对非常广泛的现代系统的来说是较好的。

存储行数据的另一个方法是在一个分开的区域保存每列信息(例子是sdbm和focus)。这将对每个存取多于一列的查询获得一个性能突破。因为在多于一列被存取时,这快速退化,我们相信这个模型对通用功能的数据库不是最好。

更常见的情形是索引和数据一起被存储(就象oracle/sybase)。在这种情况中,你将在索引的叶子页面上找到行信息。有这布局的好处是它在许多情况下(取决于这个索引被缓冲得怎样)节省一次磁盘读。有这布局的坏处是:

表扫描更慢,因为你必须读完索引以获得数据。
你损失很多空间,因为你必须重复来自节点的索引(因为你不能在节点上存储行)
删除将随时间变化恶化数据库表(因为节点中的索引在删除后通常不被更新)。
你不能仅使用索引表为一个查询检索数据。
索引数据很难缓冲。
10.10 mysql设计局限/折衷
因为mysql使用极快的表锁定(多次读/一次写),留下的最大问题是在同一个表中的一个插入的稳定数据流与慢速选择的一个混合。

我们相信,在其他情况下,对大多数系统,异常快速的性能使它成为一个赢家。这种情形通常也可能通过表的多个副本来解决,但是它要花更多的力气和硬件。

对一些常见的应用环境,我们也在开发一些扩展功能以解决此问题。

10.11 可移植性
因为所有sql服务器实现了sql的不同部分,要花功夫编写可移植的sql应用程序。对很简单的选择/插入,它是很容易的,但是你需要越多,它越困难,而且如果你想要应用程序对很多数据库都快,它变得更难!

为了使一个复杂应用程序可移植,你需要选择它应该与之工作的很多sql服务器。

当你能使用mysql的crash-me 程序(http://www.mysql.com/crash-me-choose.htmy)来找出你能与之使用的数据库服务器的选择的函数、类型和限制。crash-me现在对任何可能的事情测试了很长时间,但是它仍然理解测试过的大约450件事情。

例如,如果你想要能使用informix 或 db2,你不应该有比18个字符更长的列名。

mysql基准程序和crash-me是独立于数据库的。通过观察我们怎么处理它,你能得到一个感觉,你必须为编写你的独立于数据库的应用程序做什么。基准本身可在mysql源代码分发的“sql-bench”目录下找到。他们用dbi数据库接口以perl写成(它解决问题的存取部分)。

到http://www.mysql.com/benchmark.html看这个基准的结果。

正如你可在这些结果看见的那样,所有数据库都有一些弱点。这就是他们不同的设计折衷导致的不同行为。

如果你为数据库的独立性而努力,你需要获得每个sql服务器瓶颈的良好感受。mysql在检索和更新方面很快,但是在同一个表上混合读者/写者方面将有一个问题。在另一方面,当你试图存取你最近更新了的行时,oracle有一个很大问题(直到他们被清空到磁盘上)。事务数据库总的来说在从记录文件表中生成总结表不是很好,因为在这种情况下,行级锁定几乎没用处。

为了使你的应用程序“确实独立于数据库”,你需要定义一个容易的可扩展的接口,用它你可操纵你的数据。因为c 在大多数系统上可以得到的,使用数据库的一个c 类接口是有意义的。

如果你使用一些某个数据库特定的功能(在mysql中,象replace命令),你应该为sql服务器编码一个方法以实现同样的功能 (但是慢些)。用mysql,你能使用/*! */语法把mysql特定的关键词加到查询中。在/**/中的代码将被大多数其他sql服务器视为一篇注释(被忽略)。

如果高性能真的比准确性更重要,就像在一些web应用程序那样。一种可能性是创建一个应用层,缓冲所有的结果以给你更高的性能。通过只是让老的结果在短时间后‘过期’,你能保持缓存合理地刷新。这在极高负载的情况下是相当不错的,在此情况下,你能动态地增加缓存到更大并且设定较高的过期时限直到一切回到正常。

在这种情况下,创建信息的表应该包含缓存初始大小和表一般应该被刷新几次的信息。

10.12 我们已将mysql用在何处?
在mysql起初开发期间,mysql的功能适合我们的最大客户。他们为在瑞典的一些最大的零售商处理数据仓库。

我们从所有商店得到所有红利卡交易的每周总结并且我们被期望为所有店主提供有用的信息以帮助他们得出他们的广告战如何影响他们的顾客。

数据是相当巨量的(大约每月7百万宗交易总结)并且我们保存4-10年来的数据需要呈现给用户。我们每周顾客那里得到请求,他们想要“立刻”访问来自该数据的新报告。

我们通过每月将所有信息存储在压缩的“交易”表中来解决它。我们有一套简单的宏/脚本用来生成来自交易表的不同条件( 产品组,顾客id,商店...)的总结表。报告是由一个进行语法分析网页的小perl脚本动态生成的网页,在脚本中执行sql语句并且插入结果。现在我们很想使用php或mod_perl,但是那时他们没有。

对图形数据,我们用c语言编写了一个简单的工具,它能基于sql查询的结果(对结果的一些处理)产生赠品,这也从分析html文件的perl脚本中动态地执行。

在大多数情况下,一个新的报告通过简单地复制一个现有脚本并且修改其中的sql查询来完成。在一些情况下,我们将需要把更多的字段加到一个现有的总结表中或产生一个新的,但是这也相当简单,因为我们在磁盘上保存所有交易表。(目前我们有至少50g的交易表和200g的其他顾客数据)。

我们也让我们的顾客直接用odbc存取总结表以便高级用户能自己试验数据。

我们用非常中档的sun ultra sparcstation ( 2x200 mz )来处理,没有任何问题。最近我们升级了服务器之一到一台2个cpu 400 mz的ultra sparc,并且我们现在计划处理产品级的交易,这将意味着数据增加10番。我们认为我们能通过只是为我们的系统增加更多的磁盘就能赶上它。

我们也在试验intel-linux以便能更便宜地得到更多的cpu动力。既然我们有二进制可移植的数据库格式(在3.32中引入),我们将开始在应用程序的某些部分使用它。

我们最初的感觉是linux在低到中等负载时执行的较好,但是你开始得到导致的高负载时,solaris将表现更好,因为磁盘io的极限,但是我们还没有关于这方面的任何结论。在与一些linux核心开发者的讨论以后,这可能是 linux 的副作用,它给批处理以太多的资源使得交互的性能变得很低。当大的批处理正在进行时,这使机器感觉很慢且无反应。希望这将在未来的linux内核中解决。


陈朋奕 2005-10-29 10:49
]]>
google搜索技巧2005版(google search tips 2005)(转载)http://www.blogjava.net/chenpengyi/archive/2005/10/21/16366.html陈朋奕陈朋奕fri, 21 oct 2005 14:39:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/21/16366.htmlhttp://www.blogjava.net/chenpengyi/comments/16366.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/21/16366.html#feedback1http://www.blogjava.net/chenpengyi/comments/commentrss/16366.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/16366.html1. 双引号可以用减号代替,比如搜索["like this"]与搜索[like-this]是一个效果

2. google不会处理一些特殊的字符,比如[#](几年前还不行,现在可以了,比如搜索[c#]已经可以搜到相应的结果),但是还有一些字符它不认识,比如搜索[t.]、[t-]与[t^]的结果是一样的

3. google充许一次搜索最多32个关键词

4. 在单词前加~符号可以搜索同义词,比如你想搜索[house],同时也想找[home],你就可以搜索[~house]

5. 如果想得到google索引页面的总数,可以搜索[* *]

6. google可以指定数字范围搜索。搜索[2001..2005]相当于搜索含有2001、2002直到2005的任意一个数的网页

7. 搜索[define:css]相当于搜索css的定义,这招对想学习知识的人很有效;也可以用[what is css]搜索;对中文来说,也可以用[什么是css]之类的

8. google有一定的人工智能,可以识别一些简单的短语如[when was einstein born?]或[einstein birthday]

9. 通过[link:]语法,可以寻找含有某个链接的网页,比如[link:blog.outer-court.com]将找到包括指向 blog.outer-court.com超级链接的网页(最新的google blog search也支持这个语法),但是google并不会给出所有的包含此链接的网页,因为它要保证pagerank算法不被反向工程(呵呵,可以参见那两个google创始人关于pagerank的论文,可下载)

10. 如果在搜索的关键词的最后输入[why?],就会在结果中出现链接到google answers的链接 ,在里面可以进行有偿提问

11. 现在出现了一种兴趣活动,叫做google hacking,其内容是使用google搜索一些特定的关键词,以便找到有漏洞的、易被黑客攻击的站点。这个网站列出了这些关键词:google hacking database(
)

12. 在google 中输入一组关键词时,默认是“与”搜索,就是搜索包含有所有关键词的网页。如果要“或”搜索,可以使用大写的[or]或 [|],使用时要与关键词之间留有空格。比如搜索关键词[hamlet (pizza | coke)],是让google搜索页面中或页面链接描述中含有hamlet,并含有pizza与coke两个关键词中任意一个的网页。

13. 并非所有的google服务都支持相同的语法,比如在google group中支持 [insubject:test]之类的主题搜索。可以通过高级搜索来摸索这些关键词的用法:进入高级搜索之后设置搜索选项,然后观察关键字输入窗口中的关键字的变化

14. 有时候google懂得一些自然语言,比如搜索关键词[goog], [weather new york, ny], [new york ny]或[war of the worlds],此时google会在搜索结果前显示出一个被业内称为“onebox”的结果,试试看吧!

15. 并非所有的google都是相同的,它因国家版本(或是说语言版本)而异。在us版下,搜索[site:stormfront.org]会有成千上万的结果,而在德语版下,搜索[site:stormfront.org]的结果,嗯,自己看吧。google的确与各国政府有内容审查协议,比如德国版,法国版(网页搜索),中国版google新闻

16. 有时候google会提示你搜索结果很烂,比如你搜索关键词[jew]试试,google会告诉你它给出的搜索结果很烂,然后给你一个解释:


17. 以前,搜索某些关键词如[work at google] 时会看到google给自己打的广告。可以去

18. 对于一些“googlebombed”(大概意思是指google搜索的结果出问题了)的关键词,会有一个广告链接到:http: //googleblog.blogspot.com/2005/09/googlebombing-failure.html (中国大陆需要代理才能访问)。比如搜索[failure],第一条是美国布什总统介绍

19. 虽然现在google还没有支持自然语言,但这里有一段录像显示了支持自然语言的搜索引擎的使用效果:


20. 有人说在google中搜索[president of the internet],其结第一条表明了president of the internet是谁,我也是这么认为的,而且你还可以使用这个logo支持本文作者: court.com/files/president.gif

21. google现在不再有“stop words”(被强制忽略的关键词),比如搜索 [to be or not to be], google返回的结果中间还列有相关的完整短语搜索结果

22. 在google 计算器(
)中有个彩蛋:输入[what is the answer to life, the universe and everything?]时,会返回42。(关键词翻译过来的意思是指“生命、宇宙和一切的答案”,这是一个著名科幻小说中的情节,详情参见http: //en.wikipedia.org/wiki/the_answer_to_life,_the_universe, _and_everything)。试试吧,哈哈

23. 你可以在搜索时使用通配符
  • ,这在搜索诗词时特别有效。比如你可以搜一下["love you twice as much * oh love * *"] 试试

    24. 同样,你的关键词可以全部都是通配符,比如搜索["* * * * * * *"]

    25. www.googl.com是在输错网址后的结果,也是个搜索网站,但搜索结果与google完全不同。而且此网站也赚google的钱,因为它使用google adsense

    26. 如果你想把搜索结果限制在大学的网站之中,可以使用[site:.edu]关键词,比如[c-tutorial site:.edu],这样可以只搜索以edu结尾的网站。你也可以使用google scholar来达到这个目的。也可以使用[site:.de]或[site:.it]来搜索某个特定国家的网站

  • 由于是转载自,因此不做任何修改。如果作者有意见可以跟我联系,我立刻撤下。



    陈朋奕 2005-10-21 22:39
    ]]>
    mysql的 连接/联结(join)语法(原创!)http://www.blogjava.net/chenpengyi/archive/2005/10/17/15747.html陈朋奕陈朋奕mon, 17 oct 2005 14:53:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/17/15747.htmlhttp://www.blogjava.net/chenpengyi/comments/15747.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/17/15747.html#feedback7http://www.blogjava.net/chenpengyi/comments/commentrss/15747.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/15747.html阅读全文

    陈朋奕 2005-10-17 22:53 发表评论
    ]]>
    南开大学经济学院硕士生入学考试试题http://www.blogjava.net/chenpengyi/archive/2005/10/13/15429.html陈朋奕陈朋奕thu, 13 oct 2005 09:01:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/13/15429.htmlhttp://www.blogjava.net/chenpengyi/comments/15429.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/13/15429.html#feedback1http://www.blogjava.net/chenpengyi/comments/commentrss/15429.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/15429.html南开大学1994年硕士入学考试

     

    1、解释“需求价格”和“供给价格”的概念,没有这两个概念均衡价格理论能否成立?它们在均衡价格理论中有何意义?

    2、在完全竞争的假定条件下,厂商理论是怎样说明市场的长期均衡机制的?

    3、什么是经济租金?它与生产者剩余有何关系?

    4、在“islm”模型中,产品市场与货币市场相互影响的传导机制是什么?如何操纵lm曲线来改变双重均衡状态?

    5、为什么凯恩斯主义者认为“年平衡预算政策”是一种不可取的财政政策?

    6、如图所示,当双重均衡点e取位于外部均衡曲线eb的右边时,国际收支是有逆差还是有顺差?如果汇率可自由浮动,说明达到外部均衡的过程。

    一、论述题(每题20分,共40分)

    1、货币主义者和凯恩斯主义者关于“财政政策有效还是货币政策有效”的争论焦点在何处?为什么?

    2、简述一般均衡过程的条件和保证其实现的机制,你认为一般均衡理论能否概括市场经济运行的基本经济关系?

     

     

    南开大学1995年硕士入学考试

    1、举例说明,货物税由消费者和卖者各负担的程度取决于需求价格弹性和供给价格弹性的大小。

    2、怎样从消费行为来推导个人需求曲线?

    3、什么是福利三角形,它是怎样形成的?

    4、为什么说个人的劳动供给曲线会呈弓形,它是怎样推导出来的?

    5、以劳动这个生产要素为例,说明厂商在产品市场处于卖方垄断时和在劳动市场处于买方垄断时,对劳动的剥削。

    一、             论述题(共40分)

    1、  财政赤字是否必然会引起通货膨胀?为什么?

    2、islm模型中产品市场和货币市场相互影响的传导机制是什么?你认为它们在中国是否也同样起作用?为什么?

    南开大学1996年硕士入学考

    1、  如何根据“效用最大化”消费行为推导消费者个人的需求曲线?

    2、  用图示说明长期成本曲线与短期成本曲线的关系。

    3、  简述以边际生产力为基础的收入分配理论。

    4、  gnp-折旧-间接税=ni”与“有一美元收入就有一美元的最终产品”是否矛盾?为什么?

    5、  简要说明浮动汇率制度下,国际收支与汇率的关系。

    6、  什么是拉弗曲线?请简要加以解释。

     

    二、             计算题(20分)

    1、  某图书出版公司是在两个相互独立的市场上进行销售的垄断厂商,它在第一个市场的边际收益曲线为:mr1202q1,在第二个市场的边际收益线为:mr2153q2q1q2分别为两个市场上的日销售量。如果一本书的边际成本为6美元,该厂商在这两市场分别销售多少本书?

    2、  已知:c2004/5dint=-2251/4ni

    i100gp200

    (1)       求均衡国民收入。

    (2)       如果充分就业的均衡国民收入为1950,怎样才能达到充分就业状态?

    三、             论述题(20分)

    以下两题中,参加全国统考的答第一题;参加单考的答第二题。

    1、货币主义者和凯恩斯主义者之间,关于问题的争论焦点集中在货币流通速度上?为什么?

    2、在完全竞争条件下,厂商的长期均衡和市场均衡是怎样联系在一起的。

     

     

    南开大学1997年硕士入学考试

     

    1、如图所示:消费者效用最大化的均衡条件是什么?如果消费者的消费点在a点,用公式表示他处于什么状态,他将怎样调整才能达到效用最大化?

    2、以边际生产力为基础的收入分配理论是怎样在收入分配公式和生产函数之间建立联系的。

    3、简要说明银行存款(或货币)创造过程中有那些漏出量会使分行的乘数作用减弱。

    4、请用图示简要推导出外部均衡曲线(eb曲线)

     

    一、             计算题(20分。每题10分;马列答34题,其它专业答12题)

    1、已知某一垄断厂商的边际成本曲线为一直线:mc602q其中,mc为边际成本,q为产量;厂商面对的需求曲线为:p100q;其中p为产品价格。求利润最大化的产量q和价格p

    2、柯布-道格拉斯生产函数为qa lαkβ;式中,q为产出量,l为劳动投入量,k为资本投入量,aα ,β为该函数中既定的参数。求mrtsl , kmplmpk

    3、已知某商品的需求函数为:p702q 该商品的供给函数为:p102q 其中,p为价格,q为产量。求:均衡价格p和均衡产量q

    4、画出第三题中的需求函数图像和供给函数图像;并标出均衡点e的位置,以及均衡产量qp

     

    三、论述题(40分,每题20分)

    1、  比较完全竞争、完全垄断、垄断竞争这三者在市场结构,均衡条件等方面的异同;并对它们作为不同产品分配方式的利弊得失做出分析。

    财政赤字产生的原因有哪些?为什么要将自动的财政政策与相机抉择的财政政策加以区分。你主为要使这种区分变得具有可操作性,尚需具备哪些条

    陈朋奕 2005-10-13 17:01
    ]]>
    google在旧金山提供覆盖全城的免费wifi无线局域网接入服务!http://www.blogjava.net/chenpengyi/archive/2005/10/06/14860.html陈朋奕陈朋奕thu, 06 oct 2005 03:38:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/06/14860.htmlhttp://www.blogjava.net/chenpengyi/comments/14860.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/06/14860.html#feedback1http://www.blogjava.net/chenpengyi/comments/commentrss/14860.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/14860.html  
         google又要做好事了,这次他要在旧金山为该市市民提供可覆盖全城的无线局域网服务,俺确实有点不理解google了,又是免费,而且还是一项巨大的工程?google的发言人说仅仅会通过为用户提供google的搜索服务和部分广告来维持自己的服务,随便估算都知道单单通过广告是根本不能维持这个服务的,如果可以的话,at&t那些公司还收费那么高干什么呢?而且这样做很明显的触犯了他们的利益,就像skype的skypeout在中国触犯中国电信的利益一样,这些归属权力机构的垄断部门怎么能让别人去侵害自己的既得利益呢?(说点题外话,这段时间跟一个在华为的师兄聊天,探讨人生和社会,然后既说到他现在的工作,每天累死累活的,加班是绝对的,回家了还得自己赶着紧学习新的技术,it行业技术更新太快了……而很多电信工作人员基本什么都不懂,却领着高工资、趾高气扬的指挥他做这个做那个的,他就想不通了,到底自己什么不如人家,论文凭、论能力都不比人家低,为什么这么累拿到的钱还不如人家每天看报纸拿的多?难道relationship真的那么重要?题外话了,不说了)。

          果然,google将面临电信运营商sbc通信公司和verizon通信以及有线电缆运营商comcast的诉讼,同时这些公司公开或者私下谴责旧金山市政府的这一项目,称这是一个并不明智的行为,因为低成本互联网接入业务已经相当普及。而且google想要做这种事情还需要立法机构的批准,旧金山政府官员也认为这实现起来不容易,因为现有的电信运营商在立法机构中占有了相当的席位……,靠,又是代表资本家的官僚,垃圾(我最喜欢骂出口的台词,^_^)。

          而作为旧金山的市政府是很支持这个工程的,因为他们认为造成穷人和富人之间的差距的原因之一就是获取信息量的多与少,穷人很难得到自己想要的致富的信息,而富人却很容易,因此信息造成了这个时代的穷与富。无论现有的电信运营商如何批评或指责,他们仍然坚持通过普及宽带接入来缩小穷人和富人之间在信息时代的数字差距。同时该市市长表示,民众有获得信息这一最基本的公民权利。的确市很开明的政府,能真正为了市民着想,而不像某些市的政府,花大价钱只为做个豆腐渣的形象工程。

          虽然这个计划实现起来不容易,但相信以google的能力,假以时日,应该可以实现,那时google以前收购的那些地下黑光缆就要发挥作用了。google似乎要涉足it的每一个行业,但相信他不是为了去垄断才进入这个行业的,而是奉行他一直的理念:don't
    be evil!所以这样做其实更多是为了给自己争取足够的实力去对抗evil的monopoly们。期待google能早日实现这个愿望。

          顺便提提,google要和sun合作了,听到这个消息确实高兴,首先是因为自己喜欢google(可惜整天被某个电信屏蔽,经常连不上,太evil了),同时也是java程序员,这两个公司的合作确实是好事。之前看了一篇的文章,说如果google和sun的合作是为了google office,那么的版主是绝对不会去用的。这里我有不同意见,不知道大家使用过open office没有?其实用过的也应该知道,sun公司的软件确实是不错的,我敢说solaris比linux和windows xx都强,只是因为sun的硬件不是那么强,但软件又是搭配硬件销售的,所以才……因此openoffice是不会比微软的office差多少,至少我用过,而且在很多方面微软的office还是抄袭他的功能,更多是因为平台的问题导致了他的不流行,如果现在就放弃这个项目,那真的就是一种遗憾了。难道就看着微软垄断了?强强联手去打破这种垄断不是更好吗?虽然不知道是否要在openoffice项目上合作,但相信他们的实力,新版的wps我支持,所以google office我一定支持(最好是更java有关的吧,呵呵)!

    陈朋奕 2005-10-06 11:38
    ]]>
    qq携带病毒事件后续http://www.blogjava.net/chenpengyi/archive/2005/10/06/14856.html陈朋奕陈朋奕thu, 06 oct 2005 02:41:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/06/14856.htmlhttp://www.blogjava.net/chenpengyi/comments/14856.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/06/14856.html#feedback2http://www.blogjava.net/chenpengyi/comments/commentrss/14856.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/14856.html      关于qq携带病毒的事情,和emu兄有了写讨论,发现自己也确实不好掺和在里面,在这里也要感谢emu老兄。而qq是否带毒,我也不发表任何评论了,只是摘抄一些最新的评论让关注的人知道些信息吧。

    以下引自donews:
    qq病毒事件全程追踪调查!---腾讯公司关于qq病毒事件的历史回顾:

    起因: qq最近在其官方网站上推出了qq2005 beta3版,吸引了很多用户试用。这本来是件好事情,却爆出了这个版本的qq可能含有病毒的消息。(延伸阅读:网友怒曝:qq 2005 beta3版带会自动改名的病毒)

      为了证实这个消息的真实性,我赶紧到上下载了一个qq2005 beta3,进行了详细而认真的测试。

      以下是测试结果:

      1、这个版本的qq安装时,生成4个额外的病毒文件:这个版本的qq安装完毕后,除了生成qq正常使用的文件外,的确会在系统文件夹c:\windows\downlo~1下生成多余的4个文件,其中2个为dll动态库文件,1个为exe可执行文件,一个为dat数据文件。这4个文件互相配合,形成了一套功能完备的病毒程序(病毒行为详见后面的分析)

      2、病毒文件会在系统注册表中增加一个独立于qq启动项之外的启动项:这4个文件被创建后,会在系统注册表中增加一个名为“_tbhtray”的启动项,路径指向刚才所发现的2个dll文件中的一个,以保证这些文件能在系统启动时被自动加载。因此,他们的自我启动,在此时与qq是否存在无关了

      3、病毒文件采用多种方法实现自我隐藏:不知出于何种目的,这4个文件在自我隐藏方面可谓煞费苦心,集多个典型病毒的隐藏方法于一身,分别是: 
                文件名随机生成,即便在同一台电脑上,每次安装qq2005 beta3,这4个文件的文件名都不相同,使得你很难找到 调用系统函数,将自身的文件属性设置为系统级,使得在windows窗口模式下根本无法看到这些病毒文件,必须使用dos命令行模式才可看到。 
                无论你何时安装,它会自动将dll文件的生成时间设置为2005-9-8 16:38,这是qq 2005beta3证实发布之前的日期,使你很容易忽略和qq 2005 beta3的联系。

      4、该病毒使用钩子技术实现了自我保护机制,使用户根本无法手工删除该病毒
      在系统的最底层,挂了一个debug钩子,这个钩子随着系统的启动而启动,即使在安全模式下也会运行,保证从最底层获得系统的控制权。

      此外,该病毒还另外挂了cbt钩子和键盘监视钩子,这两个钩子和前面提到的debug钩子相互配合,互相保护,不断刷新系统注册表及自身文件列表,一旦发现注册表项或文件项被删除,即会自动重新创建。这三个钩子均无法手工停止,即便杀死qq所有的进程后依然在工作。

      5、该病毒具备自我升级机制,会绕开防火墙随时从互联网上升级到更新的版本

      该病毒的exe文件负责客户端与互联网服务器的通信与升级,此exe文件在用户每次打开ie时都会向互联网服务器发回信息,并根据服务器的指令决定是否升级。由于该程序利用了ie访问网络的80端口,因此会绕开绝大多数的网络防火墙,使得升级在不知不觉在进行!

      6、该病毒记录了用户上网所一举一动,并很有可能将这些内容打包发给了它的服务器

      由于该病毒在系统中挂了一个键盘钩子和cbt钩子,它截获并记录用户使用电脑的一举一动,包括访问的网址,地址栏输入的内容,搜索词,用户名及密码等。同时我还发现,在我打开ie 时,这个病毒均会向服务器会传一大堆的数据,由于这些数据已经加密,我无法获知究竟是什么内容,但根据数据排列和信息量来看,极有可能是用户上网的访问记录等极其敏感的隐私信息!

      7、该病毒在qq卸载后依然会存在在用户的机器中,无法彻底清除

      如果将qq 2005 beta3卸载掉,这个时候,病毒文件依然会保留在机器里,并不被卸载掉。如果重新安装一遍,由于病毒的文件名是随机生成的,则又会在系统中增加一整套病毒文件。往复几次,则硬盘中的病毒文件数量将触目惊心!这些病毒文件互相嵌套,关系错综复杂,使得用户根本无法分清彼此间的关系,根本无法将该病毒彻底清除干净!

      综上所述,此程序已经具备了病毒所有的特性:自我隐藏、自我变形、自我保护、快速传播、截获用户输入、悄悄升级等,因此,我可以得出颇为肯定的结论:

      在qq官方网站推出的qq 2005 beta3内嵌了一个地地道道的病毒程序!

      由于分析工作没有全部完成,加之该病毒正处在潜伏期,目前还不是很清楚该病毒程序所做的一切行为,但目前已经能对该病毒的危害得出一定的结论了。该病毒会产生的危害有:

      1、降低系统稳定性,导致部分用户电脑崩溃

      由于该病毒中滥用文件变名、debug钩子、自我保护等技术,使得系统稳定性大受影响。测试期间,测试机多次停止响应。如果使用工具强制删除掉该病毒其中的某个dll文件,由于该病毒自我保护机制的不成熟,甚至会使得启动无法启动。
      由于qq是全国装机量最大的软件,覆盖在上千万台电脑上,只要以上问题出现概率大于1%(事实上我测试时接近10%),必将导致数十万的用户无法继续使用电脑,危害相当严重!!

      2、急剧降低系统性能

      由于该病毒在不断的刷新注册表、文件列表,同时利用钩子截获用户的所有输入,因此使得系统性能极具下降,这种下降在打开ie时表现得尤为明显。在未安装此病毒的测试机上,连续打开10个ie后,再打开ie窗口的速度与没有明显减慢;在已安装此病毒的测试机上,打开第一个ie窗口时就明显感觉到顿挫感,在打开第10个窗口时,常需数秒以上,最长时甚至长达1分钟,无法忍受!!

      在访问新浪、搜狐等大型网站时,也能明显感觉到打开网页的速度明显降低,常常点击链接后机器失去响应数秒。

      3、窃取用户隐私

      该病毒截获了用户所有的输入,因此安装了该病毒的机器即无隐私可言,上网的网址、输入的用户名、密码、搜索用过的搜索词均会被该病毒截获。最严重的,如果用户在机器上使用过银行的网上支付系统,则存在极大的风险丢失卡号及密码,被偷盗钱财。

      4、有可能在互联网上引发又一次轮蠕虫冲击波,导致互联网瘫痪

      由于附着在qq上,所以该程序会以每天近百万的速度散播在互联网上,不需要太久,它将在数千万台电脑上潜伏。如果该病毒象其它病毒一样,集中在一天内爆发,那将是比冲击波更大的灾难,整个互联网,用户的机器,都将瘫痪,后果不堪设想!!

      对于这样严重的病毒事件,强烈要求腾讯公司给出明确说法并对广大用户公开道歉!此外,我已经把这病毒程序提交给了诺顿、卡巴司机等多个病毒厂商,希望他们尽快能将其加入最新病毒库,保障网民的安全!同时我也奉劝广大互联网用户,在该问题解决之前,不要下载安装qq 2005 beta3

    结果:


    今天看了这篇通告:

    尊敬的用户:


    腾讯qq2005 beta3中,有一个可选择安装的地址栏搜索插件。该插件采用了“动态文件名”技术,此项技术在一些反病毒软件中可能引起误报,可能会给部分用户带来困扰,对此我们深表歉意。


    为此,我们修正了地址栏搜索插件,去除了容易误会的“动态文件名”技术,用户可以自主选择是否下载升级。


    感谢广大用户对腾讯公司的关爱和支持。


    腾讯公司

    二oo五年九月三十日

    评论:

    我想肯定是qq安全中心(和金山毒霸合作搞的)拿我们用户当试验品,而腾讯公司为了逃避责任,力图欺骗qq大众不懂技术,用"动态文件名"来蒙我们.没有一点诚意!

    同时我警告一些杀毒软件公司不要干一些违背职业道德的事,会遭到大众的漫骂的.

    必须公开道歉!

    【文章结束】

    作者说得似乎有点危言耸听,不过俺还是不发表评论的好,呵呵,只是今天donews又把这件事情翻起来抄,觉得有意思,所以将内容转过来给咱们blogjava的人看看。
    btw:前段时间下了lumaqq旧版的源代码,分析了一下,程序比较大,不知道什么时候才能看完,毕竟lumaqq是java编写的,而且功能还比较强(呵呵,可以通过插件发现隐身的朋友哦,够实在了吧),其他的如gaim这些跟java八辈子打不到一起,而jxta在国内基本没有了声息,郁闷啊,以前还花了几个星期功夫把jxta的教程看完了,以为可以赶上躺,凑个热闹,可惜啊……



    陈朋奕 2005-10-06 10:41
    ]]>
    mysql 5.0新特性之视图(中文教程,原创)http://www.blogjava.net/chenpengyi/archive/2005/10/05/14809.html陈朋奕陈朋奕wed, 05 oct 2005 03:39:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/05/14809.htmlhttp://www.blogjava.net/chenpengyi/comments/14809.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/05/14809.html#feedback5http://www.blogjava.net/chenpengyi/comments/commentrss/14809.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/14809.html         花了国庆的部分时间,终于完成了这个教程的翻译了,现在可以想象当年候捷先生翻译think in java是多么困难的了,唉,累啊,好久没运动过了,快找个机会去玩玩。可惜深圳没什么地方可以运动的,订运动场稍微慢一点就没了……政府问题,不去讨论。

             回到正题,关于这个翻译我十分推荐大家看看,因为对mysql来说,实现了视图确实是一个很大的进步,而且能给mysql开发者带来的好处不仅仅是速度上的,更多是开发和维护效率上的改进。


            这里举一个书中的例子吧:


    example: constraint checks 示例:约束条件检查

    mysql支持not null的列约束,如:
     
    create table t ( 

      column1 int not null,  

      column2 int not null); 
     


    这并非mysql约束的全部功能,但是还是不能做到只允许两列中其中一列可以为空或者让列1数值在1到5之间,又或者使列1在某些特殊情况下可以为空。不过,我们可以使用视图的定义通过下面的方法实现:

    create table t (column1 int, column2 int);
     
    create view v as

    select column1, column2 from t

    where (column1 is not null or column2 is not null) 

      and column1 between 1 and 5

    with check option; 

     
    之后就可以通过对视图v进行插入或更新,达到我前面所需要的效果,在特殊情况下允许为空。


     是不是比较有用呢?前面我写了篇关于mysql子查询的文章,但有了视图其实可以免去部分使用子查询的情况,大家看看下面这个例子吧:



    示例:子查询的替代
     
    在mysql 4.1版本以后就开始支持from语句中的子查询了,例如:

     
    select *

    from (select * from t2 union select * from t3) as t2_t3; 

     
    但是下面这样做会更好:
     

    create view t2_t3 as

    select * from t2 union select * from t3;
     
    select * from t2_t3;



    把这个转化为对视图的查询会更好更方便,因为你可能会使用复杂的对大数字的查询语句(比方说55个字),语句中包括对系统变量的一些定义,那如果有人改变了表t2,你可能要改这个55字的select语句,然而使用视图,一切都没变,你需要改的只是视图定义中的表名。 


     
    另一个子查询的例子:在mysql 5.0.3中不允许使用avg(distinct ...),因为下面这个语句是非法语句: 

     
    select avg(distinct column1) from t;
     
    但采用下面方法能实现一样的效果,而且是合法的:
     
    create view v as select distinct column1 from t;
     
    select avg(column1) from v;


    下面是中文版的下载地址:


    转载时保留个人及出处信息,否则可能被视为侵权,呵呵。

    如果需要英文原版,可以到下面地址下载:





    陈朋奕 2005-10-05 11:39 发表评论
    ]]>
    最近作的一个博弈模型http://www.blogjava.net/chenpengyi/archive/2005/10/02/14677.html陈朋奕陈朋奕sun, 02 oct 2005 15:52:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/02/14677.htmlhttp://www.blogjava.net/chenpengyi/comments/14677.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/02/14677.html#feedback1http://www.blogjava.net/chenpengyi/comments/commentrss/14677.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/14677.html在本文的分析中,我们定义了公司前五大股东为公司的大股东,从描述性统计中可以看出,我国上市公司第一大股东和其他大股东持股比例之间存在明显的差异,我国上市公司前五大股东持股比例依次为43.9977%8.4862%3.3620%1.8621%1.1844%。可见第一大股东处于绝对优势地位,第二至第五大股东的持股比例不高,但我们仍然不可以忽视以第二大和第三大股东为代表的制衡性股东对第一大股东的制衡作用,由此根据实证分析的结果,我们对前五大股东进行相应的划分:股东l为第一大股东或是控股地位,持股比例a,股东m代表第二或第三大股东,所占股份为bs代表其他大股东,其持股比例为c,则有a>b>c0λ1λ2λ3 分别表示监督强度,与持股比例有关, 持股比例越大, 监督强度越大.λi=λ(a,b,c,s),s公公为司规模,设监督成本为c, c 是监督强度q 和公司规模s 的函数, c = c (q , s )(引用唐国宗等研究),为了便于研究,我们假定所有的制衡(侵害)成本相同,当大股东没有选择制衡(或是侵害), 则制衡(侵害)的成本为0同时我们设定项目收益为r(来自项目的投资回报) ,l大股东企图通过侵害获得的收益为在一次性博弈中,控制股东l根据自身的成本收益情况,确定是否侵害其他股东利益;而股东ms由于其处于相对劣势地位,并没有动机去侵害l的利益,只能选择制衡(在决策图中用“y”表示)或是不制衡(在决策图中用“n”表示),同时为了去区别sm大股东的制衡效果及其收益,根据实证研究结果我们假定,大股东m可以在其制衡中获取或是挽回收益,而大股东s由于其持股比例过低,其所拥有的收益索取权几乎可以忽略不计,为此s无法从制衡中获取或是挽回相应的收益具体的博弈决策树模型及其收益如下:                   
     图:博弈决策树略

     

     

        根据上图的收益分布,我们可以比较明显的看到,当1 /(λ1 λ2 λ3)]*(r-) -c>[λ1 /(λ1 λ2 λ3)] *r, 1 /(λ1 λ2 λ3)]*ca>0 ,也就是说,l从侵害其他各方的行为中获得的收益大于成本和因侵害带来的收益总数减少的份额之和时,就会选择侵害其他股东的利益,而在l选择侵害的情况下,只要2/(λ1 λ2 λ3)]* (r-) 2 /(λ1 λ2)]-cb>[λ2/(λ1 λ2 λ3)]* (r-) - [λ2 /(λ3 λ2)]* m就会选择制衡,即当λ2[1 /(λ1 λ2)  1/(λ3 λ2)] > c时,也就是说,当m的制衡收益(或是挽回的损失)高于其成本时,m的占优策略是选择制衡;而对于s来说,无论在任何情况下,制衡都不可能出现利己的结果,所以s更倾向于“搭便车”,或是以“用脚投票”的方式选择退出。当l选择侵害时,对整个公司而言,此时总收益为r-c,小于各方都不侵害(或制衡)时的收益r,所以这是一种非效率的均衡状态,必须通过博弈规则的修改实现向效率均衡的转变。

    可以考虑三种途径,第一,降低λ1 /(λ1 λ2 λ3)的值,直至1 /(λ1 λ2 λ3)]*> ca,也就是优化股权结构,通过不同股东之间的相互制衡降低控制股东侵害中小股东利益时获得的额外收益。第二种,降低的值,直至[(λ2 λ3) /(λ1 λ2 λ3)]*< ca,也即在现有股权结构下,通过规范控制股东行为、加强监管,降低控制股东侵害中小股东利益的直接收益。第三种,增加c,使得[(λ2 λ3) /(λ1 λ2 λ3)]*< ca,即通过加强中小股东利益保护的措施,使控制股东在侵害中小股东利益时必须付出额外成本。

    同时我们也可以发现,当大股东m选择制衡时,可以较大程度的减l的侵害收益,直至是l放弃侵害,所以在股权结构设计中提高制衡行股东的持股比例,也是防止第一大股东或控股股东侵害中小股东的有效办法。通过以上这些途径,最终改变了支付矩阵,迫使控制股东重新进行成本收益分析,实现了从(侵害,不制衡,不制衡)到(不侵害,不制衡,不制衡)均衡状态的转变。在这个过程中,股权结构的约束作用体现得非常明显,控制股东和其他股东的股权比例越接近,对控制股东的约束性也就越强,控制股东行为就越与其他股东及公司整体利益保持一致。

     



    陈朋奕 2005-10-02 23:52
    ]]>
    计量经济学术语http://www.blogjava.net/chenpengyi/archive/2005/10/01/14585.html陈朋奕陈朋奕sat, 01 oct 2005 05:29:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/01/14585.htmlhttp://www.blogjava.net/chenpengyi/comments/14585.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/01/14585.html#feedback5http://www.blogjava.net/chenpengyi/comments/commentrss/14585.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/14585.html阅读全文

    陈朋奕 2005-10-01 13:29 发表评论
    ]]>
    新版qq携带恶性病毒(个人看法,仅供参考)!http://www.blogjava.net/chenpengyi/archive/2005/10/01/14577.html陈朋奕陈朋奕sat, 01 oct 2005 03:36:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/10/01/14577.htmlhttp://www.blogjava.net/chenpengyi/comments/14577.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/10/01/14577.html#feedback10http://www.blogjava.net/chenpengyi/comments/commentrss/14577.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/14577.html         真是不看不知道,一看吓一跳,腾讯居然玩起病毒来了,原本好好的qq非要带上病毒,搞得网民们心惊胆战的。本来还想下载这个所谓的新版的qq用用,其实新版估计也没什么功能上的创新了,顶多也就是多了几个无聊的功能,根本不是im所需要的,这里顺便骂两句,qq是im,不是整合的娱乐平台,没事干把一个mp3播放器硬拼进去了,是炫耀技术么?这mp3播放软件的编写技术对于现在的程序员来说太简单了,当然要到winamp和foobar的水平还是不够,但qq上带的这个也确实是烂啊,资源占用大,功能弱,那我们为什么要用这个呢?反正是不喜欢没用又要占用资源的东西,特别是这些强制赠送的垃圾软件(不是说这个mp3播放软件垃圾,如果分开作为一个产品其实还是蛮可以接受的,只是因为腾讯硬要把这两个不相关的东西放在一起,最后造成1 1<1的结果)。

             好,回到正题,新版的qq携带的病毒是腾讯对外宣称的一个叫“动态文件名”新技术,在这个版本的qq安装时会生成4个常驻内存的病毒文件,同时会在注册表的系统启动处添加自动启动项目,该病毒采用了多种方法,包括自我隐藏、自我保护,用户根本无法手工删除(大家尝试过3721这个无赖病毒插件吗?我整整花了半个小时才清理掉,但是这个病毒更恶毒,一般用户根本没办法清理),而且还会自动升级(没有任何提示),最可怕的是在qq卸载后依然会存在于用户的机器中,无法彻底清除。我对这个所谓新技术的定义就是垃圾+病毒,在我看来,它除了破坏数据之外所有病毒的特性都有了。(关于这类型病毒的清除方法一般也就是安全模式启动,然后找删除注册表启动项目,关闭注册的服务,然后删除文件)

             实在不理解为什么腾讯要用这样的招数,其实qq在用户中还是很受欢迎的,这么多年的经营腾讯已经是创下了一个很不错的局面了,但是近来腾讯的动作却令人费解,一是给自己的软件加上了很多没有人会用的功能,二是qq等级在线计时制度浪费了国家电力(很多无聊人开着机子就是为了挂这个等级),三就是这个所谓的“动态文件名”新技术,当然还有很多其他的小动作,譬如实名制等。都让人觉得比较郁闷,这qq怎么了,还能用来聊天吗?想必腾讯自己也感觉到了自己的市场份额在减少、在线人数下降的趋势吧,除去msn、uc等的强攻,更多的问题在腾讯自身。当然也可以看到qq做得很不错了,也很关注用户,很多细微的环节也都考虑到了。但如果在这里摔跤就真的不值得了。

             好了,俺吃饭去了,吃完饭安装一下这个新版qq,明天把新版qq的这个病毒清除方法贴上来。

    陈朋奕 2005-10-01 11:36
    ]]>
    求职面试资料大全!http://www.blogjava.net/chenpengyi/archive/2005/09/30/14465.html陈朋奕陈朋奕thu, 29 sep 2005 16:13:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/09/30/14465.htmlhttp://www.blogjava.net/chenpengyi/comments/14465.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/09/30/14465.html#feedback0http://www.blogjava.net/chenpengyi/comments/commentrss/14465.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/14465.html         今年毕业生开始找工作的时间也到了,想想当年自己懵懵懂懂的去找工作,确实比较盲目,而且感到很多东西没有方向,求职的时候也不知道该怎么准备。现在自己也走过了这一步,而且手头有部分对毕业生很有用的资料,不敢一个人独享(其实也是没有用了,呵呵),所以拿出来大家分享一下。

             求职简历模板30个,其中有中文的简历,简历封面,英文简历,院校说明等,比较齐了,需要的把这些模板改改,封面上的资料图片换成自己的学校就可以了。
               地址是: http://www.blogjava.net/files/chenpengyi/hr.rar


             面试题我博客上有不少,是微软的(其实只有部分是微软的),相信已经很全了,我还有,但没整理好,整理好了就添加到后面。
              地址是:http://www.blogjava.net/chenpengyi/archive/2005/09/19/13452.html


    陈朋奕 2005-09-30 00:13
    ]]>
    星际争霸地图(rpg,hunters)下载(陆续更新!)http://www.blogjava.net/chenpengyi/archive/2005/09/28/14336.html陈朋奕陈朋奕wed, 28 sep 2005 13:50:00 gmthttp://www.blogjava.net/chenpengyi/archive/2005/09/28/14336.htmlhttp://www.blogjava.net/chenpengyi/comments/14336.htmlhttp://www.blogjava.net/chenpengyi/archive/2005/09/28/14336.html#feedback35http://www.blogjava.net/chenpengyi/comments/commentrss/14336.htmlhttp://www.blogjava.net/chenpengyi/services/trackbacks/14336.html以下地图下载地址都经过本人亲自测试,保证能用(补丁地址就不保证了):








    测试星际最高水平的一个游戏rpg地图,我见过的最有意思的地图,玩完这个地图估计你的星际水平会上n个层次,但臭鸡蛋也会狂扔向你。


    下面才是地图:




    four countries war 地址:
    寻秦记[第一集] 地址:
    ckcg 2005 星际争霸地图 地址:
    《星际争霸》rpg地图打包下载(115张)  http://download.zol.com.cn/down.php?softid=37862&subcatid=66&site=3


    附录:
    星际争霸1.08秘籍,作弊码,单机使用。
    power overwhelming 无敌
    operation cwal 加速生产
    show me the money 增加10,000气体和矿物
    the gathering 魔法无限
    game over man 游戏立即失败
    noglues 敌人无法施放魔法
    staying alive 任务无法完成
    there is no cow level 立即完成目前任务
    whats mine is mine 水晶矿无限
    breathe deep 气体无限
    something for nothing 开放所有可生产的选项
    black sheep wall 地图全亮
    medieval man 单位数量无限生产
    modify the phase variance 研发所有科技
    war aint what it used to be 开关战争迷雾
    food for thought 人口无限
    redio free zerg 任务游戏时的隐藏的歌曲


    陈朋奕 2005-09-28 21:50 发表评论
    ]]>
    网站地图