<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>sdiablo</title>
    <description>菠萝菠萝蜜</description>
    <link>http://sdiablo.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>看了微软的surface，感觉微软真的要退出舞台了。</title>
        <author>sdiablo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sdiablo.javaeye.com">sdiablo</a>&nbsp;
          链接：<a href="http://sdiablo.javaeye.com/blog/205062" style="color:red;">http://sdiablo.javaeye.com/blog/205062</a>&nbsp;
          发表时间: 2008年06月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          点触科技实在是太奇妙。肯定在不久的将来成为主流。<br /><a href="http://www.microsoft.com/surface/index.html" target="_blank">http://www.microsoft.com/surface/index.html</a><br /><br />但是，iphone已经是很成熟的产品了。除了微软擅长的桌面操作系统，谁还会需要视频里的那个傻傻的吧台？<br /><br />引用：<br />云中漫步——迎接云计算时代的到来<br /><a href="http://kaifu163tech.blog.163.com/blog/static/543812702008416443171/" target="_blank">http://kaifu163tech.blog.163.com/blog/static/543812702008416443171/</a><br />李开复：云时代微软想要鱼与熊掌兼得很困难<br /><a href="http://tech.qq.com/a/20080521/000022.htm" target="_blank">http://tech.qq.com/a/20080521/000022.htm</a><br /><br />苹果的战略：<br />ibook - ipod - iphone<br />google的战略:<br />搜索 - gmail - blog、wiki、gmap - android<br />几乎google所有的服务都能在手机上流畅使用。<br /><br />从硬件的环境来看，手持设备已经足够成熟。<br />从软件环境来看，网络就是计算机已经深入人心。<br />从公司的发展来看，Google超过微软成全球第一品牌，苹果也越来越红。<br /><br />剩下微软，点触里面还硬要塞上个吧台。<strong>除开给桌面操作系统的存在提供理由外，那个吧台还剩下什么意义？</strong>除了那个与现实脱钩的超大的屏幕外，里面所有的功能，都能在手持系统上有优秀的表现。<br /><br />点触在手持系统的应用肯定会大放异彩。<br /><br />看看google的战略，也许以后的战争会发生在苹果和google之间。封闭的苹果对上开放的android。
          <br/>
          <span style="color:red;">
            <a href="http://sdiablo.javaeye.com/blog/205062#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/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, 18 Jun 2008 11:24:17 +0800</pubDate>
        <link>http://sdiablo.javaeye.com/blog/205062</link>
        <guid>http://sdiablo.javaeye.com/blog/205062</guid>
      </item>
      <item>
        <title>在SpringSide实现XFire Webservice认证--原作david.turing</title>
        <author>sdiablo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sdiablo.javaeye.com">sdiablo</a>&nbsp;
          链接：<a href="http://sdiablo.javaeye.com/blog/149845" style="color:red;">http://sdiablo.javaeye.com/blog/149845</a>&nbsp;
          发表时间: 2007年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          XFire官方网站提供的基于Webservice认证的例子有问题，在新版本的XFire1.1.2中编译不通过，不过这也是小Case，我后来折腾了一下，为SpringSide提供了一个简单的Webservice认证功能。<br />XFire跟Spring的天然融合，让我们可以少努力10年就能简单地在Spring中使用Webservice的强大魅力，我从AXIS专向XFire有一些冲动，也吃了不少亏，但受REST一族的强力吹捧，感觉还是值得尝试的，因此，在公司的系统中也把Axis彻底换了XFire。<br /><br />回到SpringSide，我大概介绍一下如何配置一个真正实用的XFire验证服务。<br />SpringSide中的XFire配置文件放在：<br />SpringSide-bookstore\src\org\springside\bookstore\plugins\webservice\applicationContext-webservice-server.xml<br />我们在里面定义各个Webservice，该文件其实对应于XFire官方的XFire-Servlet.xml<br />看看下面的BookService，这是一个典型的Webservice服务，红色的inHandlers是我挂上去的。它的意思是所有访问BookService的请求都会被先送到authenticationHandler去处理，我们的验证逻辑可以在里面进行。<br /><pre name="code" class="java">    &lt;!--Web Service 在SpringMVC中的URL 路径映射-->
    &lt;bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        &lt;property name="mappings">
            &lt;value>/BookService=bookWebService&lt;/value>
        &lt;/property>
        &lt;property name="inHandlers">
            &lt;ref bean="authenticationHandler"/>
        &lt;/property>
    &lt;/bean></pre><br /><br />我们接着看看authenticationHandler的代码：<br />我们在SpringSide中通过header方式向服务器提供验证信息（另外一种更简单的方式是创建一个Login的webservice服务，然后在XFire Session中建立Token信息）。<br /><pre name="code" class="java">package org.springside.bookstore.plugins.webservice.authentication;

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.exchange.InMessage;
import org.codehaus.xfire.fault.XFireFault;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;


