<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>神话</title>
    <description>http://ymhh.net/blog/</description>
    <link>http://ymhh.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>svn' containing working copy admin area is missing</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/208363" style="color:red;">http://ymhh.javaeye.com/blog/208363</a>&nbsp;
          发表时间: 2008年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一直使用SVN进行版本控制，环境是：</p>
<p>win2003+myeclipse6+svn1.46</p>
<p>部署到tomcat5.5和weblogic8.1</p>
<p>&nbsp;</p>
<p>问题描述：</p>
<p>eclipse开发过程经常进行自动编译和发布，这导致/web-inf/目录下相关文件夹对应的.svn文件夹被连同删除，导致同步时出现：svn' containing working copy admin area is missing提示。</p>
<p>&nbsp;</p>
<p>解决办法：</p>
<p>浏览SVN仓库目录结构，把工程目录下对应的/web-inf/目录下相关文件全部或部分删除（这里我仅仅删除classes目录），刷新。再进行同步工作，OK。</p>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/208363#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jun 2008 21:04:23 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/208363</link>
        <guid>http://ymhh.javaeye.com/blog/208363</guid>
      </item>
      <item>
        <title>java反编译软件使用：编译大文件class出错</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/143939" style="color:red;">http://ymhh.javaeye.com/blog/143939</a>&nbsp;
          发表时间: 2007年11月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近丢失了几个老旧的java源文件，大概有1M多那么大，</p>
<p>编译后class文件有600k，</p>
<p>结果使用jad反编译回来到到一半就出错了，</p>
<p>提示如下：</p>
<p><img src="http://ymhh.javaeye.com/upload/picture/pic/6291/95689797-8950-4060-8e4b-cefc6418c95c.bmp" alt="" /></p>
<p>反编译得到的.jad文件只有754k，只编译了一半。</p>
<p>&nbsp;</p>
<p>我找了几款反编译软件，同样出现无法反编译的情况。请问还有其他软件可以反编译大class文件吗？</p>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/143939#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 Nov 2007 11:24:07 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/143939</link>
        <guid>http://ymhh.javaeye.com/blog/143939</guid>
      </item>
      <item>
        <title>尽信书不如无书？</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/112021" style="color:red;">http://ymhh.javaeye.com/blog/112021</a>&nbsp;
          发表时间: 2007年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今早看了篇关于重构与注释的讨论，自我感觉和楼主一样，也就是重构里提到的：<br />
<br />
<br />
结果readonly一席话让自己明白了许多：<br />
<div class="quote_title">引用</div>
<div class="quote_div"> <br />
我的桌上正好摆着《重构》，我引用一下： <br />
如何确定该提炼哪一段代码呢？一个很好的技巧是：寻找注释。它们通常是指出[代码用途和实现手法间的语义距离]的信号。<font color="#ff0000"><span style="color: red;">如果代码前方有一行注释，就是在提醒你：可以将这段代码替换成一个函数，而且可以在注释的基础上给这个函数命名。</span></font>就算只有一行代码，如果它需要以注释来说明，那也值的将它提炼到独立的函数去。&mdash;&mdash;《重构》中文版77页 <br />
</div>
<br />
标红的这段翻译得有问题，原文是： <br />
<div class="quote_title">引用</div>
<div class="quote_div"> <br />
How do you identify the clumps of code to extract? A good technique is to look for comments. <br />
They often signal this kind of semantic distance. <font color="#ff0000"><span style="color: red;">A block of code with a comment that tells you <br />
what it is doing can be replaced by a method whose name is based on the comment. </span></font>Even a <br />
single line is worth extracting if it needs explanation. <br />
</div>
<br />
偶觉得这样翻译比较准确：&quot;如果注释是告诉你一段代码在做什么，可将这段代码替换成一个函数，而且可以在注释的基础上给这个函数命名&quot;
<p>Refactoring书上有一段关于注释的解释，可以看出作者对注释的态度，并不是&quot;如果你要加注释，就说明这部分代码需要重构&quot; <br />
</p>
<div class="quote_title">引用</div>
<br />
Comments
<p>Don't worry, we aren't saying that people shouldn't write comments. In our olfactory analogy, <br />
comments aren't a bad smell; indeed they are a sweet smell. The reason we mention comments <br />
here is that comments often are used as a deodorant. It's surprising how often you look at thickly <br />
commented code and notice that the comments are there because the code is bad.</p>
<p>Comments lead us to bad code that has all the rotten whiffs we've discussed in the rest of this <br />
chapter. Our first action is to remove the bad smells by refactoring. When we're finished, we often <br />
find that the comments are superfluous.</p>
<p>If you need a comment to explain what a block of code does, try Extract Method. If the method <br />
is already extracted but you still need a comment to explain what it does, use Rename Method. <br />
If you need to state some rules about the required state of the system, use Introduce <br />
Assertion.</p>
A good time to use a comment is when you don't know what to do. In addition to describing what <br />
is going on, comments can indicate areas in which you aren't sure. A comment is a good place to <br />
say why you did something. This kind of information helps future modifiers, especially forgetful <br />
ones.<br />
<br />
我想首先是有看书的需求，然后看书，信服了书里所说的&mdash;&mdash;以前没想过的、或是因为这是大师所说的，这是书上说的。。。总之信之而不加多思考，于是渐渐融入自己思维之中，形成了一种定势&mdash;&mdash;这是大师说的，这是书上说的&mdash;&mdash;于是就一直这么干了，我想这也许会为自己埋下什么，也许也无妨，但终归埋下了。
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/112021#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Aug 2007 08:58:36 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/112021</link>
        <guid>http://ymhh.javaeye.com/blog/112021</guid>
      </item>
      <item>
        <title>耶鲁CAS Single Sign On</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/89178" style="color:red;">http://ymhh.javaeye.com/blog/89178</a>&nbsp;
          发表时间: 2007年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 耶鲁大学开发的单点登录（Single Sign On）系统称为CAS（Central Authentication Service），是一个独立于平台的，易于理解的开源软件，支持代理功能。Spring Framework的Acegi安全系统支持CAS，并提供了易于使用的方案。</div>
