<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>综合技术论坛最新讨论 - JavaEye</title>
    <description>数据库、算法、C/C++、Erlang/FP、PHP/Linux<br/>
圈子: 
<a href="http://cpp-circle.group.javaeye.com/" target="_blank">C++语言</a>
<a href="http://onlypython.group.javaeye.com/" target="_blank">Python</a>
<a href="http://dlang.group.javaeye.com/" target="_blank">D语言</a>
<a href="http://wfp.group.javaeye.com/" target="_blank">函数式编程</a>
<a href="http://phpers.group.javaeye.com/" target="_blank">PHP</a>
<a href="http://database.group.javaeye.com/" target="_blank">数据库</a> - Java编程，Ruby编程，微软.net，AJAX，敏捷软件开发，综合软件技术</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>MySQL字符集：怎样才能保证不发生乱码</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://boris-song.javaeye.com">boris-song</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234667" style="color:red;">http://www.javaeye.com/topic/234667</a>&nbsp;
          发表时间: 2008年08月30日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="sql">MySQL字符集：怎样才能保证不发生乱码</pre>
<pre name="code" class="sql">数据库中关于字符集的种类有很多，对编程有影响的主要是客户端字符集和数据库字符集（还有一个服务器字符集，不知道干什么用的）。 


数据库中常用的操作就是保存数据和读取数据，在这过程中，乱不乱码和数据库字符集貌似没有什么关系。我们只要保证写入时选择的字符集和读取时选择的字符集一致，即只需保证两次操作的客户端字符集一致即可。 


客户端字符集的设置，依据客户端不同方法不同： 


1. 使用控制台连接，在my.ini文件中的client项里面设置； 


2. 使用ems连接，优先使用ems连接配置的字符集，默认使用my.ini文件中的设置； 


3. jdbc连接，在连接串中指定： 


jdbc:mysql://192.168.3.99:3306/test?useUnicode=true&amp; ;characterEncoding=gbk 


在写入时Mysq会将客户端指定的字符集转换成数据库字符集存入数据文件，读取时又将数据库字符集转换成客户端指定的字符集展示给客户端，把客户端字符集和数据库字符设置一致，显而易见的好处是免掉转换的性能损耗；另外，如果考虑到以后数据库的迁移，将数据库字符集设置为大多数数据库都支持的字符集会省掉很大麻烦。 


几个字符集相关的命令： 


1. 查看 MySQL 数据库服务器字符集，数据库字符集和客户端字符集 

show variables like '%char%'; 

character_set_client，客户端字符集 

character_set_database，数据库字符集 

character_set_server，服务器字符集 

2. 查看 MySQL 数据表（table） 的字符集 

show table status from tablename like '%countries%'; 

3. 查看 MySQL 数据列（column）的字符集。 

show full columns from tablename; 

4. 查看当前安装的 MySQL 所支持的字符集。 

show char set;

资料引用:http://www.knowsky.com/440280.html</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/234667" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 30 Aug 2008 00:38:20 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234667</link>
        <guid>http://www.javaeye.com/topic/234667</guid>
      </item>
      <item>
        <title>如何成为符合企业需求的Linux人才？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rails2.javaeye.com">qichunren</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233907" style="color:red;">http://www.javaeye.com/topic/233907</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我使用Linux（Ubuntu）的时间不长，却一直在坚持使用，下定决心学习Linux的技术。虽然有时候用在某些方面的开发还是windows上面方便一些，我还是坚持使用Linux来解决问题，因为我想彻底放弃Windows而把Linux学好。<br /><br />现在摆在我面前的一个问题是<span style="color: red"><strong>如何成为符合企业需求的Linux人才</strong></span>？<br /><br />是精通Linux下的那一大堆的命令(or Shell脚本编程)吗？<br />还是能够修改Linux内核的一些东西？<br />还是能够熟练地用Linux部署企业的应用？<br />还是能够高效地在Linux开台下进行软件开发（Java,Php,ROR）?<br />...........<br />...........<br />我不知道，或者是说应该走一条什么样的路线才能达到题目所说的级别？<br /><br /><br />目前会Linux的人不少，但是精通的不多（这句话是从哪里看到的，忘记了，我也感觉是这样），而我想要达到的是做一个符合企业需求的Linux人才！<br />诚心请教,希望大家解开我心中的迷惘。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/233907" style="color:red;">已有 <strong>9</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 13:23:05 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233907</link>
        <guid>http://www.javaeye.com/topic/233907</guid>
      </item>
      <item>
        <title>在Oracle中实现定时操作</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234224" style="color:red;">http://www.javaeye.com/topic/234224</a>&nbsp;
          发表时间: 2008年08月29日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          常要oracle数据库定时的自动执行一些脚本，或做数据库备份，或做数据的提炼，或做数据库的性能优化，包括重建索引等等的工作,这时需要用到一个函数dbms_job.submit，来完成Oracle定时器Job时间的处理上。使用dbms_job.submit这个函数，我们只需要考虑两个事情：安排某一任务，和定制一个执行任务的时间点。但最重要也是最棘手的事情，我认为还是确定一个执行任务的时间点。时间点确定了，其他的事情就好办了。下面是函数dbms_job.submit使用方法：<br /><pre name="code" class="java">
