<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>gchuyun</title>
    <description>发明一个方形的轮子！</description>
    <link>http://gchuyun.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>关于hibernate的缓存使用 </title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/183444" style="color:red;">http://gchuyun.javaeye.com/blog/183444</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          摘自http://blog.csdn.net/woshichenxu/archive/2006/01/22/586361.aspx<br />1.     关于hibernate缓存的问题：<br />1.1.1.         基本的缓存原理<br /><br />Hibernate缓存分为二级，第一级存放于session中称为一级缓存，默认带有且不能卸载。<br /><br /> <br /><br />第二级是由sessionFactory控制的进程级缓存。是全局共享的缓存，凡是会调用二级缓存的查询方法 都会从中受益。只有经正确的配置后二级缓存才会发挥作用。同时在进行条件查询时必须使用相应的方法才能从缓存中获取数据。比如Query.iterate()方法、load、get方法等。必须注意的是session.find方法永远是从数据库中获取数据，不会从二级缓存中获取数据，即便其中有其所需要的数据也是如此。<br /><br /> <br /><br />查询时使用缓存的实现过程为：首先查询一级缓存中是否具有需要的数据，如果没有，查询二级缓存，如果二级缓存中也没有，此时再执行查询数据库的工作。要注意的是：此3种方式的查询速度是依次降低的。<br />1.2.   存在的问题<br />1.2.1.      一级缓存的问题以及使用二级缓存的原因<br /><br />     因为Session的生命期往往很短，存在于Session内部的第一级最快缓存的生命期当然也很短，所以第一级缓存的命中率是很低的。其对系统性能的改善也是很有限的。当然，这个Session内部缓存的主要作用是保持Session内部数据状态同步。并非是hibernate为了大幅提高系统性能所提供的。<br /><br />为了提高使用hibernate的性能，除了常规的一些需要注意的方法比如：<br /><br />使用延迟加载、迫切外连接、查询过滤等以外，还需要配置hibernate的二级缓存。其对系统整体性能的改善往往具有立竿见影的效果！<br /><br />（经过自己以前作项目的经验，一般会有3~4倍的性能提高）<br /><br /> <br />1.2.2.      N+1次查询的问题<br /><br />执行条件查询时，iterate（）方法具有著名的 “n+1”次查询的问题，也就是说在第一次查询时iterate方法会执行满足条件的查询结果数再加一次（n+1）的查询。但是此问题只存在于第一次查询时，在后面执行相同查询时性能会得到极大的改善。此方法适合于查询数据量较大的业务数据。<br /><br />但是注意：当数据量特别大时（比如流水线数据等）需要针对此持久化对象配置其具体的缓存策略，比如设置其存在于缓存中的最大记录数、缓存存在的时间等参数，以避免系统将大量的数据同时装载入内存中引起内存资源的迅速耗尽，反而降低系统的性能！！！<br /><br /> <br />1.3.   使用hibernate二级缓存的其他注意事项：<br />1.3.1.      关于数据的有效性<br /><br />另外，hibernate会自行维护二级缓存中的数据，以保证缓存中的数据和数据库中的真实数据的一致性！无论何时，当你调用save()、update()或 saveOrUpdate()方法传递一个对象时，或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。 当随后flush()方法被调用时，对象的状态会和数据库取得同步。<br /><br /> <br /><br />也就是说删除、更新、增加数据的时候，同时更新缓存。当然这也包括二级缓存！<br /><br /> <br /><br />只要是调用hibernate API执行数据库相关的工作。hibernate都会为你自动保证 缓存数据的有效性！！<br /><br /> <br /><br />但是，如果你使用了JDBC绕过hibernate直接执行对数据库的操作。此时，Hibernate不会/也不可能自行感知到数据库被进行的变化改动，也就不能再保证缓存中数据的有效性！！<br /><br /> <br /><br />这也是所有的ORM产品共同具有的问题。幸运的是，Hibernate为我们暴露了Cache的清除方法，这给我们提供了一个手动保证数据有效性的机会！！<br /><br />一级缓存，二级缓存都有相应的清除方法。<br /><br /> <br /><br />其中二级缓存提供的清除方法为：<br /><br />按对象class清空缓存<br /><br />                按对象class和对象的主键id清空缓存<br /><br />                清空对象的集合中的缓存数据等。<br /><br />   <br />1.3.2.      适合使用的情况<br /><br />并非所有的情况都适合于使用二级缓存，需要根据具体情况来决定。同时可以针对某一个持久化对象配置其具体的缓存策略。<br /><br /> <br /><br />适合于使用二级缓存的情况：<br /><br />1、数据不会被第三方修改；<br /><br /> <br /><br />一般情况下，会被hibernate以外修改的数据最好不要配置二级缓存，以免引起不一致的数据。但是如果此数据因为性能的原因需要被缓存，同时又有可能被第3方比如SQL修改，也可以为其配置二级缓存。只是此时需要在sql执行修改后手动调用cache的清除方法。以保证数据的一致性<br /><br /> <br /><br />  2、数据大小在可接收范围之内；<br /><br /> <br /><br />     如果数据表数据量特别巨大，此时不适合于二级缓存。原因是缓存的数据量过大可能会引起内存资源紧张，反而降低性能。<br /><br /> <br /><br />如果数据表数据量特别巨大，但是经常使用的往往只是较新的那部分数据。此时，也可为其配置二级缓存。但是必须单独配置其持久化类的缓存策略，比如最大缓存数、缓存过期时间等，将这些参数降低至一个合理的范围（太高会引起内存资源紧张，太低了缓存的意义不大）。<br /><br /> <br /><br />  3、数据更新频率低；<br /><br /> <br /><br />     对于数据更新频率过高的数据，频繁同步缓存中数据的代价可能和 查询缓存中的数据从中获得的好处相当，坏处益处相抵消。此时缓存的意义也不大。<br /><br /> <br /><br /> <br /><br />  4、非关键数据（不是财务数据等）<br /><br /> <br /><br />  财务数据等是非常重要的数据，绝对不允许出现或使用无效的数据，所以此时为了安全起见最好不要使用二级缓存。<br /><br />  因为此时 “正确性”的重要性远远大于 “高性能”的重要性。<br /><br /> <br />2.     目前系统中使用hibernate缓存的建议<br />1.4.   目前情况<br /><br /> 一般系统中有三种情况会绕开hibernate执行数据库操作：<br /><br />1、多个应用系统同时访问一个数据库<br /><br />   此种情况使用hibernate二级缓存会不可避免的造成数据不一致的问题，<br /><br />   此时要进行详细的设计。比如在设计上避免对同一数据表的同时的写入操作，<br /><br />   使用数据库各种级别的锁定机制等。<br /><br /> <br /><br />2、动态表相关<br /><br />   所谓“动态表”是指在系统运行时根据用户的操作系统自动建立的数据表。<br /><br />   比如“自定义表单”等属于用户自定义扩展开发性质的功能模块，因为此时数据表是运行时建立的，所以不能进行hibernate的映射。因此对它的操作只能是绕开hibernate的直接数据库JDBC操作。<br /><br />      如果此时动态表中的数据没有设计缓存，就不存在数据不一致的问题。<br /><br />   如果此时自行设计了缓存机制，则调用自己的缓存同步方法即可。<br /><br />3、使用sql对hibernate持久化对象表进行批量删除时<br /><br />     此时执行批量删除后，缓存中会存在已被删除的数据。<br /><br />分析： <br /><br />   当执行了第3条（sql批量删除）后，后续的查询只可能是以下三种方式：<br /><br />a. session.find（）方法：<br /><br />根据前面的总结，find方法不会查询二级缓存的数据，而是直接查询数据库。<br /><br />所以不存在数据有效性的问题。<br /><br />b. 调用iterate方法执行条件查询时：<br /><br />根据iterate查询方法的执行方式，其每次都会到数据库中查询满足条件的id值，然后再根据此id 到缓存中获取数据，当缓存中没有此id的数据才会执行数据库查询；<br /><br />如果此记录已被sql直接删除，则iterate在执行id查询时不会将此id查询出来。所以，即便缓存中有此条记录也不会被客户获得，也就不存在不一致的情况。（此情况经过测试验证）<br /><br /> <br /><br />c. 用get或load方法按id执行查询：<br /><br /> <br /><br />客观上此时会查询得到已过期的数据。但是又因为系统中执行sql批量删除一般是<br /><br />针对中间关联数据表，对于<br /><br />中间关联表的查询一般都是采用条件查询 ,按id来查询某一条关联关系的几率很低,所以此问题也不存在!<br /><br /> <br /><br />   如果某个值对象确实需要按id查询一条关联关系,同时又因为数据量大使用 了sql执行批量删除。当满足此两个条件时,为了保证按id 的查询得到正确的结果,可以使用手动清楚二级缓存中此对象的数据的方法!!<br /><br />(此种情况出现的可能性较小)<br /><br /> <br />1.5.   建议<br /><br />1、建议不要使用sql直接执行数据持久化对象的数据的更新，但是可以执行 批量删除。（系统中需要批量更新的地方也较少）<br /><br /> <br /><br />2、如果必须使用sql执行数据的更新，必须清空此对象的缓存数据。调用<br /><br />SessionFactory.evict(class)<br /><br />SessionFactory.evict(class,id)<br /><br />等方法。<br /><br /> <br /><br />3、在批量删除数据量不大的时候可以直接采用hibernate的批量删除，这样就不存在绕开hibernate执行sql产生的缓存数据一致性的问题。<br /><br /> <br /><br />4、不推荐采用hibernate的批量删除方法来删除大批量的记录数据。<br /><br />原因是hibernate的批量删除会执行1条查询语句外加 满足条件的n条删除语句。而不是一次执行一条条件删除语句！！<br /><br />当待删除的数据很多时会有很大的性能瓶颈！！！如果批量删除数据量较大,比如超过50条,可以采用JDBC直接删除。这样作的好处是只执行一条sql删除语句,性能会有很大的改善。同时，缓存数据同步的问题,可以采用 hibernate清除二级缓存中的相关数据的方法。<br /><br />调用 SessionFactory.evict(class) ；SessionFactory.evict(class,id)等方法。<br /><br /> <br /><br />所以说，对于一般的应用系统开发而言（不涉及到集群，分布式数据同步问题等），因为只在中间关联表执行批量删除时调用了sql执行，同时中间关联表一般是执行条件查询不太可能执行按id查询。所以，此时可以直接执行sql删除，甚至不需要调用缓存的清除方法。这样做不会导致以后配置了二级缓存引起数据有效性的问题。<br /><br /> <br /><br />退一步说，即使以后真的调用了按id查询中间表对象的方法，也可以通过调用清除缓存的方法来解决。<br /><br /> <br />4、具体的配置方法 <br /><br />根据我了解的很多hibernate的使用者在调用其相应方法时都迷信的相信“hibernate会自行为我们处理性能的问题”，或者“hibernate 会自动为我们的所有操作调用缓存”,实际的情况是hibernate虽然为我们提供了很好的缓存机制和扩展缓存框架的支持，但是必须经过正确的调用其才有可能发挥作用！！所以造成很多使用hibernate的系统的性能问题，实际上并不是hibernate不行或者不好，而是因为使用者没有正确的了解其使用方法造成的。相反，如果配置得当hibernate的性能表现会让你有相当“惊喜的”发现。下面我讲解具体的配置方法.<br /><br /> ibernate提供了二级缓存的接口：<br />net.sf.hibernate.cache.Provider,<br />同时提供了一个默认的 实现net.sf.hibernate.cache.HashtableCacheProvider，<br />也可以配置 其他的实现 比如ehcache,jbosscache等。<br /><br />具体的配置位置位于hibernate.cfg.xml文件中<br />&lt;property name="hibernate.cache.use_query_cache">true&lt;/property><br />&lt;property name="hibernate.cache.provider_class">net.sf.hibernate.cache.HashtableCacheProvider&lt;/property><br /><br />很多的hibernate使用者在 配置到 这一步 就以为 完事了，<br />注意：其实光这样配，根本就没有使用hibernate的二级缓存。同时因为他们在使用hibernate时大多时候是马上关闭session，所以，一级缓存也没有起到任何作用。结果就是没有使用任何缓存，所有的hibernate操作都是直接操作的数据库！！性能可以想见。<br /><br />正确的办法是除了以上的配置外还应该配置每一个vo对象的具体缓存策略，在影射文件中配置。例如：<br /><br />&lt;hibernate-mapping><br />&lt;class name="com.sobey.sbm.model.entitySystem.vo.DataTypeVO" table="dcm_datatype"><br />&lt;cache usage="read-write"/><br />&lt;id name="id" column="TYPEID" type="java.lang.Long"><br />&lt;generator class="sequence"/><br />&lt;/id><br /><br />&lt;property name="name" column="NAME" type="java.lang.String"/><br />&lt;property name="dbType" column="DBTYPE" type="java.lang.String"/><br />&lt;/class><br />&lt;/hibernate-mapping><br /><br /><br />关键就是这个&lt;cache usage="read-write"/>，其有几个选择<br />read-only,read-write,transactional,等<br />然后在执行查询时 注意了 ，如果是条件查询，或者返回所有结果的查询，此时session.find()方法 不会获取缓存中的数据。只有调用query.iterate()方法时才会调缓存的数据。<br /><br />同时 get 和 load方法 是都会查询缓存中的数据 .<br /><br />对于不同的缓存框架具体的配置方法会有不同，但是大体是以上的配置<br /><br />（另外，对于支持事务型，以及支持集群的环境的配置我会争取在后续的文章中中 发表出来）<br /><br /> <br />3.     总结<br /><br />总之是根据不同的业务情况和项目情况对hibernate进行有效的配置和正确的使用，扬长避短。不存在适合于任何情况的一个“万能”的方案。<br /><br />以上结论及建议均建立在自己在对 Hibernate 2.1.2中的测试结果以及以前的项目经验的基础上。如有谬处，请打家提出指正:)!<br /><br />最后，祝大家 新年快乐！！在新的一年里 取得人生的进步！！！
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/183444#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Apr 2008 16:42:46 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/183444</link>
        <guid>http://gchuyun.javaeye.com/blog/183444</guid>
      </item>
      <item>
        <title>Hibernate性能调优（摘自城市胡同）</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/181542" style="color:red;">http://gchuyun.javaeye.com/blog/181542</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、inverse = ?<br /><br />          inverse=false(default)<br />                      用于单向one-to-many关联<br />                      parent.getChildren().add(child) // insert child<br />                      parent.getChildren().delete(child) // delete child<br />           inverse=true<br />                      用于双向one-to-many关联<br />                      child.setParent(parent); session.save(child) // insert child<br />                       session.delete(child)<br />            在分层结构的体系中<br />             parentDao, childDao对于CRUD的封装导致往往直接通过session接口持久化对象，而很少通过关联对象可达性 <br /><br />二、one-to-many关系<br /><br />                单向关系还是双向关系？<br />                     parent.getChildren().add(child)对集合的触及操作会导致lazy的集合初始化，在没有对集合配置二级缓存的情况下，应避免此类操作<br />                   select * from child where parent_id = xxx;<br />          性能口诀：<br />                  1.  一般情况下避免使用单向关联，尽量使用双向关联<br />                  2.  使用双向关联，inverse=“true”<br />                  3.  在分层结构中通过DAO接口用session直接持久化对象，避免通过关联关系进行可达性持久化<br /><br /> <br /><br />三、many-to-one关系<br /><br />         单向many-to-one表达了外键存储方<br />         灵活运用many-to-one可以避免一些不必要的性能问题<br />         many-to-one表达的含义是：0..n : 1，many可以是0，可以是1，也可以是n，也就是说many-to-one可以表达一对多，一对一，多对一关系<br />          因此可以配置双向many-to-one关系，例如：<br />                1.   一桌四人打麻将，麻将席位和打麻将的人是什么关系？是双向many-to-one的关系<br /><br />四、one-to-one<br /><br />            通过主键进行关联<br />            相当于把大表拆分为多个小表<br />            例如把大字段单独拆分出来，以提高数据库操作的性能<br />            Hibernate的one-to-one似乎无法lazy，必须通过bytecode enhancement<br /><br />五、集合List/Bag/Set <br /><br />            one-to-many<br />               1.    List需要维护index column，不能被用于双向关联，必须inverse=“false”，被谨慎的使用在某些稀有的场合<br /><br />               2.      Bag/Set语义上没有区别<br />               3.       我个人比较喜欢使用Bag<br />           many-to-many<br />               1.      Bag和Set语义有区别<br />               2。   建议使用Set<br /><br />六、集合的过滤<br /><br />             1.  children = session.createFilter(parent.getChildren(), “where this.age > 5 and   this.age &lt; 10”).list()<br />         针对一对多关联当中的集合元素非常庞大的情况，特别适合于庞大集合的分页：<br />                   session.createFilter(parent.getChildren(),“”).setFirstResult(0).setMaxResults(10).list();<br /><br />七、继承关系当中的隐式多态<br /><br />           HQL: from Object<br />             1.     把所有数据库表全部查询出来<br />              2.     polymorphism=“implicit”(default)将当前对象，和对象所有继承子类全部一次性取出<br />              3.      polymorphism=“explicit”，只取出当前查询对象<br /><br />八、Hibernate二级缓存<br /><br />              著名的n+1问题：from Child，然后在页面上面显示每个子类的父类信息，就会导致n条对parent表的查询：<br />                   select * from parent where id = ?<br />                   .......................<br />                   select * from parent where id = ?<br />              解决方案<br />                        1.      eager fetch<br />                         2.      二级缓存<br /><br />九、inverse和二级缓存的关系<br /><br />            当使用集合缓存的情况下：<br />                 1.     inverse=“false”，通过parent.getChildren()来操作，Hibernate维护集合缓存<br />                  2.    inverse=“true”，直接对child进行操作，未能维护集合缓存！导致缓存脏数据<br />                  3.    双向关联，inverse=“true”的情况下应避免使用集合缓存<br /><br />十、Hibernate二级缓存是提升web应用性能的法宝<br /><br />              OLTP类型的web应用，由于应用服务器端可以进行群集水平扩展，最终的系统瓶颈总是逃不开数据库访问；<br /><br />           哪个框架能够最大限度减少数据库访问，降低数据库访问压力， 哪个框架提供的性能就更高；针对数据库的缓存策略：<br />                    1.        对象缓存：细颗粒度，针对表的记录级别，透明化访问，在不改变程序代码的情况下可以极大提升web应用的性能。对象缓存是ORM的制胜法宝。<br />                    2.       对象缓存的优劣取决于框架实现的水平，Hibernate是目前已知对象缓存最强大的开源ORM<br />                    3.        查询缓存：粗颗粒度，针对查询结果集，应用于数据实时化要求不高的场合<br /><br />十一、应用场合决定了系统架构<br /><br />一、是否需要ORM<br />Hibernate or iBATIS？<br />二、采用ORM决定了数据库设计<br /><br />            Hibernate：<br />                    倾向于细颗粒度的设计，面向对象，将大表拆分为多个关联关系的小表，消除冗余column，通过二级缓存提升性能（DBA比较忌讳关联关系的出现，但是 ORM的缓存将突破关联关系的性能瓶颈）；Hibernate的性能瓶颈不在于关联关系，而在于大表的操作<br />            iBATIS：<br />                    倾向于粗颗粒度设计，面向关系，尽量把表合并，通过表column冗余，消除关联关系。无有效缓存手段。iBATIS的性能瓶颈不在于大表操作，而在于关联关系。<br />总结：<br /><br />     性能口诀<br />               1、使用双向一对多关联，不使用单向一对多<br />               2、灵活使用单向多对一关联<br />               3、不用一对一，用多对一取代<br />               4、配置对象缓存，不使用集合缓存<br />               5、一对多集合使用Bag，多对多集合使用Set<br />               6、继承类使用显式多态<br />               7、表字段要少，表关联不要怕多，有二级缓存撑腰
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/181542#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Apr 2008 09:23:55 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/181542</link>
        <guid>http://gchuyun.javaeye.com/blog/181542</guid>
      </item>
      <item>
        <title>join和union（摘自csdn）</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/180711" style="color:red;">http://gchuyun.javaeye.com/blog/180711</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">1.交集  <br />  Inner   Join,   等价于select   *   from   a   b   where   a.id=b.id   ,*表示a.*,b.*,一笔纪录你可以取出a,b的栏位  <br />   <br />  left   join   或right   join   可以表示差集   ，一笔纪录你可以取出a,b的栏位  <br />  full   join才是表示并集，select   *   from   a   full   join   b   on   a.id=b.id  <br />  ,a.id=b.id   为一笔纪录，其他不等的纪录都可以显示，例如a的栏位和null栏位组合，或者null栏位和a组合~  <br />   <br />  另外一个cross   join，如果不加上where条件，就是a的纪录和b的纪录任一组合，加入a有15笔，b有15笔，那么   a   cross   join   b就有225笔，不会有null栏位（当然原来表有另当别论）  <br />   <br />  cross   join加上where   就是inner   join  <br />  select   *   from   a   crossjoin   b   where   a.id   =   b.id等价于select   *   from   a   full   join   b   on   a.id=b.id  <br />   <br />  P.S.   not   in-->select   *   from   a   where   a.id   in   (select   b.id     from   b),*表示a你只可以取出a,b的栏位,not   exists,也是如此，这些其实不算是交集或者差集的讨论的范围，每次只是对一个表的纪录进行选取而已，看这句select   *   from   a   where   a.id   not   in   ('1','2')这个算就不能算是差集  <br />   <br />  2.UNION表示并集，我觉得不可以完全这样讲  <br />  union   和join不一样，union这个运算子是将资料列合并，而join是将栏位合并（我前面所讲）！  <br />  如果从栏位合并来讲，full   join   算是并集，inner   join   算是交集！left   join   或right   join   不完全是差集，也包括交集的结果，具体你的语句的查询结果如何还是要看实际的语句，就如cross   join，加上where就变成inner   join,前后的结果相差甚远  </div><br />网上找了一遍，发现一些新东西：<br />并集 ：union select × from a union （all） select × from b  aUb<br />交集： intersect select × from a intersect select × from b  anb<br />差集： minus select × from a minus select × from b  a-b
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/180711#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 10:12:39 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/180711</link>
        <guid>http://gchuyun.javaeye.com/blog/180711</guid>
      </item>
      <item>
        <title>Hibernate的Lifecycle Validatable 和 Interceptor</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/174228" style="color:red;">http://gchuyun.javaeye.com/blog/174228</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Lifecycle接口包含4个方法:<pre name="code" class="java">
    public boolean onSave(Session s) throws CallbackException;
    public boolean onUpdate(Session s) throws CallbackException;
    public boolean onDelete(Session s) throws CallbackException;
    public void onLoad(Session s, Serializable id);</pre><br />    当在实现了该接口的Entity Class的Object上发生save()等事件时,会先调用相应的on方法,若返回<span style="color: red">true</span>或抛CallbackException时操作中止.<span style="color: red">onLoad()方法在Object加载之后触发</span>.<br />    Validatable接口包含1个方法:<pre name="code" class="java">public void validate() throws ValidationFailure</pre>,该方法在Object持久化之前调用,用于验证数据的正确性.<br />    Interceptor接口用于取代上面2个接口:当pojo实现了接口之后,就不再是pojo,从而可能产生可移植的问题,hibernate提供Interceptor接口解决这个问题.Interceptor接口由具体的interceptor实现,并注入session使用.接口方法如下:<pre name="code" class="java">// 載入物件之前執行
    public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException;

    // flush 時，如果發現有Dirty data，則執行此方法
    public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) throws CallbackException;

    // 儲存物件前執行
    public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException;

    // 刪除物件前執行
    public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException;

    // 在 flush 前執行
    public void preFlush(Iterator entities) throws CallbackException;

    // 在 flush 後執行
    public void postFlush(Iterator entities) throws CallbackException;
 
    // 判斷傳入的物件是否為 transient 狀態
    public Boolean isTransient(Object entity);

    // flush 前呼叫這個方法判斷 Dirty data
    // 傳回Dirty data屬性索引或null採預設行為
    public int[] findDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types);

    // 手動建立實體物件，如果傳回 null，則使用預設的建構方法建立實例
    public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException;

    // 傳回實體名稱
    public String getEntityName(Object object) throws CallbackException;

    // 取得實體物件
    public Object getEntity(String entityName, Serializable id) throws CallbackException;

    // beginTransaction() 之後執行
    public void afterTransactionBegin(Transaction tx);

    // 在事務完成前執行
    public void beforeTransactionCompletion(Transaction tx);

    // 在事務完成後執行
    public void afterTransactionCompletion(Transaction tx);</pre><br />    Interceptor的使用:<pre name="code" class="java">SessionFactory.openSession(Interceptor)//每个session拥有自己的拦截器,不共享