<div><br />
<strong>CAS的设计目标</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l、为多个Web应用提供单点登录基础设施，同时可以为非Web应用但拥有Web前端的功能服务提供单点登录的功能；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、简化应用认证用户身份的流程；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、将用户身份认证集中于单一的Web应用，让用户简化他们的密码管理，从而提高安全性；而且，当应用需要修改身份验证的业务逻辑时，不需要到处修改代码；</div>
<div><br />
<strong>CAS的设计和实现<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CAS（Central Authentication Server）被设计成一个独立的Web应用。它目前的实现是运行在HTTPS服务器上的几个Java Servlet。通过三个URL来访问：Login URL，Validation URL和可选的Logout URL。下图是CAS的单点登录流程示意图：</div>
<div>&nbsp;</div>
<p align="center"><img src="http://starrynight.blogdriver.com/starrynight/inc/cas.gif" height="379" align="middle" onload="javascript: img_auto_size(this,530,true);" alt="点击查看原始大小 530 x 379" width="530" /></p>
<div><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了使用CAS，Web应用重定向它的用户（或简单地创建一个超链接）到Login URL，例如<a href="https://secure.its.yale.edu/cas/servlet/login">https://secure.its.yale.edu/cas/servlet/login</a>。用户也可以手工访问这个URL，如果希望预先验证会话。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Login URL处理初步的认证工作，它提示用户输入NetID和密码，并用Kerberos服务器校验它们是否匹配。为了接下来能自动重新验证用户身份，CAS也 会试图给浏览器回送Cookie（浏览器关闭后会自动过期）。这个Cookie用于识别已经成功登录的用户身份。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用这个可选的Cookie，CAS可以为用户实现对于多个Web应用单点登录的效果。这就是说，用户只需输入一次他的NetID和密码，即可访问任何使 用CAS的资源服务。没有这个Cookie，当Web应用重定向用户到CAS时，用户每次都要输入NetID和密码。（用户也可以通过访问Logout URL，如<a href="https://secure.its.yale.edu/cas/servlet/logout">https://secure.its.yale.edu/cas/servlet/logout</a>，来要求CAS删除这个Cookie。）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了处理初步的身份认证，CAS也记录了用户被重定向时访问的service。可以这样做是因为CAS要求重定向或链接用户到Login URL的Web应用提供一个service的标志符（在上图中记为serviceID）。如果验证成功，CAS创建一个位数很长的随机数（我们称之为 ticket）。CAS把这个ticket和成功登录的用户以及用户要访问的service联系起来。例如，如果用户peon重定向自service S，CAS创建ticket T，这个ticket T允许peon访问service S。这个ticket是个一次性的凭证；它仅仅用于peon，仅仅用于service S，并且只能使用一次，使用之后马上会过期。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一旦完成了初步的身份验证，CAS重定向用户浏览器回到原来的Web应用URL。CAS之所以能记得原来的URL，是因为上面讨论的service ID作为一个&quot;callback URL&quot;。CAS重定向用户的浏览器回到原来的URL，并加上上面讨论的ticket作为请求参数。</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了让讨论更加清楚，考虑下面的例子。假设用户在访问<a href="http://www.yale.edu/tp">http://www.yale.edu/tp</a>之前需要验证身份，我们把用户从<a href="http://www.yale.edu/tp">http://www.yale.edu/tp</a>重定向到下面的Login URL：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://secure.its.yale.edu/cas/servlet/login?service=http://www.yale.edu/tp/authenticate.jsp">https://secure.its.yale.edu/cas/servlet/login?service=http://www.yale.edu/tp/authenticate.jsp</a><br />
JSP页面authenticate.jsp是网站资源的一部分。一旦完成了上面描述的初步身份验证，CAS用下面的URL重定向用户浏览器到这个JSP页面：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.yale.edu/tp/authenticate.jsp?ticket=opaque-ticket-string">http://www.yale.edu/tp/authenticate.jsp?ticket=opaque-ticket-string</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一旦收到请求，authenticate.jsp页面需要校验这个收到的ticket，它把tickect传送Validation URL（如<a href="http://secure.its.yale.edu/cas/servlet/validate">http://secure.its.yale.edu/cas/servlet/validate</a>）。 authenticate.jsp页面需要使用JSSE向Validation URL发送请求并读取数据。当生成这个请求时，authenticate.jsp页面还需要把先前的service ID用service的参数名传送给Validation URL，例子如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://secure.its.yale.edu/cas/servlet/validate?ticket=T&amp;service=S">http://secure.its.yale.edu/cas/servlet/validate?ticket=T&amp;service=S</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当CAS从Validation URL收到这个ticket，它检查自己内部数据库，看看是否保存过这个ticket。如果数据库有这个ticket，则进一步检查数据库中和 ticket关联的service是否和刚收到的service相匹配。如果匹配，则向请求验证身份的应用URL返回NetID；否则拒绝验证这个请求。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Validation URL向请求身份验证的应用URL返回数据的方式很简单。CAS用text/plain的应答方式返回两行数据；第一行是yes或no，取决于 ticket验证是否通过。如果ticket通过验证，第二行则是成功通过身份验证的用户的NetID。如果ticket没有通过验证，第二行为空。例子 如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; peon<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果ticket通过验证，CAS立即删除该ticket，使它以后不能再使用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当完成了身份验证的循环流程，Web应用无需知道用户的密码即可校验用户身份。此外，如果用户浏览器接受Cookie，它将保留一个可用于多次向CAS验 证用户身份的Cookie，让用户以后不用再输入NetID和密码。（目前，这个用于身份验证的Cookie保留8个小时。）<br />
<br />
原文出自：<a href="http://starrynight.blogdriver.com/starrynight/330399.html" target="_blank">耶鲁CAS Single Sign On</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/89178#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Jun 2007 16:33:15 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/89178</link>
        <guid>http://ymhh.javaeye.com/blog/89178</guid>
      </item>
      <item>
        <title>在Struts action中利用.do跳转到另一action传值方法</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/83866" style="color:red;">http://ymhh.javaeye.com/blog/83866</a>&nbsp;
          发表时间: 2007年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          平时在action中利用service处理完业务后，直接通过<br />
