mysql 存储过程例子-备忘-逻辑查询并分页显示

11月 18th, 2008

 delimiter //
CREATE  PROCEDURE ClassList(
 IN ID int,
    fldName varchar(100),
    pageSize int,
    pageIndex int,
    orderType int,
    strWhere varchar(2000),
 OUT cou int
)
begin
 declare beginRow int;
 declare sqlStr varchar(1000);
 declare limitTemp varchar(1000);
 declare orderTemp varchar(1000);
 declare v_classp int;
 declare oo int;
 declare done int default 0;
 declare sql1 varchar(500) default ” “;
 declare sql2 varchar(200);
 declare cur cursor for select shop_classid from shop_class where shop_parentclassid=id;
 DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000′ SET done = 1;

set sql2=’select*from shop_class left join shop_main on shop_classid=shop_type_id where’;
select shop_parentclassid into v_classp from shop_class where shop_classid=id;

if(v_classp=0) then
 open cur;
  repeat
   fetch cur into oo;
   IF NOT done THEN
    set sql1=concat(’ or shop_classid=’,oo,sql1);
   END IF;
  UNTIL done END REPEAT;
 close cur;
 set @sql=concat(sql2,substring(sql1,4,length(sql1)-3));
else
 set @sql=concat(’select * from shop_main where shop_type_id=’,id);