dbms_job.submit( job out binary_integer,
what　　　　　　　in　　　archar2,
next_date　　　 　in　　　date，
interval　　　　　in　　　varchar2,
no_parse　　　　　in　　　boolean)
</pre><br />其中：<br />●job：输出变量，是此任务在任务队列中的编号；<br />●what：执行的任务的名称及其输入参数；<br />●next_date：任务执行的时间；<br />●interval：任务执行的时间间隔。<br />其中Interval这个值是决定Job何时，被重新执行的关键；当interval设置为null时，该job执行结束后，就被从队列中删除。假如我们需要该job周期性地执行，则要用‘sysdate＋m’表示。如何更好地确定执行时间的间隔需要我们掌握一个函数TRUNC。<br /><br />1.TRUNC(for dates)<br />TRUNC函数为指定元素而截去的日期值。<br />其具体的语法格式如下：<br />TRUNC（date[,fmt]）<br />其中：<br />date 一个日期值<br />fmt 日期格式，该日期将由指定的元素格式所截去。忽略它则由最近的日期截去<br />下面是该函数的使用情况：<br />1)按年截尾<br />select  TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'yyyy')  from dual<br />-----------------------------------------------------------<br />2008-1-1<br />2)按月截尾<br />select  TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'mm')  from dual<br />--------------------------------------------------------<br />2008-3-1<br />3)按日截尾<br />select  TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'dd')  from dual<br />----------------------------------------------------------------------<br />2008-3-1<br />4)按时截尾<br />select  TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'hh')  from dual<br />----------------------------------------------------------------------<br />2008-3-1 8:00:00<br />5)按分截尾<br />select  TRUNC(TO_DATE('2008-03-01 08:23','yyyy-mm-dd hh:mi'),'mi')  from dual<br />----------------------------------------------------------------------<br />2008-3-1 8:23:00<br /><br /> <br /><br />2.确定执行时间间隔<br />1)、 每分钟执行<br />Interval => TRUNC(sysdate,'mi') + 1 / (24*60)<br />2)、 每天定时执行<br />例如：每天的凌晨2点执行<br />Interval => TRUNC(sysdate) + 1 +2 / (24)<br />3)、 每周定时执行<br />例如：每周一凌晨2点执行<br />Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天<br />4)、 每月定时执行<br />例如：每月1日凌晨2点执行<br />Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24<br />5)、 每季度定时执行<br />例如每季度的第一天凌晨2点执行<br />Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24<br />6)、 每半年定时执行<br />例如：每年7月1日和1月1日凌晨2点<br />Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24<br />7)、 每年定时执行<br />例如：每年1月1日凌晨2点执行<br />Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24<br /><br /> <br /><br />3.实例<br />这里提供了一个简单的例子，主要是完成在每一个时间间隔内向一个表中插入一条记录<br />  1)创建测试表  <br /><pre name="code" class="java"> 
 SQL>   create   table   test(id number,cur_time   date);  
  表已创建。
----建sequence
CREATE  SEQUENCE test_sequence
INCREMENT  BY   1 　  --  每次加几个 
 START  WITH   1 　　  --  从1开始计数 
 NOMAXVALUE　　　  --  不设置最大值 
 NOCYCLE　　　　　 --  一直累加，不循环 
 CACHE  10 ;
</pre><br /><br />--建触发器代码为：<br /><pre name="code" class="java">
create or replace trigger tri_test_id
  before insert on test   --test 是表名
  for each row
declare
  nextid number;
begin
  IF :new.id IS NULLor :new.id=0 THEN --id是列名
    select test_sequence.nextval --SEQ_ID正是刚才创建的
    into nextid
    from sys.dual;
    :new.id:=nextid;
  end if;
end tri_test_id; 
 </pre><br />   <br />  2)创建一个自定义过程  <br /><pre name="code" class="java"> 
 SQL>   create   or   replace   procedure   proc_test   as  
      2     begin  
      3     insert   into   test(cur_time)   values(sysdate);  
      4     end;  
      5     /
  </pre><br />   <br />  过程已创建。  <br />   <br />  3)创建JOB  <br /><pre name="code" class="java">
  SQL> declare job1 number;
       begin
          dbms_job.submit(job1,'proc_test;',sysdate,'sysdate+1/1440');--每天1440分钟，即一分钟运行test过程一次
      end;