return mapping.findForward(&quot;myVIew&quot;);<br />
这样的方法跳转到页面。<br />
<br />
现在遇到了这样一种情形，即在action中service完工后，不需要跳转到页面，而是把当前的结果直接传给另外一个action处理（注：该action是现成的），按上面的做法，是无法传值到下一个action的，搜索了下，可以通过request/session传值，不过简单点可以如下处理：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>Boolean&nbsp;teamUser&nbsp;=&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Boolean&nbsp;doEdit&nbsp;=&nbsp;<span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActionForward(</span><span class="string">&quot;/myaction.do?userid=&quot;</span><span>+userid&nbsp;+&nbsp;</span><span class="string">&quot;&amp;teamUser=&quot;</span><span>+teamUser&nbsp;+&nbsp;</span><span class="string">&quot;&amp;doEdit=&quot;</span><span>+doEdit);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/83866#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 May 2007 12:06:14 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/83866</link>
        <guid>http://ymhh.javaeye.com/blog/83866</guid>
      </item>
      <item>
        <title>spring+hibernate+jotm分布式事务配置总结</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/83853" style="color:red;">http://ymhh.javaeye.com/blog/83853</a>&nbsp;
          发表时间: 2007年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在前段开发的系统中，使用到了两个不同网域的oracle数据库，需要处理之间的事务，于是选择了spring+hibernate+jotm组合，现粘贴我的配置，看看大家有什么更优的配置或写法，谢谢。<br />
<br />
<strong>一、环境及框架</strong><br />
&nbsp;&nbsp; &nbsp; &nbsp; Tomcat+spring+hibernate+jotm，还有就是struts、Oracle等<br />
<strong>二、需求说明</strong><br />
&nbsp;&nbsp; &nbsp;&nbsp; 系统里有2套不同网域的oracle数据库，之间的数据需要进行交互。<br />
<strong>三、Dao配置</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、定义jtom Bean&nbsp;&nbsp; <br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;jotm&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.transaction.jta.JotmFactoryBean&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
&nbsp;&nbsp; &nbsp; &nbsp; 2、定义数据源<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;dataSourceA&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.enhydra.jdbc.pool.StandardXAPoolDataSource&quot;</span><span>&nbsp;</span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">&quot;shutdown&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.enhydra.jdbc.standard.StandardXADataSource&quot;</span><span>&nbsp;</span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">&quot;shutdown&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;jotm&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;driverName&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>oracle.jdbc.driver.OracleDriver</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>jdbc:oracle:thin:@192.168.0.10:1521:A</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;password&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;dataSourceB&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.enhydra.jdbc.pool.StandardXAPoolDataSource&quot;</span><span>&nbsp;</span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">&quot;shutdown&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.enhydra.jdbc.standard.StandardXADataSource&quot;</span><span>&nbsp;</span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">&quot;shutdown&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;jotm&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;driverName&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>oracle.jdbc.driver.OracleDriver</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>jdbc:oracle:thin:@192.168.0.10:1521:B</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;password&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、定义sessionFactory<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;sessionFactoryA&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.orm.hibernate3.LocalSessionFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;dataSourceA&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;mappingDirectoryLocations&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>classpath:/org/testa/hibernate/model/</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernateProperties&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.dialect&quot;</span><span class="tag">&gt;</span><span>org.hibernate.dialect.Oracle9Dialect</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.show_sql&quot;</span><span class="tag">&gt;</span><span>true</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.jdbc.batch_size&quot;</span><span class="tag">&gt;</span><span>50</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.cache.use_query_cache&quot;</span><span class="tag">&gt;</span><span>true</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.cache.provider_class&quot;</span><span class="tag">&gt;</span><span>org.hibernate.cache.EhCacheProvider</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jtaTransactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;jotm&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;lobHandler&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;lobHandler&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;sessionFactoryB&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.orm.hibernate3.LocalSessionFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;dataSourceB&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;mappingDirectoryLocations&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>classpath:/org/testb/hibernate/model/</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernateProperties&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.dialect&quot;</span><span class="tag">&gt;</span><span>org.hibernate.dialect.Oracle9Dialect</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.show_sql&quot;</span><span class="tag">&gt;</span><span>true</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.jdbc.batch_size&quot;</span><span class="tag">&gt;</span><span>50</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.cache.use_query_cache&quot;</span><span class="tag">&gt;</span><span>true</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.cache.provider_class&quot;</span><span class="tag">&gt;</span><span>org.hibernate.cache.EhCacheProvider</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jtaTransactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;jotm&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;lobHandler&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;lobHandler&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、事务管理配置<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;myTransactionManager&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.transaction.jta.JtaTransactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;userTransaction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;jotm&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、dao的配置<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;testADaoTarget&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.testa.hibernate.dao.impl.TestADAO&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;&nbsp;sessionFactoryA&nbsp;&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;testADao&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;proxyInterfaces&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>org.testA.hibernate.dao.ITestADAO</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;interceptorNames&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;testADaoTarget&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;testBDaoTarget&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.testa.hibernate.dao.impl.TestBDAO&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;&nbsp;sessionFactoryB&nbsp;&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;testBDao&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;proxyInterfaces&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>org.testA.hibernate.dao.ITestBDAO</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;interceptorNames&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;testBDaoTarget&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
<strong>四、注意事项</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、spring已经整合了jotm，如果你使用spring自带的jotm，可能会提示某些类找不到，下载一个最新的jotm包，把lib目录里的所有jar包拷贝到lib目录。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、如果系统中使用jndi，则原有的jndi服务可能会无效，提示NameNotFoundException异常，此时在src目录下添加一个carol.properties的属性文件，添加如下内容：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>#&nbsp;do&nbsp;not&nbsp;use&nbsp;CAROL&nbsp;JNDI&nbsp;wrapper&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="attribute">carol.start.jndi</span><span>=</span><span class="attribute-value">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>#&nbsp;do&nbsp;not&nbsp;start&nbsp;a&nbsp;name&nbsp;server&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="attribute">carol.start.ns</span><span>=</span><span class="attribute-value">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#&nbsp;Naming&nbsp;Factory&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="attribute">carol.jndi.java.naming.factory.url.pkgs</span><span>=</span><span class="attribute-value">org</span><span>.apache.naming&nbsp;&nbsp;</span></span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/83853#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 May 2007 11:28:22 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/83853</link>
        <guid>http://ymhh.javaeye.com/blog/83853</guid>
      </item>
      <item>
        <title>javaEye上多数据源配置帖子汇集</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/78497" style="color:red;">http://ymhh.javaeye.com/blog/78497</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>以下是有趣的文章：</p>