Configuration.setInterceptor(Interceptor)//各个session共享此拦截器</pre><br /><br />参考文章:http://caterpillar.onlyfun.net/Gossip/HibernateGossip/Interceptor.html<br />              http://blog.csdn.net/javacoffe/archive/2007/07/24/1705173.aspx
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/174228#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 17:27:29 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/174228</link>
        <guid>http://gchuyun.javaeye.com/blog/174228</guid>
      </item>
      <item>
        <title>Ubuntu下安装oracle和java字体配置</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/171557" style="color:red;">http://gchuyun.javaeye.com/blog/171557</a>&nbsp;
          发表时间: 2008年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          安装Java及中文字体，解决Java的乱码问题，还有安装oracle 10g<br /><br />我这里都是直接从源里安装，比较方便，适合我这样的懒人，先安装Java，我是直接安装jdk<br /><br />    sudo apt-get install sun-java6-jdk<br />    安装好之后，设置环境变量！<br />    sudo vim /etc/environment<br />    JAVA_HOME="/usr/lib/jvm/java-6-sun"<br />    CLASSPATH=".:$JAVA_HOME/lib:$JAVA_HOME/jre/lib"<br />    在PATH变量后面加上$JAVA_HOME/bin:$JAVA_HOME/jre/bin<br /><br />    复制中文字体到/usr/share/fonts/zh_CN/TrueType中去，如果没有这些目录则自己先建立<br />    cd $JAVA_HOME/jre/lib/fonts<br />    sudo mkdir fallback      ##似乎一定要这个名字,我建了其他名字不起作用.<br />    cd fallback<br />    sudo ln -s /usr/share/fonts/zh_CN/TrueType/simsun.ttf  #将所有中文字体链接过来，将simsun.ttc改成simsun.ttf<br />    sudo mkfontdir<br />    sudo mkfontscale<br />    sudo fc-cache -fv<br /><br />Java装好以后，就来安装oracle 10g，我装的是完整版，先从官方下载sqldeveloper和Oracle 10g的客户端,sqldeveloper是不用安装的，解压之后即可使用，先解压oracle 10g。因oracle 10g不直接支持ubuntu，所以在网上找了一堆资料，反复地安装了几次，记录如下：<br /><br />先作准备工作：   <br /><br />sudo apt-get install rpm alien libxp6<br />sudo ln -s /usr/bin/awk<br /><br />alien是用来将rpm转换成deb格式，我装oracle的时候不记得有没有派上用场，你们可不装试<br /><br />   1. ******************以下步骤可不执行，也能安装************************************   <br />   2.     cd /bin  <br />   3.     sudo ln -s /usr/bin/rpm  <br />   4.     sudo mkdir /var/lib/rpm  <br />   5.     sudo rpm initdb  <br />   6.     sudo rpm rebuilddb  <br />   7. ***************************此步能减少两个错误************************************  <br /><br />   1. ***************伪装成RedHat，Oralce不支持直接在Ubuntu上安装******************  <br />   2.     sudo vim /etc/redhat-release  <br />   3.     输入：Red Hat Linux release 4.1  <br />   4. ****************安装时加入-ignoreSysPrereqs则可跳过这一步*********************  <br /><br />解压客户端，进入目录<br />./runInstaller -jreLoc /usr/lib/jvm/java-6-sun<br />#注意，此步不用sudo执行，另，加-ignoreSysPrereqs则不检查操作系统<br />#安装过程中有一个错误，忽略继续安装即可！   <br /><br />#解决乱码，使用系统自带的jdk及jre即可，进入JAVA_HOME<br />sudo mv jdk jdk.backup<br />sudo mv jre jre.backup<br />sudo ln -s /usr/lib/jvm/java-6-sun jdk<br />sudo ln -s /usr/lib/jvm/java-6-sun/jre jre
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/171557#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 15 Mar 2008 08:22:39 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/171557</link>
        <guid>http://gchuyun.javaeye.com/blog/171557</guid>
      </item>
      <item>
        <title>Ubuntu 下 VirtualBox 安装及网络配制(同事的blog,拿来备份)</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/171437" style="color:red;">http://gchuyun.javaeye.com/blog/171437</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Host interface模式<br />    vim /soft/tap0.sh<br />    sysctl -w net.ipv4.ip_forward=1<br />    sleep 1<br />    iptables -t nat -A POSTROUTING -j MASQUERADE<br />    sleep 1<br />    VBoxTunctl -b -u jacker -t tap0<br />    ifconfig tap0 up<br />    ifconfig tap0 192.168.1.1 netmask 255.255.255.0<br />    chmod 0666 /dev/net/tun<br />    安装客户机，IP设为：192.168.1.X，网关为：192.168.1.1,DNS为主机DNS  <br /><br />    网桥模式，虚拟机之间通信<br />    sudo apt-get install brigde-utils uml-utilities<br />    vim /soft/br0.sh<br />    brctl addbr br0 #增加一个网桥<br />    VBoxTunctl -b -u jacker -t host1 #为jacker用户创建名为host1的网卡<br />    VBoxTunctl -b -u jacker -t guest1<br />    ifconfig br0 192.168.0.1 netmask 255.255.255.0 #配制网桥IP<br />    brctl addif br0 host1<br />    brctl addif br0 guest1    #添加host1及guest1网卡到网桥中去<br />    ifconfig host1 up<br />    ifconfig guest1 up<br />    安装客户机，IP设为：192.168.0.X,网关为：192.168.0.1,DNS为主机DNS
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/171437#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Mar 2008 15:59:56 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/171437</link>
        <guid>http://gchuyun.javaeye.com/blog/171437</guid>
      </item>
      <item>
        <title>ubuntu下用samba实现windows与linux文件共享(同事的blog,拿来备份)</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/171436" style="color:red;">http://gchuyun.javaeye.com/blog/171436</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先要安装samba<br /><br />sudo apt-get install samba<br />sudo apt-get install smbfs<br /><br />1.windows 访问 ubuntu<br />下面我们来共享群组可读写文件夹，<br /><br />A: 可匿名访问，只有读取权限   /home/share<br />B:  授权用户可访问，且可读写  /home/mes<br /><br />首先创建这个两个文件夹<br /><br />代码:<br /><br />mkdir /home/share<br />chmod 755 /home/share<br /><br />mkdir /home/mes<br />chmod 777 /home/mes<br /><br />备份并编辑smb.conf允许网络用户访问<br /><br />代码: sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup<br />sudo vim /etc/samba/smb.conf<br /><br />更改及添加如下代码：<br /><br />[global]<br />#security = user<br />security = share<br />username map = /etc/samba/smbusers   #用户映射文件<br /><br />workgroup = WORKGROUP<br />display charset = UTF-8          <br />unix charset = UTF-8<br />dos charset = cp936<br /><br />然后设定共享：<br /><br />  [share]                         #共享名<br />  path = /home/share   #共享路径<br />  browseable = no         #相当于windows系统中 共享名$<br />  guest ok = yes            #是否允许匿名访问<br />  read only = yes           #只读<br />  writable = no              #是否可写<br /> <br />   [mes]<br />   path = /home/mes<br />   browseable = no<br />   guest ok = no<br />   create mask = 0700<br />   directory mask = 0700<br />   writable = yes<br />   valid users = mes,@mes      #可访问的用户及组，可不加组<br />   write list = mes         #有写入权限的用户<br /><br />到此，设置文件已经结束，接下来就是创建用户<br /><br />sudo useradd mes -s /bin/false -d /home/mes  #没有shell，不可本机登陆（安全起见）<br />sudo smbpasswd -a mes      #设置smb访问密码，这个不是系统密码（上步允许登陆系统的话，还可设定系统密码）。 -a 是添加用户，-x 是删除用户<br /><br />建立用户映射文件<br />sudo vim /etc/samba/smbusers<br />gbmddl = "mes"         #这样就可用gbmddl 用户访问smb共享，给暴力破解系统账号密码增加难度，因gbmddl在系统中根本就不存在<br /><br />然后重启samba，其它用户即可访问<br />sudo /etc/init.d/samba restart<br /><br /> <br /><br />2.Ubuntu linux 系统访问windows xp/2003/2000系统<br /><br />第一种：用smb访问<br />如果在ubuntu linux系统终端pingwindows主机的ip地址可以ping通，且windows计算机中有共享的文件夹，则打开位置下的网络服务器，点击界面中windows网络->workgroup，在workgroup组中就可以看到windows计算机名，双击会弹出输入用户名和密码的对话框，将我们上面设置smb的用户名和密码输入就可以进行访问。<br /><br />第二种：用ubuntu 系统自带的连接到服务器功能访问<br />在位置中启动连接到服务器，在服务类型中选择“windows共享”，在服务器中输入windows计算机的ip地址或计算机名，点击连接，这样在系统桌面中就会显示一个连接到windows 计算机的文件卷。<br />我们可以像访问ubuntu系统中的磁盘一样来访问它，同样在访问的时候要输入smb的用户名和密码。<br /><br />第三种：用mount挂载windows的共享目录到本地磁盘<br />首先要在ubuntu系统中建立一个挂载点，在这里我们建立的挂在点为 /mnt/wind<br />同样在保证网络连接正常，且windows中有共享目录的前提下，进行一下操作<br />以windows的ip为192.168.0.1，共享文件夹为share为例<br />命令如下：<br />mount －t smbfs –o username=wangyh,password=123456 //192.168.0.1/share /mnt/wind<br />有是这样在访问的时候会出现中文乱码的问题，这样我们可以按下面命令来执行，可以解决这个问题<br />mount -t smbfs -o   iocharset=uft8,codepage=cp936,clmask=777,fmask=777,userneme=wangyh,password=123456 //192.168.0.1/share /mnt/wind<br />注解：usename和password都为smb的用户和密码，如果要详细了解mount命令，使用man mount在终端查看详细用法<br />提示：要访问windows中有特殊密码的文件夹，可以在samba中新建一个与windows登录相同名相同密码的用户，然后mount即可，例：<br />sudo useradd administrator //不要让其有登录ubuntu的权限<br />sudo smbpasswd -a administrator<br />然后提示输入密码：输入windows访问的密码即可<br /><br />第四种：使用smbclient 命令<br />命令如下：<br />smbclient //192.168.0.1/share －U wangyh<br />password:输入smb用户wangyh的密码<br />回车就可以用，用命令get下载文件，用put上传文件。<br />注解：<br />smbclient介绍：<br />命令 说明<br />?或help [command] 提供关于帮助或某个命令的帮助<br />![shell command] 执行所用的SHELL命令，或让用户进入 SHELL提示符<br />cd [目录] 切换到服务器端的指定目录，如未指定，则 smbclient 返回当前本地目录<br />lcd [目录] 切换到客户端指定的目录；<br />dir 或ls 列出当前目录下的文件；<br />exit 或quit 退出smbclient<br />get file1 file2 从服务器上下载file1，并以文件名file2存在本地机上；<br />如果不想改名，可以把file2省略<br />mget file1 file2 file3 filen 从服务器上下载多个文件；<br />md或mkdir 目录 在服务器上创建目录<br />rd或rmdir 目录 删除服务器上的目录<br />put file1 [file2] 向服务器上传一个文件file1,传到服务器上改名为file2；<br />mput file1 file2 filen 向服务器上传多个文件
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/171436#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 14 Mar 2008 15:57:47 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/171436</link>
        <guid>http://gchuyun.javaeye.com/blog/171436</guid>
      </item>
      <item>
        <title>Ubuntu 下安装网络打印机(同事的blog,拿来备份)</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/171434" style="color:red;">http://gchuyun.javaeye.com/blog/171434</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先安装cupsys，再安装打印机管理程式，及打印机驱动程式<br />    sudo apt-get install cupsys gnome-cups-manager cupsys-driver-gimpprint<br />    运行打印机管理程式，添加新的打印机<br />    gnome-cups-manager  #也可直接运行gnome-cups-add 来增加新的打印机<br />    先择新增，再选网络打印机（Network Printer)，再选TCP/Socket,HP JetDirect,Raw connection项<br />    Host处输入打印机IP：172.24.75.202,Port默认：9100,之后下一步<br />    选择打印机厂商，这里选HP，在列表框中再选择打印机型号：LaserJet 5100<br />    驱动选择：expert，再下一步就安装好了，可以打印测试页<br />    另：http://localhost:631可进入WEB方式管理打印机，默认不能管理，可以设置/etc/cups/cups.conf<br />    呵呵，想不到安装打印机就这么简单
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/171434#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Mar 2008 15:56:54 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/171434</link>
        <guid>http://gchuyun.javaeye.com/blog/171434</guid>
      </item>
      <item>
        <title>Ubuntu 网络配制方法(同事的blog,拿来备份.)</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/171433" style="color:red;">http://gchuyun.javaeye.com/blog/171433</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          /etc/network/interfaces<br />打开后里面可设置DHCP或手动设置静态ip。前面auto eth0，让网卡开机自动挂载.<br /><br />1. 以DHCP方式配置网卡<br /><br />编辑文件/etc/network/interfaces:<br />sudo vi /etc/network/interfaces<br /><br />并用下面的行来替换有关eth0的行:<br /># The primary network interface - use DHCP to find our address<br />auto eth0<br />iface eth0 inet dhcp<br /><br />用下面的命令使网络设置生效:<br />sudo /etc/init.d/networking restart<br />也可以在命令行下直接输入下面的命令来获取地址<br /><br />sudo dhclient eth0<br /><br />2. 为网卡配置静态IP地址<br /><br />编辑文件/etc/network/interfaces:<br /><br />sudo vi /etc/network/interfaces<br /><br />并用下面的行来替换有关eth0的行:# The primary network interface<br />auto eth0<br />iface eth0 inet static<br />address 172.24.75.47<br />gateway 172.24.75.200<br />netmask 255.255.254.0<br />#network 172.24.74.0<br />#broadcast 172.24.75.255<br />up route add -net 172.24.0.0 gw 172.24.75.254 netmask 255.255.0.0<br />up route add -net 10.10.0.0 gw 172.24.75.254 netmask 255.255.0.0<br />#后面两条是设定路由，开机自己加载<br /><br />将上面的ip地址等信息换成你自己就可以了.用下面的命令使网络设置生效:<br />sudo /etc/init.d/networking restart<br /><br />3. 设定第二个IP地址(虚拟IP地址)<br /><br />编辑文件/etc/network/interfaces:<br /><br />sudo vi /etc/network/interfaces<br /><br />在该文件中添加如下的行:<br />auto eth0:1<br />iface eth0:1 inet static<br />address 192.168.1.60<br />netmask 255.255.255.0<br />network x.x.x.x<br />broadcast x.x.x.x<br />gateway x.x.x.x<br /><br />根据你的情况填上所有诸如address,netmask,network,broadcast和gateways等信息.<br />用下面的命令使网络设置生效:<br />sudo /etc/init.d/networking restart<br /><br />4. 设置主机名称(hostname)<br /><br />使用下面的命令来查看当前主机的主机名称:<br /><br />sudo /bin/hostname<br /><br />使用下面的命令来设置当前主机的主机名称:<br /><br />sudo /bin/hostname newname<br /><br />系统启动时,它会从/etc/hostname来读取主机的名称.<br /><br /><br />5. 配置DNS<br /><br />首先,你可以在/etc/hosts中加入一些主机名称和这些主机名称对应的IP地址,这是简单使用本机的静态查询.<br /><br />要访问DNS 服务器来进行查询,需要设置/etc/resolv.conf文件.<br />假设DNS服务器的IP地址是172.24.75.230, 那么/etc/resolv.conf文件的内容应为:<br /><br />search test.com<br />nameserver 172.24.75.23
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/171433#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Mar 2008 15:54:51 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/171433</link>
        <guid>http://gchuyun.javaeye.com/blog/171433</guid>
      </item>
      <item>
        <title>wine模拟完美世界</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/171430" style="color:red;">http://gchuyun.javaeye.com/blog/171430</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一.安装 wine 和 cabextract<br /><br />1. 终端下：sudo gedit /etc/apt/sources.list<br /><br />添加源：deb http://us.archive.ubuntu.com/ubuntu feisty universe<br />deb http://wine.budgetdedicated.com/apt feisty main<br /><br />2.终端下：sudo apt-get update<br /><br />终端下：sudo apt-get install wine<br /><br />终端下：sudo apt-get install cabextract<br /><br />二.安装wine-ubuntu.deb<br /><br />下载地址：<br />http://www.ubfchina.cn/down/view.asp?id=18<br />下载好双击安装－－在系统工具那找到wine ubuntu快速设置－－执行一次<br /><br />三.安装 Wine Gecko<br /><br />1.下载 Wine Gecko<br />终端输入：<br />wget http://downloads.sourceforge.net/wine/wine_gecko-0.1.0.cab ＆ ＆ cabextract wine_gecko - 0.1.0.cab<br />或者到这里下载:<br />http://forum.ubuntu.org.cn/viewtopic.php?t=96089<br /><br />2.下载好wine_gecko-0.1.0.cab后把它复制到“/.wine/drive_c”目录下<br />这个目录默认是隐藏的,你在你的主文件夹下按ctrl+h就能看到了.wine文件夹了<br /><br />3..终端输入： regedit<br /><br />定位到：HKCU/Software/Wine/MSHTML<br /><br />双击GeckoUrl路径改为：C:\wine_gecko-0.1.0.cab<br /><br />4. 终端输入：wine iexplore http://www.winehq.org<br /><br />当弹出Wine Gecko Instalerl窗口时，点安装就行了<br /><br />成功的话就会出现winehq的主页<br /><br /><br />四.安装ie4linux<br /><br />1.终端下：wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-2.0.tar.gz -O - | tar xvzf -<br /><br />如果这条命令执行不成功，我的是能执行成功的<br /><br />则换这条命令：<br /><br />终端下：wget http://modzer0.cs.uaf.edu/~hardwarehank/files/ies4linux-2.0.tar.gz -O - | tar xvzf -<br /><br />2.然后执行：<br />终端下：cd ies4linux-2.0<br />终端下：./ies4linux<br /><br />3.执行了./ie4linux这个命令后就正式安装了,安装过程中你需要回答几个问题<br />第一个问题是:<br /><br />Welcome, ray! I'm IEs4Linux.<br />I can install IE 6, 5.5 and 5.0 for you easily and quickly.<br />You are just four 'enter's away from your IEs.<br />I'll ask you some questions now. Just answer y or n (default answer is the bold one)<br /><br />这里问你是装IE6还是安装IE5，默认是IE6，直接回车就可以了<br /><br />第二个问题是:<br /><br />Do you want to install IE 5.5 SP2 too? [ y / n ]<br />And do you want to install IE 5.01 SP2? [ y / n ]<br /><br />这里是问你是不是要安装IE5和IE5.5，默认是不装，直接回车跳过<br /><br />第三个问题是:<br /><br />IEs can be installed using one of the following locales:<br />EN-US PT-BR DE FR ES IT NL SV JA KO NO<br />DA CN TW FI PL HU AR HE CS PT RU EL TR<br />Default is . Hit enter to keep it or choose a different one:<br /><br />这是问你安装什么语言，叫你选择一个，我安装的是中文的，所以我输入CN<br />输入CN后直接回车进行安装<br />回车确认后系统自动从微软的网站上下载需要的文件并自动开始安装IE6以及Flash Player 9.下载的过程不算<br />太长，下载结束后会自动安装并配置<br /><br />五.设置wine的启动环境<br /><br />终端输入：winecfg<br /><br />1.选择driver标签<br /><br />在path那输入:<br />(1)/media/sda1(这个是我windows下的C盘XP路径) 点添加<br />(2)/media/cdrom(这个是我光驱的路径) 点添加<br />(3)C:\windows/temp(这个是临时文件夹路径) 点添加<br />(4)C:\windows/system32 点添加<br />(5)../drive_c 点添加<br />(6)C:\windows 点添加<br /><br />注Sad1)和(2)的看个人情况而定，你的XP在windows下那个盘就填那个盘<br />其他的你按照我写的填就可以了<br /><br />2.选择Audio标签<br /><br />这个选项我选择了ALSA，默认的是OSS，但是OSS我的出不了声音的<br />你可以自己试试看那个能出声<br /><br /><br />3.选择Libraries标签<br /><br />在New override for library下拉框中依次输入<br />riched20 添加<br />riched32 添加<br /><br />4.选择Graphics标签<br /><br />把Allow the windows manager to contorl the windows前的勾去掉<br />勾选Emulate a virtual desktop前的勾<br />Desktop size设置为800X600<br /><br />5.确定退出<br /><br />六.完美世界国际版<br /><br />我的游戏是在windows底下装好的<br />你也可以试下在ubuntu下装<br />1.下载游戏<br />下载地址:<br />http://www.w2i.com.cn/<br /><br />2.安装游戏<br />cd进到游戏存放目录<br />执行命令:<br />wine 游戏.exe(名称我忘了)<br /><br />3.运行游戏<br />cd进到游戏安装目录<br />执行命令:<br />wine patch.exe -opengl<br /><br />游戏就能正常运行了
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/171430#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Fri, 14 Mar 2008 15:46:21 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/171430</link>
        <guid>http://gchuyun.javaeye.com/blog/171430</guid>
      </item>
      <item>
        <title>Ubuntu硬盘安装</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/171425" style="color:red;">http://gchuyun.javaeye.com/blog/171425</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ubuntu安裝流程<br />1.把ubuntu-7.10-alternate-i386.iso、initrd.gz、vmlinuz放到硬盤分區上（比如：e盤）。<br />2.解壓grub4dos到c盤，修改boot.ini，添加一行c:\grldr=Grub，重啟。<br />3.操作系統選擇菜單選擇Grub，按c進入命令模式。<br />4.輸入 find ubuntu-7.10-alternate-i386.iso查找鏡像所在盤（比如（hda0，5））。<br />5.輸入 vmlinuz （hda0，5）/vmlinuz<br />	 initrd  （hda0，5）/initrd.gz<br />	 boot<br />6.安裝，拔網線，手動設置網卡。<br />7.按提示裝完基本系統。<br />8.挂載你准備的源文件sourcesl.list所在的盤。比如（sudo mount //172.24.74.20/e$ ~/netshare/20/e -o username=xx,password=xxxx,iocharset=utf8）。<br />9.sudo cp ~/netshare/20/e/sources.list /etc/apt/<br />10.下面可以做成脚本<br />#!/bin/bash<br />apt-get update<br />apt-get upgrade<br />apt-get install x-window-system-core language-pack-zh language-pack-zh-base thunderbird thunderbird-locale-zh-cn openoffice.org tsclient sun-java6-jdk fcitx im-switch xfce4-terminal  htop mousepad fish rar unrar zip unzip<br />im-switch -s fcitx -z default<br />chsh -s /usr/bin/fish<br /><br />常见问题：<br />1.startx显示器显示超出范围：sudo vi /etc/X11/xorg.conf 把 Section "Device" 中的 Driver 换成显卡型号（比如nv）<br />2.没有声音：alsamixer看声卡型号，cat /proc/asound/modules 也是查看当前声卡型号，修改 /etc/modprobe.d/alsa-base ，再最后修改你的声卡的顺序，如<br />   options snd-C index=0<br />   options snd-A index=1<br />   options snd-B index=2<br /><br />常用軟件：<br />1.chm瀏覽 chmsee<br />2.圖片瀏覽 gimmage<br />3.翻譯 stardict<br />4.郵件 thunderbird<br />5.瀏覽器 swiftfox<br />6.文本編輯器 gedit mousepad<br />7.音樂 exaile<br />8.電影 mplayer+kmplayer<br />9.終端 xfce4-terminal<br />10.文件管理器 pcmanfm<br />11.窗口管理器 fluxbox 或 enlightenment<br />12.QQ eva<br />13.eclipse+sqldeveloper
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/171425#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Mar 2008 15:37:56 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/171425</link>
        <guid>http://gchuyun.javaeye.com/blog/171425</guid>
      </item>
      <item>
        <title>Annotation学习笔记</title>
        <author>lingzantia</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gchuyun.javaeye.com">lingzantia</a>&nbsp;
          链接：<a href="http://gchuyun.javaeye.com/blog/171412" style="color:red;">http://gchuyun.javaeye.com/blog/171412</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Annotation是继承自<strong>java.lang.annotation.Annotation</strong>的类,用于向程序分析工具或虚拟机提供package class field methed 等方面的信息,它和其他类没什么区别,除了使用方式.<br />     Annotation的一般形式是 :<pre name="code" class="java">