/**
* XFire的回调的Handler，在XFire配置文件中配置
* Server端的认证模块，回调处理模块
* 
* ClientAuthHandler跟AuthenticationHandler要一起用，或者都不用
* 
* @author  david.turing
* @blog  openssl.blogjava.net
*
*/
public class AuthenticationHandler extends AbstractHandler {
    private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
    
    public void invoke(MessageContext context) throws Exception {
        
        log.info("#AuthenticationHandler is invoked");
        InMessage message=context.getInMessage();
        
        final Namespace TOKEN_NS = Namespace.getNamespace("SpringSide","http://service.webservice.plugins.bookstore.springside.org");  
        
        if(message.getHeader()==null)
        {
            throw new XFireFault("GetRelation Service Should be Authenticated",
                    XFireFault.SENDER);
        }
        
        Element token = message.getHeader().getChild("AuthenticationToken", TOKEN_NS);
        if (token == null)
        {
            throw new XFireFault("Request must include authentication token.",
                                 XFireFault.SENDER);
        }

        String username = token.getChild("Username", TOKEN_NS).getValue();
        String password = token.getChild("Password", TOKEN_NS).getValue();

        System.out.println("username="+username);        
        System.out.println("password="+password);
        
        if(username==null||password==null)
            throw new XFireFault("Supplied Username and Password Please",
                    XFireFault.SENDER);
        
        /**
         * 检查用户名密码是否正确
         */
        PasswordAuthenticationManager pamanager=new PasswordAuthenticationManager();
        if(!pamanager.authenticate(username,password))
            throw new XFireFault("Authentication Fail! Check username/password",
                    XFireFault.SENDER);

        
    }
}</pre>注意，XFireFault异常是往客户端抛的，Webservice Client应该学会catch XFireFault.<br /><br />服务器端就是这么简单，看看客户端的TestCase<br /><pre name="code" class="java">package org.springside.bookstore.plugins.webservice.service;

import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.util.List;

import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.springside.bookstore.commons.domain.Book;
import org.springside.bookstore.plugins.webservice.authentication.ClientAuthHandler;

import junit.framework.TestCase;

public class BookServiceWithAuthenticationTestCase extends TestCase {

    protected void setUp() throws Exception {
        super.setUp();
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }
    