</pre><br />   <br />  PL/SQL   JOB已成功完成。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/234224" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 00:37:02 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234224</link>
        <guid>http://www.javaeye.com/topic/234224</guid>
      </item>
      <item>
        <title>Oracle数据库中的临时表用法</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zzzzzzzzzzzz.javaeye.com">right now</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234139" style="color:red;">http://www.javaeye.com/topic/234139</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          希望对大家的学习和工作有所帮助。 <br /><br />一：语法 <br /><br />在Oracle中，可以创建以下两种临时表： <br /><br />(1) 会话特有的临时表 <br /><br />CREATE GLOBAL TEMPORARY ( ) <br /><br />ON COMMIT PRESERVE ROWS；<br /><br />(2) 事务特有的临时表 <br /><br />CREATE GLOBAL TEMPORARY ( ) <br /><br />ON COMMIT DELETE ROWS； <br /><br />CREATE GLOBAL TEMPORARY TABLE MyTempTable<br /><br />所建的临时表虽然是存在的，但是如果insert 一条记录然后用别的连接登上去select，记录是空的。　　 <br /><br />--ON COMMIT DELETE ROWS 说明临时表是事务指定，每次提交后ORACLE将截断表（删除全部行） <br /><br />--ON COMMIT PRESERVE ROWS 说明临时表是会话指定，当中断会话时ORACLE将截断表。　　 <br /><br /><br />二：动态创建 <br /><br />create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as <br /><br />v_num number; <br /><br />begin <br /><br />select count(*) into v_num from <br />user_tables where table_name=''T_TEMP'';　　 <br /><br />--create temporary table <br /><br />if v_num&lt;1 then <br /><br />execute immediate ''CREATE GLOBAL TEMPORARY TABLE T_TEMP ( <br /><br />COL1 VARCHAR2(10), <br /><br />COL2 VARCHAR2(10) <br /><br />) ON COMMIT delete ROWS''; <br /><br />end if;　　 <br /><br />--insert data <br /><br />execute immediate ''insert into t_temp values<br />(''''''　　v_col1　　'''''',''''''　　v_col2　　'''''')'';　　 <br /><br />execute immediate ''select col1 from t_temp'' into v_num; <br /><br />dbms_output.put_line(v_num); <br /><br />execute immediate ''delete from t_temp''; <br /><br />commit; <br /><br />execute immediate ''drop table t_temp''; <br /><br />end pro_temp;　<br /><br />测试:　　 <br /><br />15:23:54 SQL> set serveroutput on <br /><br />15:24:01 SQL> exec pro_temp(''11'',''22''); <br /><br />11　　 <br /><br />PL/SQL 过程已成功完成。　　 <br /><br />已用时间: 00: 00: 00.79 <br /><br />15:24:08 SQL> desc t_temp; <br /><br />ERROR： <br /><br />ORA-04043: 对象 t_temp 不存在　<br /><br /><br />三:特性和性能(与普通表和视图的比较) <br /><br />临时表只在当前连接内有效 <br /><br />临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用 <br /><br />数据处理比较复杂的时候时表快,反之视图快点 <br /><br />在仅仅查询数据的时候建议用游标: open cursor for ''sql clause'';
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/234139" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 20:16:31 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234139</link>
        <guid>http://www.javaeye.com/topic/234139</guid>
      </item>
      <item>
        <title>把Oracle查询转换为SQL Server </title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zzzzzzzzzzzz.javaeye.com">right now</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234136" style="color:red;">http://www.javaeye.com/topic/234136</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在把Oracle查询转换为SQL Server的时候要特别当心一些不容易注意到的问题。我们知道，T-SQL是SQL Server的语言引擎，而Oracle的语言引擎却是PLSQL.这两种查询语言都对 <br />　　ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明，同时还要介绍下如何 <br />　　对这些扩展进行转化以用在SQL Server环境下。 <br /><br />　　列的选择 <br /><br />　　用PLSQL执行数据查询的时候，FROM子句是必须的，这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表DUAL.DUAL表由 <br />　　Oracle连同数据字典一同创建，所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY，该列定义为VARCHAR2（1）类型，有一行值X. <br />　　从DUAL表选择数据常被用来通过SELECT语句计算常数表达式，由于DUAL只有一行数据，所以常数只返回一次。 <br /><br />　　Oracle下的DUAL查询如下所示： <br />　　SELECT &lsquo;x&rsquo; FROM dual <br />　　而对等的SQL Server查询则是下面这个样子： <br />　　SELECT &lsquo;x&rsquo; <br />　　连接 <br />　　Oracle用|| 符号作为连接符，而SQL Server的连接符是加号：+ . <br />　　Oracle查询如下所示： <br />　　Select &lsquo;Name&rsquo; || &lsquo;Last Name&rsquo; <br />　　From tableName <br />　　对应的SQL Server查询如下所示： <br />　　Select &lsquo;Name&rsquo; + &lsquo;Last Name&rsquo; <br />　　数字取舍 <br />　　Oracle数据库内有一个TRUNC函数，该函数返回m位十进制数的n位；如果省略m则n就是0位。m的值可以为负，表示截去小数点左边m位数字。 <br />　　在SQL Server下可以用Round或者Floor. <br /><br />　　以下是Oracle查询： <br />　　SELECT TRUNC（15.79，1） "Truncate" FROM DUAL； <br /><br />　　下面是同类查询的SQL Server版本： <br /><br />　　SELECT ROUND（15.79， 0） rounded ， <br />　　ROUND（15.79， 0，1） truncated <br />　　SELECT FLOOR（ROUND（15.79， 0））， <br />　　FLOOR（ROUND（15.79， 0，1） ） <br />　　在把Oracle查询转换为SQL Server的时候要特别当心一些不容易注意到的问题。我们知道，T-SQL是SQL Server的语言引擎，而Oracle的语言引擎却是PLSQL.这两种查询语言都对 <br />　　ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明，同时还要介绍下如何 <br />　　对这些扩展进行转化以用在SQL Server环境下。 <br /><br />　　列的选择 <br /><br />　　用PLSQL执行数据查询的时候，FROM子句是必须的，这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表DUAL.DUAL表由 <br />　　Oracle连同数据字典一同创建，所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY，该列定义为VARCHAR2（1）类型，有一行值X. <br />　　从DUAL表选择数据常被用来通过SELECT语句计算常数表达式，由于DUAL只有一行数据，所以常数只返回一次。 <br /><br />　　Oracle下的DUAL查询如下所示： <br />　　SELECT &lsquo;x&rsquo; FROM dual <br />　　而对等的SQL Server查询则是下面这个样子： <br />　　SELECT &lsquo;x&rsquo; <br />　　连接 <br />　　Oracle用|| 符号作为连接符，而SQL Server的连接符是加号：+ . <br /><br />　　Oracle查询如下所示： <br />　　Select &lsquo;Name&rsquo; || &lsquo;Last Name&rsquo; <br />　　From tableName <br />　　对应的SQL Server查询如下所示： <br />　　Select &lsquo;Name&rsquo; + &lsquo;Last Name&rsquo; <br />　　数字取舍 <br />　　Oracle数据库内有一个TRUNC函数，该函数返回m位十进制数的n位；如果省略m则n就是0位。m的值可以为负，表示截去小数点左边m位数字。 <br />　　在SQL Server下可以用Round或者Floor. <br /><br />　　以下是Oracle查询： <br />　　SELECT TRUNC（15.79，1） "Truncate" FROM DUAL； <br /><br />　　下面是同类查询的SQL Server版本： <br />　　SELECT ROUND（15.79， 0） rounded ， <br />　　ROUND（15.79， 0，1） truncated <br />　　SELECT FLOOR（ROUND（15.79， 0））， <br />　　FLOOR（ROUND（15.79， 0，1） ） <br /><br />　　数字转换 <br />　　Oracle的TO_CHAR函数可以把n位NUMBER数据类型转换为VARCHAR2 数据类型，同时采用可选的数字格式。 <br />　　SQL Server则通过STR函数返回数字转换之后的字符数据。不过，该函数不具方便的Format参数。 <br /><br />　　Oracle查询如下： <br />　　SELECT to_char（123.45 ，99999999999999） from tab <br />　　SELECT to_char（EXPIRY_DATE，'DDMONYYYY'） from tab <br /><br />　　以下是SQL Server版本的查询： <br />　　SELECT STR（123.45， 14） <br />　　SELECT STR（round（123.455 ， 2），12，2） <br />　　SELECT CAST（REPLACE（（CONVERT（varchar（12） ， <br />　　EXPIRYDATE， 106 ）），' ' ， ''） as varchar（9）） <br />　　LENGTH和LEN <br /><br />　　以下是Oracle的查询： <br />　　SELECT LENGTH（'SQLMAG'） <br />　　"Length in characters" FROM DUAL； <br />　　以上查询在SQL Server下是这样写的： <br />　　SELECT LEN（'SQLMAG'） "Length in characters" <br /><br />　　日期 <br /><br />　　Oracle取得日期和采用如下方式： <br />　　SYSDATE <br />　　SQL Server则是这样的： <br />　　GETDATE（） <br />　　你可以用各种语法操作日期。 <br />　　以下的代码对Oracle日期 <br /><br />　　值中的月份进行了格式调整（返回日期再加上n月）： <br />　　Select add_months（sysdate，12） from dual <br /><br />　　SQL Server则是如下完成同等功能的： <br />　　Select dateadd（mm，12，getdate（）） <br />　　数据的减法也不同。以下代码在Oracle中直接 <br />　　对数据进行减法操作： <br />　　SELECT sysdate -add_months（sysdate，12） FROM dual <br />　　SQL Server则是这样做的： <br />　　SELECT datediff（dd， GetDate（），dateadd（mm，12，getdate（））） <br /><br />　　</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/234136" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 20:13:50 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234136</link>
        <guid>http://www.javaeye.com/topic/234136</guid>
      </item>
      <item>
        <title>webORB for PHP</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zzzzzzzzzzzz.javaeye.com">right now</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/234134" style="color:red;">http://www.javaeye.com/topic/234134</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          weborb为PHP提供了一套灵活的远程执行。用weborb ， PHP开发者能整合Flex客户端应用程序与部署在PHP中的对象应用。 此外， weborb为PHP可以作为一个FLASH Remoting的网关，从而支持FLASH客户端应用。 <br /><br />本指南提供了一个概述建立一个Flex客户利用Flex Builder的2.0和与之连接的同一个PHP应用。 结果该漫游是一个Flex应用沟通的一个PHP对象暴露透过weborb对于PHP 。 <br /><br />起步-weborb安装 <br /><br />确保下列软件安装在下载weborb对于PHP ： <br /><br />PHP5 or Zend Platform with PHP5 support或把php5的Zend平台，把php5支持 <br /><br />Any web server supporting PHP5 or later任何网络服务器支持把php5或更高版本<br /><br />Flex Builder 创造了一个空的Flex应用。 下面的步骤将指导，通过建立一个Flex应用和连接，它与一个PHP对象。 <br /><br />配置-Flex Builder <br /><br />weborb对PHP产品分布载成品Flex应用演示flex能够weborb连接和远程调用。拷贝和粘贴的内容，该example.mxml文件位于 <br /><br />     \Examples\SampleApp\ \实例\ sampleapp \ <br /><br />进入mxml创建的文件Flex Builder。该守则在应用连接到一个PHP对象，并检索出一些基本的计算机的信息当物体正在运行。 <br /><br />配置-weborb <br /><br />Flex 应用需要申报的暴露班为"目的地" 。 目的地必须被配置在远程- config.xml文件位于\ \Weborb\WEB-INF\flex文件夹。应用在这个例子中使用了" infoservice "目标之定义为： <br /><br /> &lt;destination id="InfoServiceDestination"><br />   &lt;properties><br />     &lt;source>InfoService&lt;/source><br />   &lt;/properties><br />&lt;/destination> <br /><br />Flex Builder中读取配置文件，在编译的时候。 <br /><br />重要提醒：当您编译项目在挠性建设者，一定要查找的目录挠性建设者地方编译客户端应用。这是非常重要的地方，一本weborb.php到同一个目录下。 weborb.php必须包含下列PHP代码： <br /><br />&lt;?php  <br />   require_once("../Weborb/ORBHttpHandler.php");<br /><br />   $m_ORBHttpHandler = new ORBHttpHandler();<br />   $m_ORBHttpHandler->processRequest(); <br />?> <br /><br />非常重要 ：第一线， 必须经过剪辑后，以该点至weborb目录，从产品分布。举例来说，看看weborb.php坐落于 / 控制台文件夹 <br /><br />  <br /><br />运行Flex应用 <br /><br />:当你运行该应用程序在Flex建设者时，它会打开一个浏览器和负荷应用： <br /><br />http://localhost/Examples/SampleFlexToPHPProject.html http://localhost/examples/sampleflextophpproject.html <br /><br />应用连接到后端服务后，启动或当用户点击"发送请求"按钮： <br /><br />代码审查 <br /><br />Flex应用宣布一项远程对象使用RemoteObject API： <br /><br />remoteObject = new RemoteObject();<br />remoteObject.destination = "InfoServiceDestination";<br />remoteObject.getComputerInfo.addEventListener("result", onResult);<br />remoteObject.addEventListener("fault", onFault); <br /><br />通知目的地的名称相匹配的目的地输入远程- config.xml文件。 当用户点击'获得计算机信息'按钮时，下面的函数执行一个远程方法调用： <br /><br />private function getInfo():void <br />{<br />  invokeButton.enabled = false;<br />  currentUserText.text = "";<br />  processIdText.text = "";<br />  osText.text = "";<br />  phpVersionText.text = "";<br />  remoteObject.getComputerInfo();<br />} <br /><br />当调用响应的情况下，灵活调用响应处理器在&lt;remoteobject>标签。 响应处理器在举例中，填充的文本字段与现有的数据，在返回的对象： <br /><br />private function onResult(event:ResultEvent):void <br />{<br />  var computerInfo:Object = event.result;<br />  currentUserText.text = computerInfo.currentUser;<br />  processIdText.text = computerInfo.phpProcessId;<br />  osText.text = computerInfo.operatingSystem;<br />  phpVersionText.text = computerInfo.phpVersion;<br />  invokeButton.enabled = true;<br />} <br /><br />源代码服务器端的对象是如下： <br /><br />class InfoService<br />{<br />  public function getComputerInfo()<br />  {<br />    $compInfo = new ComputerInfo();<br />    $compInfo->currentUser = get_current_user();<br />    $compInfo->phpProcessId = getmypid();<br />    $compInfo->operatingSystem = php_uname( 'a' );<br />    $compInfo->phpVersion = phpversion();<br />    return $compInfo;<br />  }<br />}<br />class ComputerInfo<br />{<br />  public $currentUser;<br />  public $phpProcessId;<br />  public $operatingSystem;<br />  public $phpVersion;<br />}
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/234134" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 20:11:29 +0800</pubDate>
        <link>http://www.javaeye.com/topic/234134</link>
        <guid>http://www.javaeye.com/topic/234134</guid>
      </item>
      <item>
        <title>Set useful bashrc for Linux user</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rossbu.javaeye.com">rossbu</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233945" style="color:red;">http://www.javaeye.com/topic/233945</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在一般地工作环境中经常会用到地bash style,每个人可能都不同这里列举地就是我个人地一些偏爱: <br />################  setting for User's bashrc ###################<br />export PATH=$PATH:/etc/init.d/  # path extensible<br />export SV="https://scm1.****.com/repos/svn1"   # svn path<br />export AdminTestBox=/home/ross/AdminTestBox    # main box<br />export JAVA_HOME='/usr/local/build/java/jdk1.5.0_06'  # java home<br /><br />alias ll='ls -l -tr --color=tty --time-style=+%Y-%m-%d[%H:%M:%S]' # ls style<br />alias rm='rm -irf' # force/ignore/recurtive<br />alias cp='cp -i'  # interactive<br />alias mv='mv -i'  # interactive<br /><br />alias goXXXX="cd /usr/local/XXXX"<br />################  setting for User's bashrc ###################<br />然后我们可以执行<br />source ~/.bashrc  or . ~/.bashrc  # make the change valid<br />su - username # change to the user  <br />svn co $SV/projectName  # checkout sourcecode from svn
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/233945" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 14:23:07 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233945</link>
        <guid>http://www.javaeye.com/topic/233945</guid>
      </item>
      <item>
        <title>Mysql 中各类型数据的的存储需求</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xombat.javaeye.com">xombat</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233904" style="color:red;">http://www.javaeye.com/topic/233904</a>&nbsp;
          发表时间: 2008年08月28日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先，数据库中每行最大长度不能超过65535bytes，其中Blob和Text的数据只占用9到12byte（<span style="color: red">具体大小不知道和什么有关系</span>）。<br /><br />Char(M)的长度计算比较简单，但也要详细说一下，M是字符的个数（不能超过255），而不是byte数，因此它的实际存储容量和它所使用的字符集有关系，对于像utf8这样的字符集（每个字符没有固定的长度），他的容量V应该如何计算？这里简单的V = M * w,其中w是字符集中每个字符占用的最大byte数，对于utf8应该是3吧，我原来猜测既然像char(4)这样的数据最大能容纳4*3bytes（对于utf8字符集），那么他肯定能容纳’123456’这段数据，因为他用utf8字符集表示也不过占用6bytes。但是实际测试后发现不是，不管是数字还是字母或者汉字，他最多只能容纳4个。<br /><br />然后我们重点关注一下varchar(M)的长度，因为它的长度很不固定而且使用范围最广。这里的M的范围理论上限制在0到65535之间，为什么说理论上，是因为它的实际长度要受很多因素的限制，比如每行最大长度，使用的字符集，以及M。我们拿 varchar(127)来作为例子，假设他使用gbk字符集，他的最大可能长度应该是127*2=254，但是因为他需要有一个prefix来表示他具体bytes数是多少（因为varchar是变长的，没有这个长度值他不知道如何读取数据），因此分配1byte来表示他的bytes数为254，这样他最终占用的byte数为255，如果是varchar(128)，2*128 = 256这个数字用一个byte无法表示，因此需要2个byte的prefix,这样他会占用258bytes。而如果他改使用latin1字符集，那么每个字符为1个字节，这样它的最大可能长度为1* 128 &lt; 256，可以用一个byte表示它的长度，因此他又占用129bytes。<br /><br />这里的M最大能是多少呢？对于latin1的字符，因为每个字符占一个字节，而max row size 为65535，所以M最大为65535-2 = 65533(2是prefix的长度，这个65535其实还和这一行中其他列的长度有关，准确的说应该是65535减去其他列的长度，但这里简单将他们忽略)。而如果使用utf8字符，字符最大占用3个字节，那么M最大应该是（65535 – 2）/3 = 21844，这里的2是prefix的长度。<br /><br />对于某些数据库引擎，他的数据存取空间大小还需要考虑align的情况，比如计算的大小是15，但他的align = 4，所以它最后会占用16bytes。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/233904" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 13:21:31 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233904</link>
        <guid>http://www.javaeye.com/topic/233904</guid>
      </item>
      <item>
        <title>完美 解决Ubuntu8.04查看PDF乱码的解决</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xx521.javaeye.com">xx521</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/233052" style="color:red;">http://www.javaeye.com/topic/233052</a>&nbsp;
          发表时间: 2008年08月27日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          以前用Ubuntu7.10默认的evince显示部分PDF文件时总会显示乱码，按照网上安装相应支持文件和字体也不行，解决方法，安装adobereader。<br /><br />1、登录http://www.adobe.com/products/acrobat/readstep2_allversions.html官方网站下载deb中文包。<br />(或者 可以下载tar包来进行处理，运行里面的INSTALL在终端下运行)<br /><br />2、下载完毕，在终端执行命令: sudo dpkg -i AdobeReader_chs-8.1.1-1.i386.deb。<br /><br />3、安装完毕，从“应用程序”－“办公”运行Adobe Reader，会提示无法找到HTML渲染库libgtkembedmoz，指定成/usr/lib/firefox就行了。<br /><br />上面第三步对7.10是可行的，但对于Ubuntu8.04，应改为/usr/lib/thunderbird，其它照样。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/233052" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Aug 2008 00:34:50 +0800</pubDate>
        <link>http://www.javaeye.com/topic/233052</link>
        <guid>http://www.javaeye.com/topic/233052</guid>
      </item>
      <item>
        <title>简明 Python 教程里面的一个例子的问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sql.javaeye.com">sql</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/232041" style="color:red;">http://www.javaeye.com/topic/232041</a>&nbsp;
          发表时间: 2008年08月24日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          例子的链接：<br /><a href="http://www.woodpecker.org.cn:9081/doc/abyteofpython_cn/chinese/ch11s06.html" target="_blank">http://www.woodpecker.org.cn:9081/doc/abyteofpython_cn/chinese/ch11s06.html</a><br /><br /><pre name="code" class="python">