end if;

 set beginRow = (pageIndex-1)*pageSize;
 set limitTemp = CONCAT(’ limit ‘,beginRow,’,',pageSize);
 set orderTemp = CONCAT(’ order by ‘,fldName);
 if orderType = 0 then
  set orderTemp = CONCAT(orderTemp,’ ASC ‘);
 else
  set orderTemp = CONCAT(orderTemp,’ DESC ‘);
 end if;

 set @sqlString = CONCAT(@sql,’ ‘,strWhere,orderTemp,limitTemp);

 prepare sqlstmt from @sqlString;
 execute sqlstmt;

 deallocate prepare sqlstmt;
end

日光海岸 技术

论语心得-千刀万剐

11月 18th, 2008

  有座山上有佛像,很多人去烧香。好象很平淡,但问题出在有些石头上。原来做佛像和台阶的石头都出在一个山上,所以一些做了台阶的石头就有这样的想法。为什么一个山上的石头,我挨踩、你受拜。
于是做台阶的石头问佛像,佛像不回答。实在闹的太厉害了,就回答了这样一句话:
- 你们做出来的时候只挨了4刀,我是挨千刀万剐的 -

日光海岸 故事

“你要爱你的寂寞”

8月 26th, 2008

 

    什么是我们真正的自身利益?我们似乎已丧失了领会这个问题的能力 

    二十世纪初,一位17岁的在校住读的青年给当时已如日中天的奥地利诗人里尔克写了一封信,述说自己虽然整天和许多同学在一起,但仍然时时感到寂寞。令他没有想到的是,里尔克很快就回了信,他在信中说:“亲爱的先生,你要爱你的寂寞。”这话听起来,就像是一种恳求,似乎寂寞是一件轻柔、贵重的东西,必须小心翼翼、充满珍视地加以保护。我们今天的人能理解这份珍视吗?  

    可能不会有人认为里尔克是在宣扬一种脱离人群的孤立主义,人是群体性的存在者,他需要与他人交流,在他人的目光中学会思考并成长。但不管我们怎样需要他人,我们都只能自己成长,自己体验成长的快乐和艰辛。我们内心世界的丰满充溢和抵抗苦难的力量都需要我们精神的真正自由,它要求我们与他人、它物拉开一定距离,需要独处,当寂寞袭上心头,我们的心灵才会开口说话。可是现代人畏惧独处,热衷喧闹,已不能体会孤独寂寞可能带给人的那份特殊礼物。

    西方自启蒙以来最时髦的口号是“张扬个性”,现在它已是全球人们都崇尚的理念。照说,真正践行“张扬个性”会让我们看到各种不同的人,但我们却发现,人们越是在努力显露出自己的个性,他们就越是显得与他人有着共性。一个最明显的例子就是今天人们的趣味与判断如此的整齐划一。只要看看今天的青年、看看今天的官员、学者在追求什么,就能明白,这种一致性达到了怎样的程度。这里的问题不在于人们都关心自己的“自身利益”,都追求“自我价值”的实现,它们是“张扬个性”的题中之议,无可厚非。但是当人们一致地仅仅把自己的“自身利益”与金钱、权力、荣誉挂钩,以为那些东西是人生的第一要义,就不免陷入一个怪圈:表面上看,他们过分地关心他们的自身利益,但实际上“他们并没有充分地关心他们真正的自身利益”,“对他们来说,每一件事都是重要的,就是他的生命和生活的艺术不重要。他可以为一切,就是不为自己”。这就是弗洛姆所说的“人对自己的不关心”。什么是我们真正的自身利益?我们似乎已丧失了领会这个问题的能力,因为这是一个心灵问题,它只有在你独处之中才会向你敞开。

    其实,孤独与自由是一个问题的两个方面,害怕孤独就会失去自由。法国诗人波德莱尔在《巴黎的忧郁》中说:“谁不会使孤独充满人群,谁就不会在繁忙的人群中独立存在”。更为重要的是“寂寞”对人并不总是坏事,如果能深入其中,更多一些耐心,更多一些倾听,你的生活可能就会起某种变化,你会突然发现“寂寞”和你精神上的契合,或许只有在“寂寞”中人才不会丢失自己,才能获得成熟所必须的时间和养份。里尔克曾谈到,儿童看见成人们来来往往,匆匆忙忙,好像总在做一些了不得的大事情,可是他们到底做的是什么,儿童并不懂。“如果一天我们洞察到他们的事务是贫乏的,他们的职业是枯僵的,跟生命没有关联,那么我们为什么不从自己世界的深处,从自己寂寞的广处,和儿童一样把它们当作一种生疏的事去观看呢”?对外界俗事的摈弃,是为了内心的生长。我们必须有这样的时刻:让平素所信任的、所习惯的都暂时离开我们,别人的喧扰只远远地从旁边走过,这样新事物才能走进心房,保护它,它也就更多地成为我们自己生命的一部分。

    为了内心的生长,对外界俗事应当有一定程度的摈弃,这话说起来容易,做起来却是很难的。因为在现代社会中让我们顺从、低头的大多是匿名的、隐蔽的权威。它们往往伪装成一般常识、专家知识、心理健康、正常状态、公众舆论等,谁要是不服从,或表现出自己独特的个性,虽然没有杀身之祸,却面临着被排斥于大众社会之外的威胁。“落伍”、“怪诞”、“神经不正常”之类的指责就会包围着你,让你孤独,让你无依无靠,最后以温馨的微笑招唤你,拉你回到千人一面的大众世界。是啊,匿名权威的法则如同市场法则一样,是隐而不露的——也是难以攻破的,谁能去攻击看不见的东西?谁能去反抗看不见的人?

    正是在这种社会中,人为了让生活舒适和轻松正在放弃自己作为个体的独特存在,无原则地进入整体、进入人群,让自己淹没在事件的整体之中,消亡在普遍性之中。人们往往以喧闹的娱乐抑制某种内心的不安,害怕静谧会使其“遭遇”认识自我的危险。没有一个人敢于或者愿意像梵高、克尔凯郭尔,像梁漱溟、顾准那样实践“成功地做了他自己”。我国学者陈寅恪的诗句:“不采苹花即自由”所表达的人生境界在今天是多么难得。今天的学人见了面总喊“忙”,忙什么?忙的大都是外界的俗事,在我看来,喊忙的声音越响,自由的人越少,心灵的运思越贫乏。

    更令人不安的是,当生命的原则变成了一致性,良心就不能发展。良心天生就是不随大流的,当大家都说“是”的时候,他必须能说“不”!为了说出这个“不”字,它必须有一种正确的否定判断。一个人到了只是顺从的程度,他就不能倾听自己良心的呼声,更不要说按良心行事了。当人人都没了良心,人则不复为人了。

    “你要爱你的寂寞”,里尔克的恳求仿佛是天外之声,给人一种隔世之感。

 

yiluo 生活

Tomcat 的数据库连接池设置与应用

8月 22nd, 2008

1.将数据库驱动程序的JAR文件放在Tomcat的 common/lib 中;

2.在server.xml中设置数据源,以MySQL数据库为例,如下:
在<GlobalNamingResources> </GlobalNamingResources>节点中加入,
       <Resource
       name="jdbc/DBPool"
       type="javax.sql.DataSource"
       password="root"
       driverClassName="com.mysql.jdbc.Driver"
       maxIdle="2"
       maxWait="5000"
       username="root"
       url="jdbc:mysql://127.0.0.1:3306/test"
       maxActive="4"/>
    属性说明:name,数据源名称,通常取”jdbc/XXX”的格式;
             type,”javax.sql.DataSource”;
             password,数据库用户密码;
             driveClassName,数据库驱动;
             maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
                      接将被标记为不可用,然后被释放。设为0表示无限制。
             MaxActive,连接池的最大数据库连接数。设为0表示无限制。
             maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示
                      无限制。

3.在你的web应用程序的web.xml中设置数据源参考,如下:
   在<web-app></web-app>节点中加入,
   <resource-ref>
     <description>MySQL DB Connection Pool</description>
     <res-ref-name>jdbc/DBPool</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
     <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
   子节点说明: description,描述信息;
                res-ref-name,参考数据源名字,同上一步的属性name;
                res-type,资源类型,”javax.sql.DataSource”;
                res-auth,”Container”;
                res-sharing-scope,”Shareable”;

4.在web应用程序的context.xml中设置数据源链接,如下:
   在<Context></Context>节点中加入,
   <ResourceLink
    name="jdbc/DBPool"
    type="javax.sql.DataSource"
    global="jdbc/DBPool"/>
    属性说明:name,同第2步和第3步的属性name值,和子节点res-ref-name值;
              type,同样取”javax.sql.DataSource”;
              global,同name值。

至此,设置完成,下面是如何使用数据库连接池
1.建立一个连接池类,DBPool.java,用来创建连接池,代码如下:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBPool {
     private static DataSource pool;
     static {
          Context env = null;
           try {
               env = (Context) new InitialContext().lookup("java:comp/env");
               pool = (DataSource)env.lookup("jdbc/DBPool");
               if(pool==null)
                   System.err.println("’DBPool’ is an unknown DataSource");
                } catch(NamingException ne) {
                   ne.printStackTrace();
           }
       }
     public static DataSource getPool() {
         return pool;
     }
}

2.在要用到数据库操作的类或jsp页面中,用DBPool.getPool().getConnection(),获得一个Connection对象,就可以进行数据库操作,最后别忘了对Connection对象调用close()方法,注意:这里不会关闭这个Connection,而是将这个Connection放回数据库连接池

yiluo 技术

Apache通过Rewrite实现绑定多个域名以及二级域名的方法

7月 26th, 2008

首先,你要有一个泛解析的顶级域名 yourDomain.com
新网为例,在后台添加一条A记录*.yourDomain.com

打开http.conf
在文件尾部添加NameVirtualHost *
简单的添加:
<VirtualHost *>
DocumentRoot /usr/local/www
ServerName yourDomain.com
ServerAlias *.yourDomain.com
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteMap vhost txt:/usr/local/apache2/conf/vhost.map
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/$1
</VirtualHost>

注:其中/usr/local/apache2/conf/为你的apache的配置文件夹根据实际情况修改

进入配置文件目录新建vhost.map文件,添加内容如下:
www.yourDomain.com /usr/local/www
bbs.yourDomain.com /usr/local/www/bbs
blog.yourDomain.com /usr/local/www/blog

启动或重启一次apache

打开浏览器
输入www.yourDomain.com将访问到/usr/local/www下的内容
输入bbs.yourDomain.com将访问到/usr/local/www/bbs下的内容
依次类推。。。
理论上可以设无限个二级域名,而且不用重启服务器

yiluo 技术

梅雨、南京

7月 17th, 2008

站内拥杂的人群、燥热潮腻的空气,梅雨季节的南京。
氤氲弥漫的天空,山雨欲来的架势,玄武湖畔。
潮涌的丝凉,惬意的清风勾起某年某夜梦中的酣畅。
一支烟,不由自主的放松,意识随着潮风渐漾渐远。
辗转,当都已成为习惯,奔波这样的词眼已经幼稚苍白。

小孩坐在竹排的岸边,任光光的脚丫随着潮水挥荡。
一个乞丐开始辗转徘徊在享受惬意的人群中,
简短重复的短句,轻轻伸出的手,乐此不疲。
而我这样带着眼睛,背着的皮包的过客将是他的重点对象。
终于那双手轮到了我,我顺手从盒里掏出一支香烟递给他;
他显然意外的诧异了一下,但还是接到香烟道谢离去;
对他而言,在碰壁与得到之间,这或许是另一种选择。

这世界潮起云涌,欲望的浪潮太多,想要得到的太多,
然而有些东西,并不是你想要得到就能随手获取,
比如金钱,比如权利,比如爱情……

离开,在嵌套着一个个IF、THEN 与 END 的死循环中 继续……

yiluo 生活

MySQL存储过程实例

7月 10th, 2008

MySQL5.0以后支持了存储过程,MySQL的存储过程是让人爱又让人怜,最近研究mysql的存储过程,初学练手:项目中的几个例子:
5、生成打折卡:
create procedure intocard()
begin
declare v int default 0;
declare o varchar(10);
declare aa varchar(10);
while v<10000 do
set o=RIGHT(concat(’000000′,rtrim(v)),6);
set aa=concat(’561′,o);
insert into card (card) values (aa);
set v=v+1;
end while;
end

6、生成积分券:(规则卡号,随机密码)

create procedure intocard()
begin
declare v int default 10000;
declare o varchar(10);
declare aa varchar(10);
while v<10000 do
set @aa=”;
while length(@aa)<10 do
set @aa=concat(@aa,substring(’abcdefghijklmnopqrstuvwxyz’,round((rand()*100)%25+1),1));
end while;
set o=RIGHT(concat(’000000′,rtrim(v)),6);
set aa=concat(’561′,o);
insert into jfcard (jfcard,jfpass,jf) values(aa,@aa,10);
set v=v+1;
end while;
end

7、根据商家名称取商家领取的积分卡号段
CREATE PROCEDURE `c_shang`(IN shop varchar(30))
begin
select startid into @start from shop_card where shopname=shop;
select endid into @end from shop_card where shopname=shop;
select*from jfcard where id>=@start and id<=@end;
end

8、根据卡号、密码、爱e卡号、自动判断进行充值call c_ch(’561000000′,’idqvjhhoxx’,'561000000′)
delimiter //
create procedure c_ch(IN jfc_id varchar(10),IN jfc_ps varchar(11),IN aek_id varchar(10))
begin
select jfcard into @jfcard from jfcard2 where jfcard=jfc_id;
select jfpass into @jfpass from jfcard2 where jfpass=jfc_ps;
if jfcard<>null and jfpass<>null then
 select disable into @dis from jfcard2 where jfcard=jfc_id;
 if @dis=0 then
 select jf into @jf from jfcard2 where jfcard=jfc_id;
 update card set sumjf=sumjf+@jf where card=aek_id;
 end if;
end if;
end //
————————————
8、输入积分卡号、密码、打折卡,自动将积分充值打折卡

create procedure c_jf(IN jfc_id varchar(15),IN jfc_ps varchar(15),IN aek_id varchar(15))
begin
declare jf1 int;
declare dis int;
select jfcard into @jfcard from jfcard2 where jfcard=jfc_id;
select jfpass into @jfpass from jfcard2 where jfcard=jfc_id;
if strcmp(@jfcard,jfc_id)=0 and strcmp(@jfpass,jfc_ps)=0 then
  select disable into dis from jfcard2 where jfcard=jfc_id;
  if dis=0 then
   select jf into @jf from jfcard2 where jfcard=jfc_id;
   update card set sumjf=sumjf+@jf where card=aek_id;
   update jfcard2 set jf=0,disable=1 where jfcard=jfc_id;
   select ‘充值成功’ as errcode;
  else
  select ‘卡已失效’ as errcode;
  end if;  

else
select ‘卡号或密码错误’ as errcode;
end if;
end

9、关键字过滤:
delimiter //
CREATE PROCEDURE BADKEY (IN content varchar(1000),IN badkey varchar(1000))
begin
declare i int default 1;
declare bad varchar(1000) default ”;

while locate(’|',badkey,i)<>0 do
set @o=locate(’|',badkey,i);
set bad=substring(badkey,i,@o-i);
set content=replace(content,bad,’***’);
set i=@o+1;
end while;

select content;
end //

10、全局登陆模块 l_type=0 用户登陆 1 商家登陆
delimiter //
CREATE PROCEDURE login (IN l_name varchar(15),IN l_pass char(32),IN l_type int)
BEGIN
if l_type=0 then
 select @u_name:=user_name,@u_pass:=user_pass from users where user_name=l_name; 
 if @u_name<>null and strcmp(@u_pass,l_pass)=0 then
  select "用户登陆成功" as logincode;
 else
  select "用户登陆失败" as logincode;
 end if;
else
 select @s_name:=shop_name,@s_pass:=shop_pass from shops_main where shop_name=l_name; 
 if @s_name<>null and strcmp(@s_pass,l_pass)=0 then
  select "商家登陆成功" as logincode;
 else
  select "商家登陆失败" as logincode;
 end if;
end if;
END //

yiluo 技术

随意设定form控件

6月 28th, 2008

<script language="javascript">
//设定用户需要的元件个数
function setComponent()
{
        var str=”;
        var i=0;
        var component_compose_ID=”;//组成元件的ID字符串
 if(!window.input.componentNum.value)
        {
            window.input.componentNum.value=1;
            window.input.componentNum_hidden.value=1;
            window.input.component_compose_ID.value=1;           
            str=’<div id=component1_div>’;
            str+=’<select name=component1>’;
            str+=document.input.hiddenValue.value;
            str+=’</select>’;
            str+=’数量:<input type=text name=component1Num size=10>’;
            str+=’&nbsp;&nbsp;<input type=button onclick=delComponent(1) value=删除元件>’;
            str+=’</div>’;
        }
        else
        {
            window.input.componentNum_hidden.value=window.input.componentNum.value;
            for(i=1;i<=window.input.componentNum.value;i++)
            {
                str+=’<div id=component’ + i + ‘_div>’;
                str+=’<select name=component’ + i + ‘>’;
                str+=document.input.hiddenValue.value;
                str+=’</select>’;
                str+=’数量:<input type=text name=component’+i+’Num size=10>’;
                str+=’&nbsp;&nbsp;<input type=button onclick=delComponent(’+i+’) value=删除元件>’;
                str+=’<br><br>’;
                str+=’</div>’;
                component_compose_ID+=i;
            }
            window.input.component_compose_ID.value=component_compose_ID;
        }
 window.chooseComponent.innerHTML=str;
}
//增加一个元件项
function addComponent()
{
    var i,j;//表示实际元件数量,j不一定是实际元件数量,表示元件的最大序号
    //因为在删除的过程中,元件的实际数量会减少,但是元件的最大序号不会变
    var hiddenStr;
    var number_str_of_add;
    if(!window.input.componentNum.value)
        i=1;
    else
        i=eval(window.input.componentNum.value);
    i++;
   
    if(!window.input.componentNum_hidden.value)
    {
        j=1;
    }       
    else
    {
        j=eval(window.input.componentNum_hidden.value);
    }       
    j++;
    number_str_of_add=window.input.component_compose_ID.value;
    number_str_of_add+=j;
    var str=window.chooseComponent.innerHTML;
    str+=’<div id=component’ + j + ‘_div>’;
    str+=’<select name=component’ + j + ‘>’;
    str+=document.input.hiddenValue.value;
    str+=’</select>’;
    str+=’数量:<input type=text name=component’+j+’Num size=10>’;
    str+=’&nbsp;&nbsp;<input type=button onclick=delComponent(’+j+’) value=删除元件>’;
    str+=’<br><br>’;
    str+=’</div>’;
    window.input.componentNum.value=i;
    window.input.componentNum_hidden.value=j;
    window.input.component_compose_ID.value=number_str_of_add;
    window.chooseComponent.innerHTML=str;
}
//删除一个由ID指定的元件,再生新生成需要的字符串
function delComponent(id)
{
    document.getElementById(’component’+id+’_div’).innerHTML=”;
    document.getElementById(’component’+id+’_div’).style.display=’none’;
    if(!window.input.componentNum.value)
        actualNum=1;
    else
        actualNum=eval(window.input.componentNum.value);
    actualNum–;
    window.input.componentNum.value=actualNum;
}
</script>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
    <title>动态增加选择项</title>
  </head>
  <body>
  <center>
  <form name="input">   
 <textarea cols="0" rows="0" style="display:none" name=hiddenValue>
      <option value=1>干掉小日本</option>
  <option value=2>K掉小日本</option>
  <option value=3>去死小日本</option>
  <option value=4>王八小日本</option>
 </textarea>
      <table cellspacing="2" cellpadding="3" border="1">
        <tr>
          <th width="27%">
            元件个数:
          </th>
          <th width="73%" align="left">&nbsp;<input type=text name="componentNum" size="25">
                <input type=hidden name="componentNum_hidden" size="25">
                <input type=hidden name="component_compose_ID" size="25">
                <input type=button onclick="setComponent()" value="。设定元件 。">
                <input type=button onclick="addComponent()" value="。增加元件 。">
          </th>
        </tr>
         <tr>
          <th width="27%">
            选择元件:
          </th>
          <th width="73%" id="chooseComponent" align="left">
    <select name=component1>
             <option value=1>干掉小日本</option>
  <option value=2>K掉小日本</option>
  <option value=3>去死小日本</option>
  <option value=4>王八小日本</option>
          </select>数量:<input type=text name=component1Num size=10>
          <input type=button onclick=delComponent(1) value=删除元件>
          </th>
        </tr>
      </table>
    </form>
    </center>
    </body>
</html>

yiluo 技术

mysql优化配置

6月 28th, 2008

[mysqld]
#禁止DNS轮寻
skip-name-resolve
#禁止权限过滤
skip-grant-tables

innodb_data_home_dir = /
innodb_data_file_path = ibdata/ibdata1:2000M;dr2/ibdata/ibdata2:2000M
set-variable = innodb_buffer_pool_size=350M
set-variable = innodb_additional_mem_pool_size=20M
innodb_log_group_home_dir = /dr3/iblogs
innodb_log_arch_dir = /dr3/iblogs
innodb_log_archive=0
set-variable = innodb_log_files_in_group=3
set-variable = innodb_log_file_size=50M
set-variable = innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1
set-variable = innodb_file_io_threads=4
set-variable = innodb_lock_wait_timeout=50
#innodb_flush_method=fdatasync
#innodb_fast_shutdown=1
#set-variable = innodb_thread_concurrency=5

yiluo 技术

FreeBSD,Linux,SOLARIS

6月 5th, 2008

所谓知已知彼,百战百胜。。。  
没有最好的操作系统,只有最适合的操作系统~~  
我也算得上是个 FREEBSD 的爱好者,虽然第一次使用 UNIX(类 UNIX)系统时是使用 SlackWare,即其中一个 LINUX 发行版。但自从使用了 FREEBSD 后,基本没用过 LINUX 了。  
但在往后的发展,我可能迫于无奈而选择 LINUX 而不是 FREEBSD 或 SOLARIS。  
原因如下:  
对于个人的发展,我已经定型为使用以下语言和服务器程序:  
JAVA,PostgreSQL,MySQL,LDAP,POSTFIX  
JAVA 和 MySQL,LDAP 都是对线程需求特别高的应用,特别是 JAVA,现在还不是很好的支持,没办法,我的东东都是以 JAVA 为主,而且是以 Servlet 为主,特讨厌 jsp, php, asp 这些在 HTML 网页中插入程序代码的编程方式。  
JAVA 和 LDAP 是我最为看好的语言和应用。但在 FREEBSD 都运行得不好。  
本来,我自己也有使用 SOLARIS,而且,JAVA 的应用,我一直都是在 SOLARIS 下运行的。但 SOLARIS 一来对硬件的要求高,新的硬件不是样样都支持,例如新的 865 芯片组,我就不能确定是否能支持。还有就是文件系统特别慢,就连 SSH 也特别慢,不知为什么,同一网段同一配置的机器,SSH 上 FREEBSD 和 LINUX 就是比 SOLARIS 的快(指运行命令后返回结果的速度)。  
但 SOLARIS 也有 LOGGING 机制,这对于远程机器来说很重要,我试过在 FREEBSD 下,文件系统损坏后,不得不走到机房修复,否则重启后依然进不了系统,而停在了要求修复文件系统的对话介面中。LINUX 也开始有了 LOGGING 功能的文件系统,可谓走在了 FREEBSD 的前面了。  
各个系统各有优缺点,小生不才,说说自己的观点,还请指教:  
网络:  
不想说这个了,你只要记住,现在到处都是网络。  
FreeBSD 网络性能最好,特别是连接多,数据量少的应用。但在数据量大的环境下,稳定性不够 Solaris 好。特别注意的是使用 RealTek 或 D-Link 等网卡时,性能和稳定性都很差。  
Solaris 网络性能比 FreeBSD 差一些,而且对网卡的要求高,但稳定性比   
FREEBSD 好。如果使用好的网卡,如 3com, Intel,SOLARIS 可以使用所有网卡可提供的网络流量。  
Linux 相对最差,特别体现于不稳定。  
文件系统:  
在现今的信息时代,1M 的数据,有可能比 1 (M)illion 台机器更值钱。  
Solaris 的文件系统最好。虽然是速度最慢,但是稳健性是最好的。  
FreeBSD 的文件系统只算中等,速度和稳定性都是处于中等水平。最不差的方面体现于当文件系统损坏的时候。  
Linux 的文件根本使用的不同文件系统格式而不同。现阶段,可选的文件太多了。值得选择的文件系统有 ReiserFS 和 XFS。XFS 适合大多数的情况,ReiserFS 更适合于文件多而小的使用环境。   
应用软件支持:  
软件是计算机的灵魂,至少,你使用计算机的时候是与软件进行交谈的。  
Linux 是应用软件支持得最多的一个系统,但维护成本太高,因为版本太多,无论从目录结构或是使用方法,都没有一个统一的标准。很多情况下是你使用了这个发行版的软件习惯,但在第二个发行版下,你得改变你的使用习惯,而且版本也有可能各自不兼容。  
Solaris 支持的商用应用软件是三个最好的一个。基本上,Solaris 更适合作为后台的服务器,他需要比其他两个系统综合起来比较慢,但他的稳定性也是最好的一个。可以通过提高硬件的方式来提高性能。需要成本高,但对于商业环境里面,总比 DOWN 机要来得好。  
FreeBSD 支持的软件以 Open Source 为主,虽然没有 LINUX 可使用的软件多,但是 FREEBSD 的软件结构非常好,你基本上可以使用 PORTS 来安装所有你想使用的软件。而且目录结构对于各个发版来说,不会有太多的变化。或基本不会有变化,这样,从管理上来说,投入的人力物力更少。而且无论你使用 2.x, 3.x, 4,x 或是更新的 5.x 系列的发行版,你基本上不需要再学习更多的维护技巧,以后投资在学习技巧的时间是不会白费的。可是,对商业软件的支持,FREEBSD 是最差的一个操作系统。  
线程的支持:  
线程性能是分时系统应用的一个很重要的标志,不能以最少的资源为最多的客户服务,那 UNIX 没有存在的必要。  
Solaris 对于线程的支持是最好的!这是绝对的事实。在 Solaris 下使用 Intel CPU 的超线程技术,性能会有接近 20% 的提升。简直不可思议。  
Linux 次之,但是线程实际的方法也太多。常用的有 PThread。  
FreeBSD 最差。使用 Intel CPU 的超线程技术后,性能反而会降低 5% 左右。更加不可思议!!!虽然 5.x 会有一个极大的提高,但我估计,至少半年到一年内,技术不会成熟到可以与 Solaris 相比,特别是商用方面。  
易用性:  
易用性不单止体现于单机的操作,还是多机环境下的维护。  
FreeBSD 的易用性是最好的。你学习一次的知识,可以在各个版本中使用,而不需要重新学习。而且,目录结构和系统的一些配置和设定都很方便。如 /etc/rc.conf 这个单一文件可以设置绝大部份的系统设置,并且有大量的例子。  
Solaris 的易用性要比 Linux 更好。很多人都可能会认为,Solaris 很难用,但其实不是的。至少对我个人来说,Solaris 比起 Linux 更易于使用。至少,从 Solaris 8 向 Solaris 9 过渡,你不需要花太多的精神。而且一些软件和驱动还可能会通用。  
Linux 的易用性为什么是最差呢?各个 Linux 发生版之间的差异,有甚于   
FreeBSD 和 Solaris 之间的不同。习惯使用某一个发版本的管理员对于另一个发行版在有些情况下会无从下手。就如我自己,在 redhat 下用 setup,然后一个菜单一菜单来选择设置网络,但到了 debian 下,就不会设置网络了!最后不得已写个 shell 放在 /etc/rc2.d/network_if.sh 来设置网络参数。感觉很痛苦,而且很没面子,竟然连最基本的网络参数都不知在哪里设置。  
综合稳定性:  
其实,决定一下操作系统的稳定性的,最大的取决于 VM 系统的稳健。  
Solaris 是最好的。虽然是最慢的一个,但稳定性最好,更适合于后台的环境,如数据库或邮件服务器。  
FreeBSD 次之。体现于网络与软件的稳定性。在上面运行的程序 core dump 的机会或不能运行的机会相对较少。而且 DOWN 机的机器会也比较少。再次重申,特别要注意的是,在使用 RealTek 或 D-Link 的网卡和在繁忙的磁盘读写情况下,FreeBSD 的性能和稳定性都会大打节扣。  
Linux 的综合稳定性最差,主要体现于网络的性能和应用软件的不一致,太乱,导致不能更好地投入到系统的管理中。  
以上所说的,只是现阶段的情况,现在使用 Linux 于商业(生产)环境还是有一定的风险。但以前瞻眼光看待,Linux 会在未来的 1 到 2 年内,在商用方面完全超越 FreeBSD。要声明,特指在商用方面,而且包括用户端和服务器端。现阶段,FreeBSD 在服务器端的优势还是 Linux 不可相比的。虽然 Linux 向成为 desktop 的后选者(相对 Microsoft 的 Windows 来说)的迈进,使 Linux 变成更乱,但这是必要的发展过程。特别是像 OpenOffice 这些办公软件的走向成熟时,将 Linux 作为 Desktop 来使用的理由将会更加充分。
 

yiluo 技术