    public void getBookFromWebservice() throws Exception{
    
          Service serviceModel = new ObjectServiceFactory()
                .create(BookService.class);
        BookService service = null;
        
        try {
            service=(BookService) new XFireProxyFactory().create(
                    serviceModel,
                    "http://localhost:8080/springside/service/BookService");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        
        Client client = ((XFireProxy) Proxy.getInvocationHandler(service)).getClient();
        //挂上ClientAuthHandler，提供认证
        client.addOutHandler(new ClientAuthHandler());
        List list = service.findBooksByCategory(null);
        assertNotNull(list);
        for(int i=0;i&lt;list.size();i++)
            System.out.println(((Book)list.get(i)).getName());
    }

}</pre><br />你应该看到上面的client.addOutHandler(new ClientAuthHandler());<br />没错，它跟服务器端的AuthenticationHandler是一对，一起使用的！<br />也就是，每个被送往WebService服务的请求都被ClientAuthHandler处理过了。<br />看看ClientAuthHandler做了些什么：<br /><pre name="code" class="java">package org.springside.bookstore.plugins.webservice.authentication;

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;

/**
* 客户端端的认证模块，回调处理模块
* 每个需要认证的WebService方法都可以挂这个Handler
* 
* 仅用于Demo，从解耦和易用性出发，
* 没有跟Acegi结合，你可以任意扩展
* 默认用户名/密码是admin/admin
* 
* ClientAuthHandler跟AuthenticationHandler要一起用，或者都不用
* 
* @author  david.turing
*
* @blog openssl.blogjava.net
*/    
public class ClientAuthHandler extends AbstractHandler {
        private static final Logger log = Logger.getLogger(ClientAuthHandler.class);
        
        //客户端自己配置用户名密码或者更安全的KeyStore方式
        private String username = "admin";
        private String password = "admin";
        
        public ClientAuthHandler() {
        }
        
        public ClientAuthHandler(String username,String password) {
            this.username = username;
            this.password = password;
        }
        
        public void setUsername(String username) {
            this.username = username;
        }
        
        public void setPassword(String password) {
            this.password = password;
        }
        