class Person:
	'''Represents a person.'''
	population=0

	def __init__(self,name):
		'''Initializes the person's data.'''
		self.name=name
		print '(Initializing %s)' %self.name

		#When this person is created, he/she adds to the population
		Person.population+=1
	
	def __del__(self):
		'''I am dying.'''
		print '%s says bye.' %self.name

		Person.population-=1

		if Person.population==0:
			print 'I am the last one.'
		else:
			print 'There are still %d people left.' %Person.population
	
	def sayHi(self):
		'''Greeting by the person.

		Really, that's all it does.'''
		print 'Hi, my name is %s.' %self.name
	
	def howMany(self):
		'''Prints the current population.'''
		if Person.population==1:
			print 'I am the only person here.'
		else:
			print 'We have %d persons here.' %Person.population

swaroop=Person('Swaroop')
swaroop.sayHi()
swaroop.howMany()

kalam=Person('Abdul Kalam')
kalam.sayHi()
kalam.howMany()

swaroop.sayHi()
swaroop.howMany()

</pre><br />运行起来完全没有问题<br /><br />但如果把测试那一段改为：<br /><pre name="code" class="python">
test=Person('Swaroop')
test.sayHi()
test.howMany()

kalam=Person('Abdul Kalam')
kalam.sayHi()
kalam.howMany()