public @interface MyAnnotation {
    String value() default "hahaha";
} </pre>    <br />     我认为和它等价的java类为:<pre name="code" class="java">
public class MyAnnotation extends java.lang.annotation.Annotation{
     private String value = "hahaha";
     public void setValue(String value){
          this.value = value;
     }
     public String getValue(){
          return value;
      }
}</pre><br />     Annotation的使用方法和Bean的比较:<br /><pre name="code" class="java">
@MyAnnotation(value="hello")     //对应Bean的set方法

Method method = AnnotationTest.class.getMethod("doSomthing", null);   //取得被注释的方法,AnnotationTest.class为该方法所在的类
MyRetention mr = method.getAnnotation(MyRetention.class); //取得注释对象
String value = mr.value();    //取得value的值,对应Bean的get方法.
</pre>     @interface实际上是继承了java.lang.annotation.Annotation,所以定义annotation时不能继承其他annotation或interface.<br />    java.lang.annotation.Retention告诉编译器如何对待 Annotation,使用Retention时,需要提供java.lang.annotation.RetentionPolicy的枚举值.<pre name="code" class="java">
public enum RetentionPolicy {
    SOURCE, // 编译器处理完Annotation后不存储在class中
    CLASS, // 编译器把Annotation存储在class中，这是默认值
    RUNTIME // 编译器把Annotation存储在class中，可以由虚拟机读取,反射需要
} 
</pre>.<br />    java.lang.annotation.Target告诉编译器Annotation使用在哪些地方,使用需要指定java.lang.annotation.ElementType的枚举值.<pre name="code" class="java">
public enum ElementType {
    TYPE, // 指定适用点为 class, interface, enum
    FIELD, // 指定适用点为 field
    METHOD, // 指定适用点为 method
    PARAMETER, // 指定适用点为 method 的 parameter
    CONSTRUCTOR, // 指定适用点为 constructor
    LOCAL_VARIABLE, // 指定使用点为 局部变量
    ANNOTATION_TYPE, //指定适用点为 annotation 类型
    PACKAGE // 指定适用点为 package
} 
</pre><br />    java.lang.annotation.Documented用于指定该Annotation是否可以写入javadoc中.<br />    java.lang.annotation.Inherited用于指定该Annotation用于父类时是否能够被子类继承.<br />如<pre name="code" class="java">
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented  //这个Annotation可以被写入javadoc
@Inherited       //这个Annotation 可以被继承
@Target({ElementType.CONSTRUCTOR,ElementType.METHOD}) //表示这个Annotation只能用于注释 构造子和方法
@Retention(RetentionPolicy.CLASS) //表示这个Annotation存入class但vm不读取
public @interface MyAnnotation {
	String value() default "hahaha";
}
</pre><br />    java.lang.reflect.AnnotatedElement接口提供了四个方法来访问Annotation<pre name="code" class="java">public Annotation getAnnotation(Class annotationType);
public Annotation[] getAnnotations();
public Annotation[] getDeclaredAnnotations();
public boolean isAnnotationPresent(Class annotationType);</pre><br />Class、Constructor、Field、Method、Package等都实现了该接口,可以通过这些方法访问Annotation信息,前提是要访问的Annotation指定Retention为RUNTIME.<br /><br />    Java内置的annotation有Override Deprecated SuppressWarnings.<br />    Override只用于方法,它指明注释的方法重写父类的方法,如果不是,则编译器报错.<br />    Deprecated指明该方法不建议使用<br />    SuppressWarnings告诉编译器:我知道我的代码没问题,你不用吓我了,我不怕的^_^<br />    这些都是Mark Annotation,名称本身就包含了要提供的信息,不需要额外提供.
          <br/>
          <span style="color:red;">
            <a href="http://gchuyun.javaeye.com/blog/171412#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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>Fri, 14 Mar 2008 15:00:57 +0800</pubDate>
        <link>http://gchuyun.javaeye.com/blog/171412</link>
        <guid>http://gchuyun.javaeye.com/blog/171412</guid>
      </item>
  </channel>
</rss>