<p><br />
</p>
<p>fangang：<a href="http://fangang.javaeye.com/blog/72486" title="永久链接：如何在spring框架中解决多数据源的问题" target="_blank">如何在spring框架中解决多数据源的问题</a></p>
<p>stephen：<a href="http://stephen.javaeye.com/blog/62917" title="永久链接：spring 多数据源解决方案" target="_blank">spring 多数据源解决方案</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/78497#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 May 2007 14:04:55 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/78497</link>
        <guid>http://ymhh.javaeye.com/blog/78497</guid>
      </item>
      <item>
        <title>Dynamic DataSource Routing</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/78489" style="color:red;">http://ymhh.javaeye.com/blog/78489</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="postmetadata"><small> 			Posted on January 23rd, 2007 by <a href="http://blog.interface21.com/main/author/markf/" title="Posts by Mark Fisher">Mark Fisher</a> in <a href="http://blog.interface21.com/main/category/spring/" title="View all posts in Spring" rel="category tag">Spring</a>,  <a href="http://blog.interface21.com/main/category/20/" title="View all posts in 2.0" rel="category tag">2.0</a>,  <a href="http://blog.interface21.com/main/category/data-access/" title="View all posts in Data Access" rel="category tag">Data Access</a>.</small></p>
<div class="entrytext"> 		<!--CHANGED: BEN HALE --><a href="http://blog.interface21.com/main/author/markf/" title="Posts by Mark Fisher"><img title="Mark Fisher" class="author_image" src="http://blog.interface21.com/main/wp-content/images/authors/markf.jpg" alt="Mark Fisher" /></a>
<p> Spring 2.0.1 introduced an <strong>AbstractRoutingDataSource</strong>. I believe that it deserves attention, since (based on frequent questions from clients) I have a hunch that there are quite a few 'home-grown' solutions to this problem floating around. That combined with the fact that it is trivial to implement yet easy to overlook, and now I have several reasons to dust off my corner of the <a href="http://blog.interface21.com/">Interface21 team blog</a>. </p>
<p> The general idea is that a routing <em>DataSource</em> acts as an intermediary - while the 'real' DataSource can be determined dynamically at runtime based upon a lookup key. One potential use-case is for ensuring transaction-specific isolation levels which are not supported by standard JTA. For that, Spring provides an implementation: <em>IsolationLevelDataSourceRouter</em>. Consult its JavaDoc for a detailed description including configuration examples. Another interesting use-case is determination of the DataSource based on some attribute of the current user's context. What follows is a rather contrived example to demonstrate this idea. </p>
<p> First, I created a <em>Catalog</em> that extends Spring 2.0's <em>SimpleJdbcDaoSupport</em>. That base class only requires an instance of any implementation of <em>javax.sql.DataSource</em>, and then it creates a <em>SimpleJdbcTemplate</em> for you. Since it extends <em>JdbcDaoSupport</em>, the <em>JdbcTemplate</em> is also available. However, the &quot;simple&quot; version provides many nice Java 5 conveniences. You can read more detail about that in <a href="http://blog.interface21.com/main/2006/11/27/simplejdbctemplate-spring-20-and-java-5/">this blog</a> by Ben Hale. </p>
<p> Anyways, here's the code for my <em>Catalog</em>:</p>
<div class="codesnip-container">
<div class="codesnip">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;blog.datasource;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.sql.ResultSet;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;java.sql.SQLException;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.List;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.springframework.jdbc.core.simple.ParameterizedRowMapper;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Catalog&nbsp;</span><span class="keyword">extends</span><span>&nbsp;SimpleJdbcDaoSupport&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;List&lt;Item&gt;&nbsp;getItems()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;query&nbsp;=&nbsp;<span class="string">&quot;select&nbsp;name,&nbsp;price&nbsp;from&nbsp;item&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;getSimpleJdbcTemplate().query(query,&nbsp;</span><span class="keyword">new</span><span>&nbsp;ParameterizedRowMapper&lt;Item&gt;()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Item&nbsp;mapRow(ResultSet&nbsp;rs,&nbsp;</span><span class="keyword">int</span><span>&nbsp;row)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;rs.getString(<span class="number">1</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">double</span><span>&nbsp;price&nbsp;=&nbsp;rs.getDouble(</span><span class="number">2</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Item(name,&nbsp;price);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
</div>
</div>
<p> As you can see, the <em>Catalog</em> simply returns a list of <em>Item</em> objects. The <em>Item</em> just contains name and price properties:</p>
<div class="codesnip-container">
<div class="codesnip">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;blog.datasource;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Item&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;name;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;price;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Item(String&nbsp;name,&nbsp;</span><span class="keyword">double</span><span>&nbsp;price)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.price&nbsp;=&nbsp;price;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;name;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;getPrice()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;price;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;toString()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;name&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;(&quot;</span><span>&nbsp;+&nbsp;price&nbsp;+&nbsp;</span><span class="string">&quot;)&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
</div>
</div>
<p> Now, in order to demonstrate multiple DataSources, I created an enum for different Customer types (representing &quot;levels&quot; of membership I guess), and I created three different databases - so that each type of customer would get a distinct item list (I did mention that this would be a contrived example didn't I?). The important thing is that each of the databases are equivalent in terms of the schema. That way the Catalog's query will work against any of them - just returning different results. In this case, it's just the &quot;item&quot; table with 2 columns: name and price. And&hellip; here is the enum:</p>
<div class="codesnip-container">
<div class="codesnip"><span class="kw2">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">enum</span><span>&nbsp;CustomerType&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;BRONZE,&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;SILVER,&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;GOLD&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
</span><span class="br0"></span></div>
</div>
<p> It's time to create some bean definitions. Since I have 3 datasources where everything is the same except for the port number, I created a parent bean so that the shared properties can be inherited. Then, I added the 3 bean definitions to represent the per-CustomerType DataSources:</p>
<div class="codesnip-container">
<div class="codesnip"><span class="sc3"><span class="re1"><bean></bean></span>&nbsp;<span class="re0"></span>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;parentDataSource&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">abstract</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;driverClassName&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;org.hsqldb.jdbcDriver&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;username&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;sa&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;goldDataSource&quot;</span><span>&nbsp;</span><span class="attribute">parent</span><span>=</span><span class="attribute-value">&quot;parentDataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;jdbc:hsqldb:hsql://localhost:${db.port.gold}/blog&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;silverDataSource&quot;</span><span>&nbsp;</span><span class="attribute">parent</span><span>=</span><span class="attribute-value">&quot;parentDataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;jdbc:hsqldb:hsql://localhost:${db.port.silver}/blog&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;bronzeDataSource&quot;</span><span>&nbsp;</span><span class="attribute">parent</span><span>=</span><span class="attribute-value">&quot;parentDataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;jdbc:hsqldb:hsql://localhost:${db.port.bronze}/blog&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;location&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;classpath:/blog/datasource/db.properties&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</span></div>
</div>
<p>Notice that I added a <em>PropertyPlaceholderConfigurer</em> so that I could externalize the port numbers in a &quot;db.properties&quot; file, like so:</p>
<div class="codesnip-container">
<div class="codesnip">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>db.port.gold=</span><span class="number">9001</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>db.port.silver=<span class="number">9002</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>db.port.bronze=<span class="number">9003</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<span class="nu0"></span></div>
</div>
<p> Now things start to get interesting. I need to supply the &quot;routing&quot; DataSource to my <em>Catalog</em> so that it can dynamically get connections from the 3 different databases at runtime based on the current customer's type. As I mentioned, the <em>AbstractRoutingDataSource</em> can be rather simple to implement. Here is my implementation:</p>
<div class="codesnip-container">
<div class="codesnip">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;blog.datasource;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;CustomerRoutingDataSource&nbsp;</span><span class="keyword">extends</span><span>&nbsp;AbstractRoutingDataSource&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;Object&nbsp;determineCurrentLookupKey()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;CustomerContextHolder.getCustomerType();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
</div>
</div>
<p>&hellip;and the <em>CustomerContextHolder</em> simply provides access to a thread-bound <em>CustomerType</em>. In reality, the 'context' would likely hold more information about the customer. Also note that if you are using Acegi, then you could retrieve some information from the userDetails. For this example, it's just the customer &quot;type&quot;:</p>
<div class="codesnip-container">
<div class="codesnip"><span class="kw2">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;CustomerContextHolder&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;ThreadLocal&lt;CustomerType&gt;&nbsp;contextHolder&nbsp;=&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;ThreadLocal&lt;CustomerType&gt;();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCustomerType(CustomerType&nbsp;customerType)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(customerType,&nbsp;<span class="string">&quot;customerType&nbsp;cannot&nbsp;be&nbsp;null&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextHolder.set(customerType);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;CustomerType&nbsp;getCustomerType()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;(CustomerType)&nbsp;contextHolder.get();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;clearCustomerType()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextHolder.remove();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
</span></div>
</div>
<p> Finally, I just need to configure the catalog and routing DataSource beans. As you can see, the &quot;real&quot; DataSource references are provided in a Map. If you provide Strings, they can be resolved as JNDI names (or any custom resolution strategy can be provided - see the JavaDoc). Also, I've simply set the 'bronzeDataSource' as the default:</p>
<div class="codesnip-container">
<div class="codesnip"><span class="sc3"><span class="re1"><bean></bean></span>&nbsp;<span class="re0"></span>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;catalog&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;blog.datasource.Catalog&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;blog.datasource.CustomerRoutingDataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;targetDataSources&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">map</span><span>&nbsp;</span><span class="attribute">key-type</span><span>=</span><span class="attribute-value">&quot;blog.datasource.CustomerType&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">entry</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;GOLD&quot;</span><span>&nbsp;</span><span class="attribute">value-ref</span><span>=</span><span class="attribute-value">&quot;goldDataSource&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">entry</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;SILVER&quot;</span><span>&nbsp;</span><span class="attribute">value-ref</span><span>=</span><span class="attribute-value">&quot;silverDataSource&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">map</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;defaultTargetDataSource&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;bronzeDataSource&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</span></div>
</div>
<p> Of course I'd like to see this working, so I've created a simple test (extending one of Spring's integration test support classes). I added 3 items to the &quot;gold&quot; database, 2 items to the &quot;silver&quot; database, and only 1 item to the &quot;bronze&quot; database. This is the test:</p>
<div class="codesnip-container">
<div class="codesnip"><span class="kw2">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;CatalogTests&nbsp;</span><span class="keyword">extends</span><span>&nbsp;AbstractDependencyInjectionSpringContextTests&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;Catalog&nbsp;catalog;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCatalog(Catalog&nbsp;catalog)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.catalog&nbsp;=&nbsp;catalog;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testDataSourceRouting()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerContextHolder.setCustomerType(CustomerType.GOLD);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Item&gt;&nbsp;goldItems&nbsp;=&nbsp;catalog.getItems();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(<span class="number">3</span><span>,&nbsp;goldItems.size());&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;gold&nbsp;items:&nbsp;&quot;</span><span>&nbsp;+&nbsp;goldItems);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerContextHolder.setCustomerType(CustomerType.SILVER);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Item&gt;&nbsp;silverItems&nbsp;=&nbsp;catalog.getItems();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(<span class="number">2</span><span>,&nbsp;silverItems.size());&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;silver&nbsp;items:&nbsp;&quot;</span><span>&nbsp;+&nbsp;silverItems);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerContextHolder.clearCustomerType();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Item&gt;&nbsp;bronzeItems&nbsp;=&nbsp;catalog.getItems();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(<span class="number">1</span><span>,&nbsp;bronzeItems.size());&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;bronze&nbsp;items:&nbsp;&quot;</span><span>&nbsp;+&nbsp;bronzeItems);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;String[]&nbsp;getConfigLocations()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;String[]&nbsp;{</span><span class="string">&quot;/blog/datasource/beans.xml&quot;</span><span>};&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
</span></div>
</div>
<p>&hellip;and rather than simply taking a screenshot of the green bar, you'll notice I've provided some console output - the results!:</p>
<div class="codesnip-container">
<div class="codesnip"><span class="br0">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>gold&nbsp;items:&nbsp;[gold&nbsp;item&nbsp;#</span><span class="number">1</span><span>&nbsp;(</span><span class="number">250.0</span><span>),&nbsp;gold&nbsp;item&nbsp;#</span><span class="number">2</span><span>&nbsp;(</span><span class="number">325.45</span><span>),&nbsp;gold&nbsp;item&nbsp;#</span><span class="number">3</span><span>&nbsp;(</span><span class="number">55.6</span><span>)]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>silver&nbsp;items:&nbsp;[silver&nbsp;item&nbsp;#<span class="number">1</span><span>&nbsp;(</span><span class="number">25.0</span><span>),&nbsp;silver&nbsp;item&nbsp;#</span><span class="number">2</span><span>&nbsp;(</span><span class="number">15.3</span><span>)]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>bronze&nbsp;items:&nbsp;[bronze&nbsp;item&nbsp;#<span class="number">1</span><span>&nbsp;(</span><span class="number">23.75</span><span>)]&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
</span></div>
</div>
<p> As you can see, the configuration is simple. Better still, the data-access code is not concerned with looking up different DataSources. For more information, consult the JavaDoc for <em>AbstractRoutingDataSource</em>. </p>
<div style="clear: both;"> </div>
</div>
<div class="submain" id="inset">
<h2>Other posts</h2>
<ul>
    <li>02/08/2006: <a href="http://blog.interface21.com/main/2006/08/02/what-are-you-looking-forward-to-in-spring-20/">What are you looking forward to in Spring 2.0?</a></li>
    <li>25/04/2006: <a href="http://blog.interface21.com/main/2006/04/25/message-flow-tracing-with-aspectj-and-jmx/">Message Flow Tracing with AspectJ and JMX</a></li>
    <li>29/11/2006: <a href="http://blog.interface21.com/main/2006/11/29/what-you-have-to-look-forward-to-at-the-spring-experience-2006/">What you have to look forward to at The Spring Experience 2006...</a></li>
    <li>13/08/2006: <a href="http://blog.interface21.com/main/2006/08/13/my-new-home/">Steven's biz.blog has a new home</a></li>
</ul>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/78489#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 May 2007 13:45:29 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/78489</link>
        <guid>http://ymhh.javaeye.com/blog/78489</guid>
      </item>
      <item>
        <title>Dan Pritchett and Randy Shoup: The eBay Architecture</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/78042" style="color:red;">http://ymhh.javaeye.com/blog/78042</a>&nbsp;
          发表时间: 2007年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://netmesh.info/jernst" title="Home" target="_blank"><span class="blogtitle">Johannes Ernst's Blog</span></a></p>
<p>This week, I attended a very interesting presentation by Dan Pritchett and    Randy Shoup, both senior technologists at <a href="http://ebay.com/" target="_blank">eBay</a>,    on eBay's architecture. Some of it was as I would have expected, other things    were, shall we say, counter-intuitive. Here is a random collection of notes, with    some special exclamation marks:</p>
<ul>
    <li>212 million registered users, 1 billion photos</li>
    <li>1 billion page views a day, 105 million listings, 2 petabytes of data, 3 billion API calls a month</li>
    <li>something like a factor of 35 in page views, e-mails sent, bandwidth from June 1999 to      Q3/2006.</li>
    <li>99.94% availability, measured as &quot;all parts of site functional to everybody&quot; vs. at      least one part of a site not functional to some users somewhere</li>
    <li>15,000 application servers, all J2EE. About 100 groups of functionality aka &quot;apps&quot;.      Notion of a &quot;pool&quot;: &quot;all the machines that deal with selling&quot;... Well over 200 databases.</li>
    <li>Everything is planned with the question &quot;what if load increases by 10x&quot;. Scaling      only horizontal, not vertical: many parallel boxes.</li>
    <li>leverages MSXML framework for presentation layer (even in Java)</li>
    <li>Oracle databases, WebSphere Java (still 1.3.1)</li>
    <li>split databases by primary access path, modulo on a key</li>
    <li>every database has at least 3 on-line databases. Distributed over 8 data centers</li>
    <li>some database copies run 15 min behind, 4 hours behind  </li>
    <li><em>no stored procedures. some very simple triggers.</em></li>
    <li>move cpu-intensive work moved out of the database layer to applications applications layer:      <em>referential integrity, joins, sorting done in the application layer</em>!      Reasoning: app servers are cheap, databases are the bottleneck.</li>
    <li>no client-side transactions. no distributed transactions</li>
    <li>J2EE: use servlets, JDBC, connection pools (with rewrite). Not much else.</li>
    <li>no state information in application tier. transient state maintained in cookie or scratch      database</li>
    <li>app servers do not talk to each other -- strict layering of architecture</li>
    <li>Search, in 2002: 9 hours to update the index running on largest Sun box available      -- not keeping up</li>
    <li>Average item on site changes its search data 5 times before it is sold (e.g. price),      so real-time search results are extremely important.</li>
    <li>&quot;Voyager&quot;: real-time feeder infrastructure built by eBay.. Uses reliable multicast      from primary database to search nodes, in-memory search index, horizontal segmentation,      N slices, load-balances over M instances, cache queries</li>
</ul>
<p>There were way more questions by the packed audience of architects and other techies than    there was time. Absolutely worth everybody's time.</p>
<p>Dan put the slides on his <a href="http://www.addsimplicity.com/" target="_blank">blog</a>:    <a href="http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf" target="_blank">eBaySDForum2006-11-29.pdf</a>.</p>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/78042#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 May 2007 20:23:06 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/78042</link>
        <guid>http://ymhh.javaeye.com/blog/78042</guid>
      </item>
      <item>
        <title>五一长假收获</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/78039" style="color:red;">http://ymhh.javaeye.com/blog/78039</a>&nbsp;
          发表时间: 2007年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          往年五一都是出去旅游，今年发生了一些事情，于是留守了。那就学习吧，平时埋头苦干，对一些新东西都生疏了。<br />
<br />
五一学习温习了一些东东：<br />
1、重看了《expert ono-on-one J2EE Development without EJB》。发现以前快速阅读，对某些东东真是一知半解，而平时使用也是墨守成规：（配合手册看，发现很多系统中的用法可以改进的，有些土办法可以非常简单的配置就搞定。<br />
<br />
2、搞定了分布式事务处理问题。系统中包含了2个数据库的操作，研究了一下jotm，搞定。<br />
<br />
3、每天自由的作息，嘿嘿！
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/78039#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 May 2007 19:52:12 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/78039</link>
        <guid>http://ymhh.javaeye.com/blog/78039</guid>
      </item>
      <item>
        <title>JOTM Transactions In Spring And Hibernate</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/74990" style="color:red;">http://ymhh.javaeye.com/blog/74990</a>&nbsp;
          发表时间: 2007年04月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>要处理2个数据库之间事务：</h2>
<h2> JOTM Transactions In Spring And Hibernate</h2>
<a href="http://today.java.net/pub/a/today/2006/08/31/jotm-transactions-in-spring-and-hibernate.html" target="_blank">http://today.java.net/pub/a/today/2006/08/31/jotm-transactions-in-spring-and-hibernate.html</a><br />
<br />
<a href="http://blog.csdn.net/soleghost/archive/2006/10/13/1332443.aspx">使用JOTM实现分布式事务管理(多数据源)</a>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/74990#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Apr 2007 11:52:49 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/74990</link>
        <guid>http://ymhh.javaeye.com/blog/74990</guid>
      </item>
      <item>
        <title>架构师的启蒙战歌</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/70345" style="color:red;">http://ymhh.javaeye.com/blog/70345</a>&nbsp;
          发表时间: 2007年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚看了白衣的文章，很简短，作为努力的方向吧，从这个月来的体会，至少知道了以后自己不该怎么做，该保留一些什么东西。<br />
<br />
<a href="http://forum.springside.org.cn/viewthread.php?tid=1883" target="_blank"><span class="bold">架构师的启蒙战歌</span></a>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/70345#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Apr 2007 20:37:18 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/70345</link>
        <guid>http://ymhh.javaeye.com/blog/70345</guid>
      </item>
      <item>
        <title>一些想法</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/67539" style="color:red;">http://ymhh.javaeye.com/blog/67539</a>&nbsp;
          发表时间: 2007年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>一、学习技术</strong><br />
<br />
以前学某种技术，总是立即google实例，找啊找，找到一个helloword，能运行起来了，欣喜若狂<br />
<br />
现在我想，学一种技术或者某类技术，最好先google或了解相关背景、大环境<br />
<br />
了解技术需求，各种技术各自有什么有缺点，<br />
<br />
比如SOA，也许你会着迷于xfire也许AXIS2，或者其他大厂商的解决方案，如果是我，还是先看看<br />
<br />
大家对SOA起源于什么，满足什么需求，派生了一些什么，现在有哪些方案，有缺点如何<br />
<br />
然后选择其中一种或两种，看看官方文档、运行一些附带例子，然后想想一些可能遇到的问题等等<br />
<br />
<br />
<strong>二、关注对象</strong><br />
<br />
前几天听了技术经历的需求分析的一次培训课，感受颇深，感觉更应该多关注现在的大厂商面对企业<br />
<br />
在想些什么，为什么发布一些技术、制定一些标准，另外也更需要关注现在的企业在想些什么，<br />
<br />
他们遇到了哪些问题，需要解决什么问题，现在有那些方案可以满足他们的需求，效果可能如何等等
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/67539#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Apr 2007 10:00:33 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/67539</link>
        <guid>http://ymhh.javaeye.com/blog/67539</guid>
      </item>
      <item>
        <title>Spring, Hibernate, and XFire</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/64760" style="color:red;">http://ymhh.javaeye.com/blog/64760</a>&nbsp;
          发表时间: 2007年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2> Introduction </h2>
<p> A bit of back story:  </p>
<p> I had to tie in web services to a hibernate-based backend for the upcoming release of <a href="http://wiki.firebright.com/bin/view/Main/FireBright?TWIKISID=9877017e16768177de30f5b325d8fb9b" class="twikiLink">FireBright</a>'s SaaS on Demand platform. The problem: Doing it in such a way that: </p>
<ul>
    <li> doesn't tie me down to a particular platform. </li>
    <li> Offers me maximum flexibility in terms of features </li>
    <li> Doesn't bog down performance. </li>
</ul>
<p> Web services are quite interesting beasts. Not something to be taken lightly, if you consider the implementation that Axis2 provides. That being said, there is another way, privided by the friendly folks at XFire (which, incidentally, is where I found out about <span class="twikiNewLink">FishEye<a href="http://wiki.firebright.com/bin/edit/Main/FishEye?TWIKISID=9877017e16768177de30f5b325d8fb9b;topicparent=Main.SpringHibernateXFire" title="Create this topic" rel="nofollow"><sup>?</sup></a></span>). But, there seems to be a bit of a disconnect.. I've got objects persisted by Hibernate, and those same objects need to be rendered as XML Data, and with over 50 entity types and relationships, I <strong>really</strong> don't want to have to write populators for everything. </p>
<p> Again, introduce XFire. Why? Because it makes this stuff simple. WSDL Generation, auto-typing using aegis or JAXB (PERFECT!), and it even uses jws annotations, so it limits the amount of implementation specific code in my own code. So how this is done. </p>
<p> </p>
<h2><a href="http://wiki.firebright.com/bin/view/Main/SpringHibernateXFire" target="_blank">http://wiki.firebright.com/bin/view/Main/SpringHibernateXFire</a></h2>
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/64760#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 Mar 2007 20:38:14 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/64760</link>
        <guid>http://ymhh.javaeye.com/blog/64760</guid>
      </item>
      <item>
        <title>JBPM3中文手册</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/54548" style="color:red;">http://ymhh.javaeye.com/blog/54548</a>&nbsp;
          发表时间: 2007年02月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.javaeye.com/topics/download/b0f4f927-7ba8-4a5f-b80e-a2b393e66d7d">JBPM3中文手册</a><br />
<br />
忙着搞工作流，这个手册应该提高不少效率。
          <br/>
          <span style="color:red;">
            <a href="http://ymhh.javaeye.com/blog/54548#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Feb 2007 10:23:32 +0800</pubDate>
        <link>http://ymhh.javaeye.com/blog/54548</link>
        <guid>http://ymhh.javaeye.com/blog/54548</guid>
      </item>
      <item>
        <title>数据库设计专业词汇中英对照表</title>
        <author>小天蝎</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ymhh.javaeye.com">小天蝎</a>&nbsp;
          链接：<a href="http://ymhh.javaeye.com/blog/53932" style="color:red;">http://ymhh.javaeye.com/blog/53932</a>&nbsp;
          发表时间: 2007年02月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. Access method（访问方法）：此步骤包括从文件中存储和检索记录。<br />   2. Alias（别名）：某属性的另一个名字。在SQL中，可以用别名替换表名。<br />   3. Alternate keys（备用键，ER/关系模型）：在实体/表中没有被选为主健的候选键。<br />   4. Anomalies（异常）参见更新异常（update anomalies）<br />   5. Application design（应用程序设计）：数据库应用程序生命周期的一个阶段，包括设计用户界面以及使用和处理数据库的应用程序。<br />   6. Attribute（属性）（关系模型）：属性是关系中命名的列。<br />   7. Attribute（属性）（ER模型）：实体或关系中的一个性质。<br />   8. Attribute inheritance（属性继承）：子类成员可以拥有其特有的属性，并且继承那些与超类有关的属性的过程。<br />   9. Base table（基本表）：一个命名的表，其记录物理的存储在数据库中。<br />  10. Binary relationship（二元关系）：一个ER术语，用于描述两个实体间的关系。例如，panch Has Staff。<br />  11. Bottom-up approach（自底向上方法）：用于数据库设计，一种设计方法学，他从标识每个设计组建开始，然后将这些组件聚合成一个大的单元。在数据库设计中，可以从表示属性开始底层设计，然后将这些属性组合在一起构成代表实体和关系的表。<br />  12. Business rules（业务规则）：由用户或数据库的管理者指定的附加规则。<br />  13. Candidate key（候选键，ER关系模型）：仅包含唯一标识实体所必须得最小数量的属性/列的超键。<br />  14. Cardinality（基数）：描述每个参与实体的可能的关系数目。<br />  15. Centralized approach（集中化方法,用于数据库设计）：将每个用户试图的需求合并成新数据库应用程序的一个需求集合<br />  16. Chasm trap（深坑陷阱）：假设实体间存在一根，但某些实体间不存在通路。<br />  17. Client（客户端）：向一个或多个服务器请求服务的软件应用程序。<br />  18. Clustering field（群集字段）：记录总的任何用于群集（集合）航记录的非键字段，这些行在这个字段上有相同的值。<br />  19. Clustering index（群集索引）：在文件的群集字段上定义的索引。一个文件最多有一个主索引或一个群集索引。<br />  20. Column（列）：参加属性（attribute）。<br />  21. Complex relationship（复杂关系）：度数大于2的关系。<br />  22. Composite attribute（复合属性）：由多个简单组件组成的属性。<br />  23. Composite key（复合键）：包含多个列的主健。<br />  24. Concurrency control（并发控制）：在多用户环境下同时执行多个十五并保证数据完整性的一个DBMS服务。<br />  25. Constraint（约束）：数据库不允许包含错误数据的一致性规则。<br />  26. Data conversion and loading（数据转换和加载）：数据库应用生命周期重的一个阶段，包括转换现有数据到新数据库中以及酱下耨应用程序转换到新的数据库上运行。<br />  27. Data dictionary（数据字典）：参见系统目录（system catalog）。<br />  28. Data independence（数据独立性）：使用数据的应用程序的数据描述部分。这意味着，如果将新的数据结构添加到数据库中，或者数据库中现有的结构被修改了，那么使用此数据库的就会受到影响，除非应用程序不直接依赖于被修改的部分。<br />  29. Data model（数据模型）：描述数据、数据间关系以及数据的约束的概念的一个集成的集合。<br />  30. Data redundancy（数据冗余）：参见冗余数据（redundant data）。<br />  31. Data security（数据安全）：包括对数据库对象（如表和视图）的访问和使用以及用户可以在这些对象上实施的操作。<br />  32. Database（数据库）：是逻辑上相关的数据（以及这些数据的描述）的一个共享的集合，用于解决公司对信息的需求。<br />  33. Database design（数据库设计）：数据库应用生命周期中的一个阶段，包括创建一个支持公司的操作和目标的数据库的设计。<br />  34. Database integrity（数据库完整性）：指存储数据的正确定和一致性。完整性通常用约束来表达。<br />  35. Database Management System，DBMS（数据库管理系统）：一个能够让用户定义、创建和维护数据库并控制对数据库的访问的软件系统。<br />  36. Database planning（数据库规划）：能尽可能有效的实现数据库应用的各阶段的管理活动。<br />  37. Database server（数据库服务器）：同服务器。<br />  38. DBMS engine（DBMS引擎）：同服务器。<br />  39. DBMS selection（DBMS选择）：数据库应用生命周期中的一个阶段，包括选择一个合适的DBMS来支持数据库应用。<br />  40. Degree of a relationship（关系的度）：一个关系中参与的实体的个数。<br />  41. Denormalization（反规范化）：形式上，这个术语指的是对基本表结构的修改，这样新的表比原始的表的规范化程度要低。但也可以用此属于更宽泛地形容将两个表和并成一个新表的情形，而这个新表与原来的表具有相同的范式，但比原表包含更多的空值。<br />  42. Derived attribute（派生属性）：表示其值可以从一个相关属性和属性集的值派生得到的属性，这个属性在实体中不是必须的。<br />  43. Design methodology（设计方法学）：一种结构化的方法，它使用过程、工具和文档来支持和简化设计过程。<br />  44. Disjoint constraint（无连接约束）：描述子类的成员间的关系，并指明超类某个成员是否有可能成为一个或多个子类的成员。<br />  45. Domain（域）：一个或多个属性的取值范围。<br />  46. Entity（实体）：具有相同性质的对象的集合，它是由用户或公司标识并可独立存在的。<br />  47. Entity integrity（实体完整性）：在一个基本表中，主健列的值不能为空。<br />  48. Entity occurrence（实体出现）：实体中的一个唯一可标识的对象。<br />  49. Entity-Relationship model（实体关系模型）：公司的实体、属性和关系的详细逻辑表示。<br />  50. Fact-finding（事实发现）：使用诸如面谈和提问等技术收集关于系统的事实、需求和性能的形式化过程。<br />  51. Fan trap（扇形陷阱）：但从第三个实体扇出的两个实体有1:*关系时出现扇形陷阱，但这两个实体在他们之间应该有直接关系以提供必要的信息。<br />  52. Field（字段）：同元组（Tuple）。<br />  53. File（文件）：存储在副主存储器中的相关记录的一个命名集合。<br />  54. File-based system（基于文件的系统）：一个文件集合，用来管理（创建、插入、删除、更新和检索）一个或多个文件中的数据，并产生基于这些文件中的数据的应用（通常是报表）。<br />  55. File organization（文件组织）：当文件存储在磁盘上时，对文件中的记录的安排方式。<br />  56. First normal form（1NF，第一范式）：表中的每个列的交叉处以及记录包含切进包含一个值的表。<br />  57. Foreign key（外健）：一个表中的一个列或者多个列的集合，这些列匹配某些其他（也可能是同一个）表中的候选键。<br />  58. 4GL, Fourth-Generation Language（第四代语言）：一种非过程化语言，比如SQL，他只需要用户定义必须完成什么操作，4GL负责将所进行的操作翻译成如何实现这些操作。<br />  59. Full functional dependency（完全函数依赖）：一个列在功能上依赖于复合主健，但不依赖于主健的任何一个子集的条件。<br />  60. Functional dependency（函数依赖）：描述表中列之间的关系。<br />  61. Generalization（泛化）：通过标识实体间的公共特征使实体间差别最小化的过程。<br />  62. Generalization hierarchy（泛化层次结构）：同类型层次（type hierarchy）。<br />  63. Global data model（全局数据模型）：代表整个公司（和被模型化的公司的一部分）的数据模型。<br />  64. Implementation（实现）：数据库应用生命周期中的一个阶段，包括数据库和应用程序设计的物理实现。<br />  6