test.sayHi()
test.howMany()
</pre><br />运行的时候就会得到一个异常：<br />Exception exceptions.AttributeError: "'NoneType' object has no attribute 'popula<br />tion'" in &lt;bound method Person.__del__ of &lt;__main__.Person instance at 0x00BEC12<br />0>> ignored<br /><br />然后改很多次那个变量都有这个异常，好像那个变量只有用swaroop才没有问题，非常怪异。。。。<br />有没有人知道这是怎么回事？<br /><br />我用的python版本： Python 2.5.2 windows下面的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/232041" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Aug 2008 09:30:51 +0800</pubDate>
        <link>http://www.javaeye.com/topic/232041</link>
        <guid>http://www.javaeye.com/topic/232041</guid>
      </item>
      <item>
        <title>JDBC数据库插入性能测试</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://areyouok.javaeye.com">AreYouOK?</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/231952" style="color:red;">http://www.javaeye.com/topic/231952</a>&nbsp;
          发表时间: 2008年08月23日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>版本</p>
<p>2008年8月21日，完成测试1的Oracle_Win、Mysql_Li、Mysql _Win、MSSQL部分。<br />2008年8月22日，完成测试2的Oracle_Win、Mysql_Li、Mysql _Win、MSSQL部分。</p>
<p>2008年8月23日，文档整理。</p>
<p>2008年8月25日，完成postgresql linux版本的测试1、测试2。<br />2008年8月27日，完成postgresql windows版本的测试1、测试2。</p>
<p><br /><br /> 1.背景<br />这不是数据库性能的综合测试，这里只测试插入，并且是用JDBC插入。这是针对某种应用的某模块的简单模拟，不可能适用所有的情况。<br />假设系统的基本情况是，有后台线程要不停的读取数据，并写入流水表，写入以后就不会update。没有人使用系统的时候，就没有查询，偶尔才会有人来使用。查询的时候，因为数据量比较大，性能优化也是一个重要的问题，但不在本文讨论范围之内。<br /><br />本文还没有完成，测试3还没有进行，并缺少Oracle Linux版本和PostgreSQL的数据。计划将来补上。<br /><br /> 2.测试方法<br /><br />测试1，简单表测试<br />建立3个一模一样的小表，只有3个数字类型的字段，一个主键，没有另外建索引。对不同的数据库执行以下测试：<br />A.用1个线程写一个表<br />B.用2个线程同时写2个不同的表<br />C.用2个线程写同一个表<br />D.用3个线程同时写3个不同的表<br />E.用3个线程写同一个表<br />每50条为一批进行批量操作，每5秒进行一次采样，稳定运行一段时间以后，取每秒插入的数据条数进行比较。用多个线程并发进行操作可以检查对双核CPU的利用效果。<br /><br />测试2，普通表测试<br />与测试1相同，但是表不一样，建立3个一模一样的表。表包含10个各种字段，另外再单独建3个索引。<br /><br />测试3，超大表测试（TODO）<br />与测试1相同，但是表不一样，建立3个一模一样的表。表包含100个以上的字段，10个索引。系统中有类似这样的流水表。</p>
<p>&nbsp;</p>
<p> 3.环境定义<br /> 3.1.硬件环境定义<br />笔记本<br />CPU Core Duo T2350（双核，1.86G）<br />硬盘120G<br />内存2G<br /><br />Java程序和数据库跑在一个机器上测试确实不太好，不过只有这样的条件。另外，在小型客户那里的生产环境，有把数据库和Java应用服务器安装在一个机器的情况，因此这样也能说明一些问题。<br /><br /> 3.2.操作系统定义<br />Windows平台：Windows XP Pro SP2，文件系统NTFS<br />Linux平台：Ubuntu 8.04，文件系统EXT3<br /><br />Windows 平台上已经尽可能停用了无关的程序，比如杀毒软件等。<br />CPU在负载低的时候会自动降频到800M，在Windows下，使用软件RMClock将主频强制稳定在1.86G，避免CPU频率调整可能带来的性能波动。Linux下没有做这个处理（因为不知道用什么软件）。<br />为了偷懒是在Eclipse里面运行的，不过应该没有太多的影响。程序在循环中没有生成垃圾对象，不清楚数据库驱动程序会不会，但是应该不会频繁GC吧。<br /><br /> 3.3.待测试数据库环境定义</p>
<p>&nbsp;</p>
<table cellspacing="0" border="1" width="661" cellpadding="0" style="height: 99px;">
<tbody>
<tr>
<td>数据库</td>
<td>OS</td>
<td>缩写</td>
<td>说明</td>
</tr>
<tr>
<td>Oracle 10g 10.2.01</td>
<td>Windows</td>
<td>Oracle_win</td>
<td>JDBC驱动程序用的安装Oracle后自带的。先整理磁盘碎片，然后建立新的表空间和用户，数据表空间5G，临时表空间200M，重做日志文件3&times;50M。</td>
</tr>
<tr>
<td>Oracle 10g 10.2.01</td>
<td>Linux</td>
<td>Oracle_Li</td>
<td></td>
</tr>
<tr>
<td>MS SQL Server 2005 SP2</td>
<td>Windows</td>
<td>MSSQL</td>
<td>JDBC驱动程序为jtds1.2.2。磁盘碎片整理后建立数据库文件5G，日志文件100M。</td>
</tr>
<tr>
<td>MySQL 5.1.26 RC</td>
<td>Linux</td>
<td>Mysql_Li</td>
<td><br />存储引擎为InnoDB。JDBC驱动为mysql-connector-java-5.1.6-bin.jar</td>
</tr>
<tr>
<td>MySQL 5.1.26 RC</td>
<td>Windows</td>
<td>Mysql_Win</td>
<td>存储引擎为InnoDB。JDBC驱动为mysql-connector-java-5.1.6-bin.jar</td>
</tr>
<tr>
<td>
<p lang="zh-CN">Postgresql 8.3.3 </p>
</td>
<td>Linux</td>
<td>Pgsql_Li</td>
<td>JDBC3 Postgresql Driver, Version 8.3-603。</td>
</tr>
<tr>
<td>
<p lang="zh-CN">Postgresql 8.3.3</p>
</td>
<td>Windows</td>
<td>Pgsql_Win</td>
<td>JDBC3 Postgresql Driver, Version 8.3-603。</td>
</tr>
</tbody>
</table>
<p><br />数据库没有再做什么优化，简单的调整内存之类的参数，对测试结果基本没有影响。<br /> <br />4.测试结果<br /><br />明细结果在附件（Eclipse工程）的result中。有的测试重复做过多次，基本上数据都是稳定的。<br />文件名命名规则是：数据库_s_线程数_表相同或不相同，s表示simple，n表示normal<br /><br />输出每行表示一次采样，5秒1次，&ldquo;本阶段平均&rdquo;表示这5秒的平均速度，&ldquo;共处理&rdquo;是进程启动以后处理记录的总和，&ldquo;平均&rdquo;是根据启动后处理的记录总数和总时间计算出来的：<br /><br />normal_evt 2170/s   normal_evt 2050/s   normal_evt 2170/s   本阶段平均6390/s 共处理3,1950条  平均6390/s<br /><br /><br /> 4.1.结果数据<br /><br />测试1，简单表，3字段，1主键，无索引</p>
<table cellspacing="0" border="1" width="621" cellpadding="0" style="height: 144px; text-align: right;">
<tbody>
<tr>
<td>条/秒</td>
<td>1线程1表</td>
<td>2线程2表</td>
<td>2线程1表</td>
<td>3线程3表</td>
<td>3线程1表</td>
</tr>
<tr>
<td>Oracle_Li<br /></td>
<td><br /></td>
<td><br /></td>
<td><br /></td>
<td><br /></td>
<td><br /></td>
</tr>
<tr>
<td>Oracle_Win</td>
<td>3,7205</td>
<td>5,6065</td>
<td>4,2437</td>
<td>5,0640</td>
<td>4,6861</td>
</tr>
<tr>
<td>Mysql_Li</td>
<td>1,0287</td>
<td>2,0449</td>
<td>1,2751</td>
<td>2,0397</td>
<td>1,4239</td>
</tr>
<tr>
<td>Mysql_Win</td>
<td>1020</td>
<td>1173</td>
<td>1167</td>
<td>1706</td>
<td>1671</td>
</tr>
<tr>
<td>MSSQL</td>
<td>2975</td>
<td>5584</td>
<td>5561</td>
<td>7705</td>
<td>7703</td>
</tr>
<tr>
<td>Pgsql_Li</td>
<td>
<p align="right">1,3882</p>
</td>
<td>2,1870</td>
<td>2,2225</td>
<td>2,2402</td>
<td>2,4181</td>
</tr>
<tr>
<td>Pgsql_Win</td>
<td>1,0241</td>
<td>1,7287</td>
<td>1,7323</td>
<td>1,7153</td>
<td>1,8160</td>
</tr>
</tbody>
</table>
<p><br /><br />测试2，普通表，10字段，1主键，3索引</p>
<table cellspacing="0" border="1" width="623" cellpadding="0" style="text-align: right; height: 114px;">
<tbody>
<tr>
<td>条/秒</td>
<td>1线程1表</td>
<td>2线程2表</td>
<td>2线程1表</td>
<td>3线程3表</td>
<td>3线程1表</td>
</tr>
<tr>
<td>Oracle_Li</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Oracle_Win</td>
<td>1,9989</td>
<td>2,2001</td>
<td>1,8419</td>
<td>2,2442</td>
<td>1,8643</td>
</tr>
<tr>
<td>Mysql_Li</td>
<td>5857</td>
<td>1,0226</td>
<td>5890</td>
<td>1,0204</td>
<td>6180</td>
</tr>
<tr>
<td>Mysql_Win</td>
<td>973</td>
<td>1152</td>
<td>1142</td>
<td>1685</td>
<td>1595</td>
</tr>
<tr>
<td>MSSQL</td>
<td>2692</td>
<td>5155</td>
<td>5150</td>
<td>7173</td>
<td>6922</td>
</tr>
<tr>
<td>Pgsql_Li</td>
<td>8763</td>
<td>1,1492</td>
<td>1,2935</td>
<td>1,0141</td>
<td>1,2517</td>
</tr>
<tr>
<td>Pgsql_Win</td>
<td>7043</td>
<td>9997</td>
<td>9671</td>
<td>1,2274</td>
<td>1,2645</td>
</tr>
</tbody>
</table>
<p><br /><br /> 4.2.结果分析<br />不同的数据库在不同的方式下表现不一样，取最好的成绩，结果是Oracle_Win &gt; Mysql_Li &gt; MSSQL &gt;&gt; Mysql_Win。具体情况可以看上面的表。<br />除了Oracle以外，其他的数据库插入的性能都很稳定。<br />CPU占用率通常在20%~60%之间，随着线程数的增加略有提高。<br /><br />下面对单个数据库做分析：<br /> 4.2.1.Mysql_Li<br /><br />mysql的特点是，当使用2个线程插入2个不同的表时，性能立刻提高了整整一倍，使用3个线程插入3个表的时候却，相比2线程2表没有提高。看起来，要用至少两个线程才能充分利用双核的两个CPU（其实是4个线程，2个java线程，2个数据库线程，但是java线程资源占用率较小，主要瓶颈还是在数据库）。<br />当使用多个线程同时入1个表时，性能只是稍微有点提高。<br /><br /> 4.2.2.Mysql_Win<br />都说Mysql Windows版本性能不行，没想到差那么多。但是有两个很有意思的特点（MS SQL差不多也有这样的特点）：第一是测试2的数据比测试1几乎没有下降，而测试2的表要复杂的多，看来mysql有个瓶颈在我们不知道的地方，使得面对一个很简单的表，速度也上不去；第二是不断增加线程，性能始终能够提高，后来我又做了4线程和5线程的测试，仍然如此，不过提高的幅度越来越小。<br /><br /> 4.2.3.Oracle_Win<br />插入性能很不稳定。如果把采样时间缩短为1秒，会发现大部分时间性能是基本稳定的，但每隔一小段时间，会基本失去响应（插入速度能降低到200以下），估计是重做日志的切换引起的，Oracle重做日志是3&times;50M。<br />随着数据量的增加，性能稍有下降，因此每次测试先都先truncate表，测试1的5次运行每次都在单表数据量达到1000w时结束测试，测试2在500w时结束测试。尚未测试在极大的数据量情况下会怎么样，但oracle在这种情况下的表现应该是久经考验的，估计可能到了一定的程度会稳定吧。<br /><br />oracle的数据相当的好，并且其他数据库往往需要增加线程来获得更好的成绩，而oracle在1个线程的情况下能得到相对最好的成绩，增加线程以后提高不多。<br />当使用2个线程入2个表时，测试1提高50%，测试2略微提高。3个线程入3表则没有提高。<br />多个线程入同一个表的时候，测试1性能只有一些提高，而测试2竟出现了下降，但这种情况也不是不可思议的，测试2有10个字段，包括主键有4个索引，多个线程可能在争夺资源中出现了锁定。<br /><br />cpu占有率波动很大，通常在10%~70%左右以大约20秒的周期剧烈波动，随着线程数的增加，占有率稍有上升。cpu占有率低时，写入速度也急剧下降，应该是切换重做日志引起。<br /><br />最初做Oracle这个测试的时候，是把表建在一个已经有很多数据的表空间里面。后来，做碎片整理，然后新建表空间和用户，再测试，性能提高了30%。</p>
<p>4.2.4.MSSQL<br />MSSQL的特点和Windows下的Mysql差不多，测试1和测试2数据相当，似乎有别的瓶颈。刚开始的时候，数据真是非常可怜（与它假象的对手oracle相比），不过在增加线程后出现了可观的提高，不然就要沦落为和Mysql_win一个量级了。</p>
<p>&nbsp;4.2.5.Pgsql_Li<br />Postgresql的数据比mysql略高。<br /><br />&nbsp;4.2.6.Pgsql_Win<br />postgresql在windows下性能只出现了少量下降。有一个特点是在3个线程的时候CPU占用率接近到100%。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://robbin.javaeye.com/topic/231952" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 23 Aug 2008 22:53:08 +0800</pubDate>
        <link>http://www.javaeye.com/topic/231952</link>
        <guid>http://www.javaeye.com/topic/231952</guid>
      </item>
  </channel>
</rss>