        public void invoke(MessageContext context) throws Exception {
                        
            /*******************************************
             * Soap Header方式
             * 从Soap Header中获取用户名密码
             *******************************************/
            final Namespace ns = Namespace.getNamespace("SpringSide","http://service.webservice.plugins.bookstore.springside.org");  
            Element el = new Element("header",ns);

            Element auth = new Element("AuthenticationToken", ns);
            Element username_el = new Element("Username",ns);
            username_el.addContent(username);
            Element password_el = new Element("Password",ns);
            password_el.addContent(password);
            auth.addContent(username_el);
            auth.addContent(password_el);
            el.addContent(auth);            
            context.getCurrentMessage().setHeader(el);            
            log.info("ClientAuthHandler done!");
        }
    }</pre><br />不就是往header里面注入username,password！<br /><br />在SpringSide中，所有的Spring配置文件都被小白分散到各个Module中去了，Wuyu原先是在Plugin中提供Webservice功能，因此，我仍然在Plugin中创建XFire接口。<br />SpringSide的Spring配置文件放在:<br />SpringSide-bookstore\webapp\WEB-INF\springmvc-servlet.xml<br />该文件定义了Plugin的xml:<br />AuthenticationHandler这个Bean需要先定义在Plugins-servlet.xml中，其它很简单，大家去Try一下就知道了。
          <br/>
          <span style="color:red;">
            <a href="http://sdiablo.javaeye.com/blog/149845#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/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/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>Fri, 21 Dec 2007 09:04:50 +0800</pubDate>
        <link>http://sdiablo.javaeye.com/blog/149845</link>
        <guid>http://sdiablo.javaeye.com/blog/149845</guid>
      </item>
      <item>
        <title>hibernate与数据库建模--原作robbin</title>
        <author>sdiablo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sdiablo.javaeye.com">sdiablo</a>&nbsp;
          链接：<a href="http://sdiablo.javaeye.com/blog/148913" style="color:red;">http://sdiablo.javaeye.com/blog/148913</a>&nbsp;
          发表时间: 2007年12月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          其实围绕Hibernate的话题，我都已经说过不下30遍，以致于最近两年以来，我对所有Hibernate的问题都不愿意再回应。另外最近一年多来，使用Rails的ActiveRecord，让我对ORM的认识又加深了很多，其实对于那么多争议的问题，最好的解决办法就是自己去实践。对于自己没有去实践过的东西，争是争不出来什么的。<br /><br /><br /><div class="quote_title">引用</div><div class="quote_div">1、以数据库为中心建模 VS 以领域模型为中心建模： <br />老开发人员大多倾向于前者，因为比较符合过去的开发习惯，另外他们强调数据库的生命周期大于App <br />向我这样的只有几年工作经验的往往会倾向于后者，因为这能更充分发挥ORM的威力，更符合OO，免去很多维护DB的繁琐工作。</div> <br /><br /><br />数据库设计三大范式如雷贯耳，但作为非科班出身的我直到两个月前竟然都不知道三大范式究竟是什么。那么三大范式是什么？<br /><br /><div class="quote_title">引用</div><div class="quote_div">第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整型、实数、字符型、逻辑型、日期型等。<br /><br />第二范式（2NF）：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。<br /><br />第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在"A → B → C"的决定关系，则C传递函数依赖于A。</div><br /><br />两个月前当我购买了一本《MySQL权威指南》，翻到三大范式的定义的时候，我内心巨震，三大范式简单总结一句就是消除冗余，单纯依赖关系。不允许数据库表出现冗余字段，不允许表之间多重依赖，因此符合三大范式设计的数据库模型其实和你按照面向对象思想去建模得到的数据库模型是一样的。<br /><br />所以不论你是从数据库为中心建模，还是你以领域模型为中心建模，你应该最终得到一个一致的数据库模型。之所以导致数据库建模和OO建模的不一致，是因此传统的数据库建模从来都是违背三大范式的。而我们在过去经常说的一句话就是：为了数据库查询性能，我们需要多加一些冗余字段，不一定非要遵循三大范式......<br /><br />所以不要再说什么数据库设计和面向对象设计导致的数据模型冲突的话，不是他们冲突，是你违背了三大范式，自己制造出来的冲突。<br /><br /><div class="quote_title">引用</div><div class="quote_div">2、Hibernate VS iBatis/JDBC： <br />担心失去对SQL待控制权，导致不能做优化，DBA反对 <br />Hibernate是在JDBC之上的又一层框架，因此想当然的认为其性能不如iBatis/JDBC（我认为这个结论不成立，因为引入一个ORM层给了我们更多机会去优化性能，比如一二级缓存、lazyload、查询缓存，并且方式更优雅）。参考为什么ORM性能比iBATIS好？ <br />担心OpenSessionInView模式有性能问题（http://www.javaeye.com/topic/17501） <br />Hibernate无法应付复杂查询（我认为这不是问题，HQL和criteria查询能力很强，再不济还可以用SQL啊）</div><br /><br />JavaEye网站的数据库设计是面向对象为中心的设计，但是拿三大范式来衡量，大部分设计都是吻合的，而我们的数据库缓存命中率在90%左右。缓存服务器的流量是数据库服务器流量的2.5倍之多。事实上我们有很多地方的查询尽量避免join，宁可让他n+1，这样速度反而更快，缓存命中率更高。<br /><br />例如我们现在把帖子的内容字段拆分出来，单独放在一个post_texts表里面。这样posts表实际上只有35MB，而post_texts表有1GB。每次显示一个post，都会用主键去load post_text，命中缓冲。不需要查数据库，不需要去碰那个1GB的大表。<br /><br />要充分发挥ORM的缓存优势，就必须把表设计的尽量细颗粒度，消除冗余和多重依赖，最终可能是相当多的小表，表之间通过主外键关联，但是关联关系都是单一的。那么这种追求面向对象的数据库模型是非常符合三大范式的。
          <br/>
          <span style="color:red;">
            <a href="http://sdiablo.javaeye.com/blog/148913#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/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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Dec 2007 16:20:54 +0800</pubDate>
        <link>http://sdiablo.javaeye.com/blog/148913</link>
        <guid>http://sdiablo.javaeye.com/blog/148913</guid>
      </item>
      <item>
        <title>hiebrnate有哪些沟壑--原作Qieqie</title>
        <author>sdiablo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sdiablo.javaeye.com">sdiablo</a>&nbsp;
          链接：<a href="http://sdiablo.javaeye.com/blog/148910" style="color:red;">http://sdiablo.javaeye.com/blog/148910</a>&nbsp;
          发表时间: 2007年12月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>hiebrnate有哪些沟壑</strong>： <br />1、Session是本次使用到的持久对象的容器，并内在使用jdbc的connection派发sql <br />2、Session的生命周期，不同的应用可能有不同的策略，是一次数据操作一个Session，或一个用户请求共享同一个Session? <br />后者可能使用到了Open Session In View Filter/Interceptor.或hibernate3的sessionFactory.getCurrentSession() <br />3、对象与容器的几种关系，以及如何转化？同样Id的对象是否可以有多个copy在容器中？ <br />4、session flush是什么意思，什么时候会(自动)flush <br />5、load或object的many-to-one可能会用到proxy，这是什么意思?lazy-loading与此有关。 <br />6、hibernate对集合的理解和处理 <br />7、hibernate对cascade的理解和处理 <br />。。。<br /><br /><strong>hibernate有哪些局限</strong>：1、session是一个容器，一次session装载过多object，会爆棚=>解决之道：evict, bulk operation <br />2、session总是装载一个对象的所有属性列，如果该属性数目够大(>50)，会对性能有所影响=>解决之道：对类或表列进行适当分拆 <br />3、session默认总是对持久对象建立snapshot，所以1个对象将占用2倍的空间。=>一般这个不造成问题，除非是以上 1 的情况 <br />。。。<br /><br /><strong>hibernate"奇怪"的地方</strong>： <br />1、save/perist一个对象时，为什么有的对象立即发送一个insert语句，有的不是： <br />这和主建策略有关，程序自己assign的主键，hibernate不会立即发送insert，其他的会<br /><br />2、设置了join策略，但对query查询无效 <br />对对象的某个to-one的属性设置join策略只load/get或nav到该对象时有效，query查询无效，哪怕该查询只返回一个对象。<br /><br />3、修改对象时候，为什么抛出错误： <br />在Session的生命周期内，已经被Session管理的对象的数据库更新语句会自动被hibernate检测在必要的时候发送。 <br />所以，程序没有必要调用dao.update/object.update(in active record pattern)的方法。如果调用了dao.update方法，则会抛出该错误。<br /><br />4、那为什么同样的程序我调用就是错误，别人update就可以调用，而且必须调用才会更新到数据库？ <br />那是因为“别人”的session周期很短，和“我自己”使用的Session周期策略不一样，他调用update时所使用的session已经不是前一句load/get/query该对象后的session。 <br />也有可能是“别人”update的对象和刚才load/get/query出来的对象是同一个对象(==返回true)，此时update方法是多余的，但是调用了也不会发生错误(update的意思是：将一个还没有被给定session管理的detached对象交给session管理，但是如果该对象本来已经被session管理了，session也不会抛出错误) <br />5、不想更新某个数据，但是hibernate却自动给我更新到数据库，真是想不到： <br />一个对象如果被Session管理(之前从session load/get/query出来或该对象被update到session后)，如果该对象的属性变更了，这会被hibernate检测到，会自动被派发update sql，所以不要去更新他的值，如果本意不是要把“更新持久化”到数据库的话。 <br />。。。<br /><br /><strong>小心： <br />二级缓存 总是要特别的注意，这是一个大策略，不是API级别的决定。</strong><br /><br />以上观点均被本人实践过，也仅为片面摘要。
          <br/>
          <span style="color:red;">
            <a href="http://sdiablo.javaeye.com/blog/148910#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/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/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>Mon, 17 Dec 2007 16:14:43 +0800</pubDate>
        <link>http://sdiablo.javaeye.com/blog/148910</link>
        <guid>http://sdiablo.javaeye.com/blog/148910</guid>
      </item>
  </channel>
</rss>