﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-心情小站-随笔分类-工作日志</title><link>http://www.blogjava.net/RongHao/category/4425.html</link><description>勤学、勤思</description><language>zh-cn</language><lastBuildDate>Sat, 31 May 2008 03:27:51 GMT</lastBuildDate><pubDate>Sat, 31 May 2008 03:27:51 GMT</pubDate><ttl>60</ttl><item><title>failed batch HSQLDB </title><link>http://www.blogjava.net/RongHao/archive/2008/05/30/204166.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 30 May 2008 10:40:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/05/30/204166.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/204166.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/05/30/204166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/204166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/204166.html</trackback:ping><description><![CDATA[今天用hsqldb做单元测试时碰到这么个异常<br />
failed batch; nested exception is java.sql.BatchUpdateException: failed batch<br />
经过检查发现是HSQLDB的问题<br />
The bug is in HSQLDB - a well known one (any Google search for HSQLDB and that "failed batch" <br />
message would have told you it).<br />
https://sourceforge.net/tracker/?func=detail&amp;atid=378131&amp;aid=1407528&amp;group_id=23316<br />
解决方法 : turn off batching with HSQLDB it doesnt work.<br />
设置&lt;prop key="hibernate.jdbc.batch_size"&gt;0&lt;/prop&gt;即可
<img src ="http://www.blogjava.net/RongHao/aggbug/204166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2008-05-30 18:40 <a href="http://www.blogjava.net/RongHao/archive/2008/05/30/204166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用solr搭建你的全文检索</title><link>http://www.blogjava.net/RongHao/archive/2007/11/06/158621.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 06 Nov 2007 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/11/06/158621.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/158621.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/11/06/158621.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/158621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/158621.html</trackback:ping><description><![CDATA[<p><span style="font-size: 9pt; font-family: 宋体;">Solr </span><span style="font-size: 9pt; font-family: 宋体;">是一个可供企业使用的、基于 Lucene 的开箱即用的搜索服务器。对Lucene不熟？那么建议先看看下面两篇文档：</span></p>
<p><span style="font-size: 9pt; font-family: 宋体;">实战</span><span style="font-size: 9pt; font-family: 宋体;">Lucene</span><span style="font-size: 9pt; font-family: 宋体;">，第 1 部分: 初识 Lucene：<a href="http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/">http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/</a></span></p>
<p><span style="font-size: 9pt; font-family: 宋体;">用</span><span style="font-size: 9pt; font-family: 宋体;">Lucene</span><span style="font-size: 9pt; font-family: 宋体;">加速Web搜索应用程序的开发：<a href="http://www.ibm.com/developerworks/cn/web/wa-lucene2/">http://www.ibm.com/developerworks/cn/web/wa-lucene2/</a></span></p>
<p style="margin-left: 25.5pt; text-indent: -25.5pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">一、&nbsp;</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">solr</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">介绍</span></strong></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体; color: #cc0033;">solr</span><span style="font-size: 9pt; font-family: 宋体;">是基于Lucene Java搜索库的企业级全文搜索引擎，目前是apache的一个项目。它的官方网址在<a href="http://lucene.apache.org/solr/">http://lucene.apache.org/solr/</a> 。solr需要运行在一个</span><span style="font-size: 9pt;">servlet
</span><span style="font-size: 9pt; font-family: 宋体;">容器里，例如</span><span style="font-size: 9pt;">tomcat5.5</span><span style="font-size: 9pt; font-family: 宋体;">。</span><span style="font-size: 9pt;">solr</span><span style="font-size: 9pt; font-family: 宋体;">在</span><span style="font-size: 9pt;">lucene</span><span style="font-size: 9pt; font-family: 宋体;">的上层提供了一个基于</span><span style="font-size: 9pt;">HTTP/XML</span><span style="font-size: 9pt; font-family: 宋体;">的</span><span style="font-size: 9pt;">Web Services</span><span style="font-size: 9pt; font-family: 宋体;">，我们的应用需要通过这个服务与</span><span style="font-size: 9pt;">solr</span><span style="font-size: 9pt; font-family: 宋体;">进行交互。</span></p>
<p style="margin-left: 25.5pt; text-indent: -25.5pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">二、&nbsp;</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">solr</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">安装和配置</span></strong></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">关于solr的安装和配置，这里也有两篇非常好的文档，作者同时也</span><span style="font-size: 9pt; font-family: 宋体;">是</span><span style="font-size: 9pt;"> Lucene Java </span><span style="font-size: 9pt; font-family: 宋体;">项目的提交人和发言人：</span></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">使用</span><span style="font-size: 9pt;">Apache Solr</span><span style="font-size: 9pt; font-family: 宋体;">实现更加灵巧的搜索：</span><span style="font-size: 9pt;"><a href="http://www.ibm.com/developerworks/cn/java/j-solr1/index.html">http://www.ibm.com/developerworks/cn/java/j-solr1/index.html</a></span></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt;"><a href="http://www.ibm.com/developerworks/cn/java/j-solr2/index.html">http://www.ibm.com/developerworks/cn/java/j-solr2/index.html</a></span></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">下面主要说说需要注意的地方。</span></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt;">Solr</span><span style="font-size: 9pt; font-family: 宋体;">的安装非常简单，下载</span><span style="font-size: 9pt;">solr</span><span style="font-size: 9pt; font-family: 宋体;">的</span><span style="font-size: 9pt;">zip</span><span style="font-size: 9pt; font-family: 宋体;">包后解压缩将</span><span style="font-size: 9pt;">dist</span><span style="font-size: 9pt; font-family: 宋体;">目录下的</span><span style="font-size: 9pt;">war</span><span style="font-size: 9pt; font-family: 宋体;">文件改名为</span><span style="font-size: 9pt;">solr.war</span><span style="font-size: 9pt; font-family: 宋体;">直接复制到</span><span style="font-size: 9pt;">tomcat5.5</span><span style="font-size: 9pt; font-family: 宋体;">的</span><span style="font-size: 9pt;">webapps</span><span style="font-size: 9pt; font-family: 宋体;">目录即可。注意一定要设置</span><span style="font-size: 9pt;">solr</span><span style="font-size: 9pt; font-family: 宋体;">的主位置。有三种方法。我采用的是</span><span style="font-size: 9pt; font-family: 宋体;">在tomcat里配置java:comp/env/solr/home的一个JNDI指向solr的主目录（example目录下），建立/tomcat55/conf/Catalina/localhost/solr.xml文件。</span></p>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Context&nbsp;</span><span style="color: #ff0000;">docBase</span><span style="color: #0000ff;">="D:/solr.war"</span><span style="color: #ff0000;">&nbsp;debug</span><span style="color: #0000ff;">="0"</span><span style="color: #ff0000;">&nbsp;crossContext</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Environment&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="solr/home"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="java.lang.String"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="D:/solr/solr"</span><span style="color: #ff0000;">&nbsp;override</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Context</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<p style="margin-left: 22.5pt; text-indent: -22.5pt;"><span style="font-size: 9pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; font-family: 宋体;">观察这个指定的solr主位置，里面存在两个文件夹：conf和data。其中conf里存放了对solr而言最为重要的两个配置文件schema.xml和solrconfig.xml。data则用于存放索引文件。</span></p>
<p style="margin-left: 22.5pt; text-indent: -22.5pt;"><span style="font-size: 9pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; schema.xml</span><span style="font-size: 9pt; font-family: 宋体;">主要包括</span><span style="font-size: 9pt;">types</span><span style="font-size: 9pt; font-family: 宋体;">、</span><span style="font-size: 9pt;">fields</span><span style="font-size: 9pt; font-family: 宋体;">和其他的一些缺省设置。</span></p>
<p style="margin-left: 22.55pt;"><span style="font-size: 9pt; font-family: 宋体;">solrconfig.xml</span><span style="font-size: 9pt; font-family: 宋体;">用来配置</span><span style="font-size: 9pt;">Solr</span><span style="font-size: 9pt; font-family: 宋体;">的一些系统属性，例如与索引和查询处理有关的一些常见的配置选项，以及缓存、扩展等等。</span></p>
<p style="margin-left: 22.55pt;"><span style="font-size: 9pt; font-family: 宋体;">上面的文档对这两个文件有比较详细的说明，非常容易上手。注意到</span><span style="font-size: 9pt; font-family: 宋体;">schema.xml</span><span style="font-size: 9pt; font-family: 宋体;">里有一个</span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">uniqueKey</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">url</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">uniqueKey</span><span style="color: #0000ff;">&gt;</span></div>
<p style="margin-left: 22.55pt;"><span style="font-size: 9pt; font-family: 宋体;">的配置，这里将</span><span style="font-size: 9pt;">url</span><span style="font-size: 9pt; font-family: 宋体;">字段作为索引文档的唯一标识符，非常重要。</span></p>
<p style="margin-left: 25.5pt; text-indent: -25.5pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">三、&nbsp;</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">加入中文分词</span></strong></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">对全文检索而言，中文分词非常的重要，这里采用了qieqie庖丁分词（非常不错：））。集成非常的容易，我下载的是2.0.4-alpha2版本，其中它支持最多切分和按最大切分。创建自己的一个中文TokenizerFactory继承自solr的BaseTokenizerFactory。</span></p>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
<br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;IntelliJ&nbsp;IDEA.<br />
<br />
&nbsp;*&nbsp;User:&nbsp;ronghao<br />
<br />
&nbsp;*&nbsp;Date:&nbsp;2007-11-3<br />
<br />
&nbsp;*&nbsp;Time:&nbsp;14:40:59<br />
<br />
&nbsp;*&nbsp;中文切词&nbsp;对庖丁切词的封装<br />
<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ChineseTokenizerFactory&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;BaseTokenizerFactory&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;最多切分&nbsp;&nbsp;&nbsp;默认模式<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;MOST_WORDS_MODE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">most-words</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;按最大切分<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;MAX_WORD_LENGTH_MODE&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">max-word-length</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;mode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setMode(String&nbsp;mode)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(mode</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">||</span><span style="color: #000000;">MOST_WORDS_MODE.equalsIgnoreCase(mode)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">default</span><span style="color: #000000;">"</span><span style="color: #000000;">.equalsIgnoreCase(mode))&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mode</span><span style="color: #000000;">=</span><span style="color: #000000;">MOST_WORDS_MODE;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode))&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mode</span><span style="color: #000000;">=</span><span style="color: #000000;">MAX_WORD_LENGTH_MODE;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IllegalArgumentException(</span><span style="color: #000000;">"</span><span style="color: #000000;">不合法的分析器Mode参数设置:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;mode);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init(Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,&nbsp;String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;args)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.init(args);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMode(args.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">mode</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;TokenStream&nbsp;create(Reader&nbsp;input)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PaodingTokenizer(input,&nbsp;PaodingMaker.make(),<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createTokenCollector());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;TokenCollector&nbsp;createTokenCollector()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;MOST_WORDS_MODE.equals(mode))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MostWordsTokenCollector();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;MAX_WORD_LENGTH_MODE.equals(mode))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MaxWordLengthTokenCollector();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Error(</span><span style="color: #000000;">"</span><span style="color: #000000;">never&nbsp;happened</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">在schema.xml的字段text配置里加入该分词器。</span></p>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">fieldtype&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="text"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="solr.TextField"</span><span style="color: #ff0000;">&nbsp;positionIncrementGap</span><span style="color: #0000ff;">="100"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">analyzer&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="index"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tokenizer&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.ronghao.fulltextsearch.analyzer.ChineseTokenizerFactory"</span><span style="color: #ff0000;">&nbsp;mode</span><span style="color: #0000ff;">="most-words"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.StopFilterFactory"</span><span style="color: #ff0000;">&nbsp;ignoreCase</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;words</span><span style="color: #0000ff;">="stopwords.txt"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.WordDelimiterFilterFactory"</span><span style="color: #ff0000;">&nbsp;generateWordParts</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;generateNumberParts</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;catenateWords</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;catenateNumbers</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;catenateAll</span><span style="color: #0000ff;">="0"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.LowerCaseFilterFactory"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.RemoveDuplicatesTokenFilterFactory"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">analyzer</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">analyzer&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="query"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tokenizer&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.ronghao.fulltextsearch.analyzer.ChineseTokenizerFactory"</span><span style="color: #ff0000;">&nbsp;mode</span><span style="color: #0000ff;">="most-words"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.SynonymFilterFactory"</span><span style="color: #ff0000;">&nbsp;synonyms</span><span style="color: #0000ff;">="synonyms.txt"</span><span style="color: #ff0000;">&nbsp;ignoreCase</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;expand</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.StopFilterFactory"</span><span style="color: #ff0000;">&nbsp;ignoreCase</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;words</span><span style="color: #0000ff;">="stopwords.txt"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.WordDelimiterFilterFactory"</span><span style="color: #ff0000;">&nbsp;generateWordParts</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;generateNumberParts</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;">&nbsp;catenateWords</span><span style="color: #0000ff;">="0"</span><span style="color: #ff0000;">&nbsp;catenateNumbers</span><span style="color: #0000ff;">="0"</span><span style="color: #ff0000;">&nbsp;catenateAll</span><span style="color: #0000ff;">="0"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.LowerCaseFilterFactory"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="solr.RemoveDuplicatesTokenFilterFactory"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">analyzer</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">fieldtype</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">types</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-size: 9pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; font-family: 宋体;">完成后重启tomcat，即可在<a href="http://localhost:8080/solr/admin/analysis.jsp">http://localhost:8080/solr/admin/analysis.jsp</a></span></p>
<p style="margin-left: 18.05pt;"><span style="font-size: 9pt; font-family: 宋体;">体验到庖丁的中文分词。注意要将paoding-analysis.jar复制到solr的lib下，注意修改jar包里字典的home。</span></p>
<p style="margin-left: 25.5pt; text-indent: -25.5pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">四、&nbsp;</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">与自己应用进行集成</span></strong></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">Solr</span><span style="font-size: 9pt; font-family: 宋体;">安装完毕，现在可以将自己的应用与solr集成。其实过程非常的简单，应用增加数据--&gt;</span><span style="font-size: 9pt; font-family: 宋体;">根据配置的字段构建add的xml文档</span><span style="font-size: 9pt; font-family: Wingdings;">--&gt;</span><span style="font-size: 9pt; font-family: 宋体;">post</span><span style="font-size: 9pt; font-family: 宋体;">至solr/update。</span></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">应用删除数据</span><span style="font-size: 9pt; font-family: Wingdings;">&#224;</span><span style="font-size: 9pt; font-family: 宋体;">根据配置的索引文档唯一标识符构建delete的xml文档</span><span style="font-size: 9pt; font-family: Wingdings;">--&gt;</span><span style="font-size: 9pt; font-family: 宋体;">post</span><span style="font-size: 9pt; font-family: 宋体;">至solr/update。</span></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">检索数据</span><span style="font-size: 9pt; font-family: Wingdings;">&#224;</span><span style="font-size: 9pt; font-family: 宋体;">构建查询xml—&gt;get至/solr/select/--&gt;</span><span style="font-size: 9pt; font-family: 宋体;">对solr返回的xml进行处理</span><span style="font-size: 9pt; font-family: Wingdings;">--&gt;</span><span style="font-size: 9pt; font-family: 宋体;">页面展现。</span></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">具体的xml格式可以在solr网站找到。另外就是solr支持高亮显示，非常方便。</span></p>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">关于中文，solr</span><span style="font-size: 9pt; font-family: 宋体;">内核支持</span><span style="font-size: 9pt;">UTF-8</span><span style="font-size: 9pt; font-family: 宋体;">编码，所以在</span><span style="font-size: 9pt;">tomcat</span><span style="font-size: 9pt; font-family: 宋体;">里的</span><span style="font-size: 9pt;">server.xml</span><span style="font-size: 9pt; font-family: 宋体;">需要进行配置</span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Connector&nbsp;</span><span style="color: #ff0000;">port</span><span style="color: #0000ff;">="8080"</span><span style="color: #ff0000;">&nbsp;maxHttpHeaderSize</span><span style="color: #0000ff;">="8192"</span><span style="color: #ff0000;">&nbsp;URIEncoding</span><span style="color: #0000ff;">="UTF-8"</span><span style="color: #ff0000;">&nbsp;&#8230;</span><span style="color: #0000ff;">/&gt;</span></div>
<p style="margin-left: 25.5pt;"><span style="font-size: 9pt; font-family: 宋体;">另外，向solr Post请求的时候需要转为utf-8编码。对solr 返回的查询结果也需要进行一次utf-8的转码。检索数据时对查询的关键字也需要转码，然后用&#8220;+&#8221;连接。</span></p>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">String[]&nbsp;array&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;StringUtils.split(query,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(String&nbsp;str&nbsp;:&nbsp;array)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;URLEncoder.encode(str,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></div>
<img src ="http://www.blogjava.net/RongHao/aggbug/158621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-11-06 18:03 <a href="http://www.blogjava.net/RongHao/archive/2007/11/06/158621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结合spring+hibernate与jdbc的事务</title><link>http://www.blogjava.net/RongHao/archive/2007/10/09/151411.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 09 Oct 2007 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/10/09/151411.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/151411.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/10/09/151411.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/151411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/151411.html</trackback:ping><description><![CDATA[<strong>问题背景</strong>：我们是一家工作流公司，客户采购我们的产品后，将其嵌入其项目中。我们的工作流采用的是&nbsp;&nbsp; spring+hibernate的方式，客户项目则是jdbc直接进行数据库操作。<br />
<strong>问题</strong>：客户在其数据库操作过程中需要调用我们的工作流接口，这样就需要将我们的工作流操作与他们的业&nbsp; 务操作置于同一个事务中。我们的服务采用的都是spring的声明式事务，而客户采用的是对&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection进行事务处理。如何保证事务的一致性？<br />
<strong>想到的解决方案一</strong>：使用jta事务，用tomcat+jotm提供事务管理器。为什么一开始就想到要使用jta事务？？实际上我们和客户都是使用的同一个数据库，为了方便，各自使用了不同的数据库连接方式，使用jta的话确实有bt的意思在里面。但是事实上是我们的第一反应都是jta。最后没有采用该方法的原因也很简单：我没有将jotm配置成功！汗一个。<br />
<strong>想到的解决方案二</strong>：将客户的这些特定代码用spring管理起来。因为要修改客户部分代码，这个方案遭到了客户的强烈反对。于是放弃。<br />
<strong>想到的解决方案三</strong>：客户数据库操作与我们的服务使用同一个数据库连接。然后编程处理事务。存在两种方式：一种是把客户的连接传给我们，另一种则是把我们的连接传给客户。第一种方式对我们的影响太大，所以最后决定采用后一种方式：从hibernate session中获取connection然后传递给客户。接下来查看一下HibernateTemplate的execute()方法，思路就很简单了：获取定义的sessionFactory--&gt;创建一个新的session并打开--&gt;将session与当前线程绑定--&gt;给客户代码返回connection--&gt;打开事务--&gt;客户使用我们传递的connection进行数据库操作--&gt;我们不带声明事务的服务操作--&gt;提交事务--&gt;解除绑定。<br />
<strong>实际要注意的地方是</strong>：1、将session与当前线程绑定使用的TransactionSynchronizationManager.bindResource()方法，这样在HibernateTemplate里才能找到session；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、我们的服务一定要把声明式事务彻底干掉，否则会有commit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、我们服务调用完毕后一定要flush session，否则客户代码不会感知数据库里的数据变化。<br />
最终解决：使用了spring里常用的模板和回调。代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TransactionTemplate&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;Log&nbsp;logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LogFactory.getLog(TransactionTemplate.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;FlushMode&nbsp;flushMode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FlushMode.ALWAYS;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;execute(TransactionCallback&nbsp;callback)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">首先获取sessionFactory</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactory&nbsp;sessionFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(SessionFactory)&nbsp;Framework.getEngine()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getContainer().getComponent(</span><span style="color: #000000;">"</span><span style="color: #000000;">sessionFactory</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建一个新的session并打开</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">Opening&nbsp;single&nbsp;Hibernate&nbsp;Session&nbsp;in&nbsp;TransactionTemplate</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getSession(sessionFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将session与当前线程绑定</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.bindResource(sessionFactory,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SessionHolder(session));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取数据库连接</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.connection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;transaction&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">开始处理事务</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transaction&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;callback.doInTransaction(conn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(RuntimeException&nbsp;ex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doRollback(session,&nbsp;transaction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;ex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Error&nbsp;err)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doRollback(session,&nbsp;transaction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;err;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果数据库操作过程中没有发生异常则提交事务</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transaction.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(WorkflowException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000;">"</span><span style="color: #000000;">数据库操作失败，事务回滚也失败！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;e;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(RuntimeException&nbsp;ex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000;">"</span><span style="color: #000000;">数据库操作失败，事务被回滚！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;ex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Error&nbsp;err)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000;">"</span><span style="color: #000000;">数据库操作失败，事务被回滚！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;err;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;将session与当前线程解除绑定</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.unbindResource(sessionFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doClose(session);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;Session&nbsp;getSession(SessionFactory&nbsp;sessionFactory)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SessionFactoryUtils.getSession(sessionFactory,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FlushMode&nbsp;flushMode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getFlushMode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(flushMode&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setFlushMode(flushMode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;session;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doRollback(Session&nbsp;session,&nbsp;Transaction&nbsp;transaction)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">数据库操作异常，开始回滚事务</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transaction.rollback();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">回滚事务成功！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000;">"</span><span style="color: #000000;">回滚事务失败！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;WorkflowException(</span><span style="color: #000000;">"</span><span style="color: #000000;">回滚事务失败！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doClose(Session&nbsp;session)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">开始关闭连接</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000;">"</span><span style="color: #000000;">关闭连接失败！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;WorkflowException(</span><span style="color: #000000;">"</span><span style="color: #000000;">关闭连接失败！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;FlushMode&nbsp;getFlushMode()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;flushMode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setFlushMode(FlushMode&nbsp;flushMode)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.flushMode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;flushMode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;TransactionCallback&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;doInTransaction(Connection&nbsp;conn);<br />
}</span></div>
调用伪代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;methodA(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionTemplate&nbsp;transactionTemplate</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TransactionTemplate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transactionTemplate.execute(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TransactionCallback(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;doInTransaction(Connection&nbsp;conn)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">客户代码</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.method1(</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">我们代码&nbsp;直接使用</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;our.method2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">客户代码</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.method3(</span><span style="color: #000000;">"</span><span style="color: #000000;">l</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/RongHao/aggbug/151411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-10-09 15:11 <a href="http://www.blogjava.net/RongHao/archive/2007/10/09/151411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>REST个人认知（一）</title><link>http://www.blogjava.net/RongHao/archive/2007/07/11/129662.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Wed, 11 Jul 2007 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/07/11/129662.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/129662.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/07/11/129662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/129662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/129662.html</trackback:ping><description><![CDATA[今天终于有空看看了Fielding的rest论文，没有看完，很多文字确实难懂，但有些还是很有感触的，做个记号。<br>一个<span style="font-weight: bold;">软件架构</span>是一个软件系统在其操作的某个阶段的运行时元素的抽象。<br><span style="font-weight: bold;">架构元素</span>：组件，连接器，数据，配置。<br><span style="font-weight: bold;">架构风格</span>：一组协作的架构约束。<br>一种特定的架构可以由多种架构风格组成。<br><span style="font-weight: bold;">关键关注点的架构属性</span><br><span style="font-weight: bold;">性能</span><br>最佳的应用性能是通过不使用网络而获得的。这意味着对于一个基于网络的应用，最高效的架构风格是在可能的情况下能够将对于网络使用减少到最少的架构风格。<br><span style="font-weight: bold;">可伸缩性</span><br>表示在一个主动的配置中，架构支持大量的组件或大量的组件之间交互的能力。<br><span style="font-weight: bold;">简单性</span><br>对组件之间的功能分配应用分离关注点原则。使得单个的组件足够简单，更容易被理解和实现。<br><span style="font-weight: bold;">可修改性</span><br>基于网络的系统的一个特殊的关注点是动态的可修改性，它要求在对一个已部署的应用做出修改时，无需停止和重启整个系统。包括：可进化性，可扩展性，可定制性，可配置性，可重用性。<br><span style="font-weight: bold;">可见性</span><br>能够通过限制必须使用通用性的接口，或者提供访问监视功能的方法，来影响基于网络的应用中交互的可见性。在这种情况下，可见性是指一个组件对于其他两个组件之间的交互进行监视或仲裁的能力。<br><span style="font-weight: bold;">可移植性</span><br>能够在不同的环境下运行。<br><span style="font-weight: bold;">可靠性</span><br>当在组件、连接器或数据之中出现部分故障时，一个架构容易受到系统层面故障影响的程度。<br> <img src ="http://www.blogjava.net/RongHao/aggbug/129662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-07-11 17:37 <a href="http://www.blogjava.net/RongHao/archive/2007/07/11/129662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver2000下USER表名与系统表重名</title><link>http://www.blogjava.net/RongHao/archive/2007/03/11/103086.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 11 Mar 2007 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/03/11/103086.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/103086.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/03/11/103086.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/103086.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/103086.html</trackback:ping><description><![CDATA[用hibernate做持久层工具，建立User对象，映射到sqlserver的USER表，但在做查询的时候不断的报sql错误，打印hibernate产生的sql语句到sqlserver查询工具执行，报同样的错误。给表名加上[]后sql可以正常执行。例如：select * from USER错误。select * from [USER]正确。开始以为是什么地方配置的问题。因为以前用过达梦数据库，它默认也是必须给表名加[]的，可以通过设置数据库属性解决这个问题。但也没有发现什么配置。后来在SecuritySite群提问，illusion提示是与系统表重名，更改表名后果然正常。于是感到很奇怪：USER这么常用的表名怎么会与系统表重名呢？<br /><img src ="http://www.blogjava.net/RongHao/aggbug/103086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-03-11 11:29 <a href="http://www.blogjava.net/RongHao/archive/2007/03/11/103086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于集群的补课</title><link>http://www.blogjava.net/RongHao/archive/2007/02/12/99560.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 12 Feb 2007 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/02/12/99560.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/99560.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/02/12/99560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/99560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/99560.html</trackback:ping><description><![CDATA[昨天发了个很什么的随笔，今天把与集群有关的东西搜了搜。整理一下。<br />什么是集群，集群的概念。下面这个BLOG讲的非常清楚：<br /><a href="http://blog.csdn.net/ESoftWind/archive/2006/10/19/1341089.aspx">http://blog.csdn.net/ESoftWind/archive/2006/10/19/1341089.aspx</a><br />web层次的集群方案讨论，看完javaeye相关的讨论，你会大概了解：<br /><a href="http://www.javaeye.com/topic/20298">http://www.javaeye.com/topic/20298</a><br />注意里面robbin的无共享架构（Share Nothing Architecture）SNA。<br /><b>web层次的集群主要技术就是：负载均衡和http session的失败转移。</b><br />负载均衡不再多说，焦点在于http session的失败转移。各个节点的http session复制会极大的影响性能。如何避免，robbin提出保持每个节点的无状态性，不再使用Session来保持全局状态。用户标示从cookie取得，假设不使用分布式Cache，session直接放在数据库中。他推荐了memcached作为分布式Cache，这样在从数据库读取session时中间又隔了一层Cache来提高性能。<br /><b>大致的方法是这样：</b>用户登陆的时候给他一个cookie，存放userId，同时给这个用户分配一个Session，存放user对象，然后
把这个session保存到数据库和分布式 Cache里。黏性会话。写一个filter或者
webwork拦截器对用户请求进行拦截，如果他有cookie，但是session里面没有user对象，说明前一个节点down掉了，就根据
cookie里面的userId查数据库或者是分布式
Cache获得先前保存的session，把原先的session复制到他的新session里面。这样各个节点间的 session就不用复制，因为
session是没有状态的。我们的程序对使用session不受影响，只是session里的对象要可序列化，当改变session里的对象时需要同步
到cache和数据库。当然，效率的原因，session里面东西越少越好，越稳定越好。<br />谁有这方面的经验？<br /><img src ="http://www.blogjava.net/RongHao/aggbug/99560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-02-12 23:18 <a href="http://www.blogjava.net/RongHao/archive/2007/02/12/99560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探讨一个可能的大访问量交易网站的开发注意事项</title><link>http://www.blogjava.net/RongHao/archive/2007/02/10/99106.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sat, 10 Feb 2007 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/02/10/99106.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/99106.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/02/10/99106.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/99106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/99106.html</trackback:ping><description><![CDATA[最近要开发一个与拍卖有关的大访问量交易网站。一直做电子政务，对这方面没有任何经验。一开始考虑用php,mysql开发，后来由于觉得和交易相关，数据的一致性和安全一定很重要，最后考虑用java开发。
<br />我不清楚在做这个开发时和平时相比有哪些需要注意的地方，我想到的有：
<br />1.webwork+spring+hibernate这种组合方式是否可行。据说tobao用了ejb，虽说个人并未觉得ejb哪点好，但别人    既然用了就肯定有它的一定道理；
<br />2.数据的缓存肯定是必须的，但哪些是最需要被缓存的数据？
<br />3.dba肯定需要，在没有dba的情况下，涉及数据库时应该注意什么；
<br />4.这样的一个系统，它的性能肯定非常主要。它最有可能的瓶颈会发生在什么地方？
<br />5.我们的理想工期会有多长，3到5个开发人员。
<br />6.jms远程异步调用的支持。
<br />目前想到的大概这些，希望有经验的朋友给些建议。我对这个项目目前还没有很大的把握。<img src ="http://www.blogjava.net/RongHao/aggbug/99106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-02-10 11:41 <a href="http://www.blogjava.net/RongHao/archive/2007/02/10/99106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是JAVA内容仓库(Java Content Repository）(2)</title><link>http://www.blogjava.net/RongHao/archive/2007/01/23/95637.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 23 Jan 2007 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/01/23/95637.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/95637.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/01/23/95637.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/95637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/95637.html</trackback:ping><description><![CDATA[
		<b>内容仓库模型</b>
		<br />JSR-170 是这样定义内容仓库的，内容仓库由一组 workspace（工作空间）组成，这些workspace通常应该包含相似的内容。一个内容仓库有一个到多个 workspace。每个workspace都是一个树状结构，都有一个唯一的树根节点（root node）。树上的item（元素）或者是个node（节点）或者是个property（属性）。每个node都可以有零个到多个子节点和零个到多个子属性。只有根节点没有父节点，其余所有的节点都有一个父节点。property 也必须有一个父节点，但它没有子节点或是子属性，property 是叶子元素。property是真正存储数据的元素。<br /><br />下图描述了一个blog应用程序的内容仓库模型。每个root node（根节点）的子节点都代表了一个blog实体。与这个blog实体有关的数据都存储在 bolgEntry 节点的属性里，其中一个 blogAttachment property 存储了一个二进制图片文件。<br /><img src="http://www.blogjava.net/images/blogjava_net/ronghao/repositorymodel3.gif" alt="repositorymodel3.gif" border="0" height="263" width="550" /><br />根据内容仓库实现的功能，JSR-170定义了三种级别：<br />Level 1：定义了一个只读的内容仓库。功能包括读取内容，将内容导出为XML和查找内容。<br />Level 2：定义了可写的内容仓库。Level 2是Level 1的扩展，新增的功能包括往内容仓库里写入内容，和从XML导入数据到仓库。<br />Advanced options：定义实现五种附加功能，版本控制、JTA、SQL查询、清晰的内容锁定和监视。<br /><br /><b>什么是Apache JackRabbit？</b><br />Apache JackRabbit是一个开放源码的JSR-170 实现，实现了Level 2，但它还有许多扩展的功能。详细可以去它的官方网站。<br /><br />下面我们决定用Apache JackRabbit来作为我们示例程序的内容仓库。<br /><br /><b>如何配置Apache JackRabbit</b><br />JackRabbit需要两个参数来配置一个内容仓库实例。<br />1.内容仓库主目录：这个文件目录下通常包含了所有的内容，搜索索引，内部配置文件和其他持久化信息。它的结构看起来会像下面这个样子：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">   c:</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">temp<br />        </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 0);">|--</span><span style="color: rgb(0, 0, 0);">Blogging<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">repository<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">index<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">meta<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">namespaces<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">nodetypes             <br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">version<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">workspace<br />                        </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                        </span><span style="color: rgb(0, 0, 0);">|--</span><span style="color: rgb(0, 0, 255);">default</span></div><br />  在上面的情况下，内容仓库主目录是c:/temp/Blogging.<br />2.内容仓库配置文件：一个典型的配置文件如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Repository</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">FileSystem </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.fs.local.LocalFileSystem</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/repository</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">FileSystem</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Security appName</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Jackrabbit</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">AccessManager </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.security.SimpleAccessManager</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">LoginModule </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.security.SimpleLoginModule</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">anonymousId</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">anonymous</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">LoginModule</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">Security</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Workspaces rootPath</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/workspaces</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> defaultWorkspace</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">default</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Workspace name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${wsp.name}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">FileSystem </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.fs.local.LocalFileSystem</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${wsp.home}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">FileSystem</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">PersistenceManager <br />        </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.state.db.DerbyPersistenceManager</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">url</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">jdbc:derby:${wsp.home}/db;create=true</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">schemaObjectPrefix</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${wsp.name}_</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">PersistenceManager</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">SearchIndex </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.query.lucene.SearchIndex</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${wsp.home}/index</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">SearchIndex</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">Workspace</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Versioning rootPath</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/version</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">FileSystem </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.fs.local.LocalFileSystem</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/version</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">FileSystem</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">PersistenceManager <br />        </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.state.db.DerbyPersistenceManager</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">url</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">jdbc:derby:${rep.home}/version/db;create=true</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">schemaObjectPrefix</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">version_</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">PersistenceManager</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">Versioning</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">SearchIndex </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.query.lucene.SearchIndex</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/repository/index</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">SearchIndex</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">Repository</span><span style="color: rgb(0, 0, 0);">&gt;</span></div><br />  <br />  在这个配置文件里，&lt;Repository&gt;元素是根元素，它包含了下面这些元素：<br />  <b>a</b>，&lt;FileSystem&gt;: 该元素配置了内容仓库的全局数据存储位置，这些全局数据包括已注册的命名空间，定制的节点类型等等。        JackRabbit 提供了几种选择，一种是像上面例子里配置的存储在本地文件里，LocalFileSystem. 如果你想把它们存储在数据库里，你可以使用 DbFileSystem.<br />  <b>b</b>，&lt;Security&gt;:内容仓库的安全配置，它有两个子元素：&lt;AccessManager&gt;和&lt;LoginModule&gt;。&lt;AccessManager&gt;配置的类用来判断用户有没有权限来对特定数据执行特定的操作。<br />  <b>c</b>，&lt;Workspaces&gt;:这个元素的配置对所有的workspace都通用。它的rootPath 属性是所有workspace文件夹的根目录，在我们的例子里它是c:/temp/Blogging/Workspace；defaultWorkspace 属性则包含了workspace的默认名。<br />  <b>d</b>，&lt;Workspace&gt;:这个元素是所有workspace的默认配置模板。去每个workspace文件夹下你都会发现一个workspace.xml文件，这个文件和这个元素的配置一模一样。三个子元素：&lt;FileSystem&gt;，和这个workspace相关数据的存储位置；&lt;PersistenceManager&gt; ，这个workspace内容节点存储策略；&lt;SearchIndex&gt;，可选，全文检索。<br />  <b>e</b>，&lt;Versioning&gt;:配置一个版本相关的对象。其实JackRabbit也是把它作为节点来处理的。<br /><br />这两个参数可以通过两种方式设置，一种是在仓库实例创建时直接传到Jackrabbit里去，一种是间接的通过设置JNDI object factory。<br />你可以设置org.apache.jackrabbit.repository.home 这个系统属性的值来指定你的内容仓库主目录；也可以设置<br />org.apache.jackrabbit.repository.conf 这个系统属性的值来指定你的内容仓库配置文件repository.xml。如果你不设定这两个<br />参数，Jackrabbit会把当前目录作为内容仓库主目录，同时，它有一个默认的内容仓库配置文件。<img src ="http://www.blogjava.net/RongHao/aggbug/95637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-01-23 23:57 <a href="http://www.blogjava.net/RongHao/archive/2007/01/23/95637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork拦截与common-fileupload冲突</title><link>http://www.blogjava.net/RongHao/archive/2006/11/23/83122.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 23 Nov 2006 14:02:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2006/11/23/83122.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/83122.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2006/11/23/83122.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/83122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/83122.html</trackback:ping><description><![CDATA[CMS包括了网页的发布,在编辑网页内容的时候用到了FCK.网上的教程是很多的.一切刚开始都很顺利.问题出在对图片\FLASH的上传和浏览支持上.对JAVA来说是需要编码的.这里用到了FCK-java.2.2这个包.其实里面除了两个servlet其他的都可以干掉的,似乎用不上它提供的标签.<br />两个servlet里用到了common-fileupload.jar.一切看起来都很不错,可是就是上传不了文件.debug发现common-fileupload得不到fileItem.很是郁闷,因为提供的sample是可以正常跑的.上了common-fileupload的官方网站,才发现是有别的进程拦截request的缘故.于是开始调试.我靠,系统里的过滤器真TM的多,最后是把webwork\webwork-cleanup拦截/*变为*.action这才正常.<br /> 问题:我们真的需要这么多的filter吗?这些filter过滤的范围认真考虑过吗,可以缩小吗?<img src ="http://www.blogjava.net/RongHao/aggbug/83122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2006-11-23 22:02 <a href="http://www.blogjava.net/RongHao/archive/2006/11/23/83122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ibatis DAO 事务探索</title><link>http://www.blogjava.net/RongHao/archive/2006/01/20/28817.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 20 Jan 2006 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2006/01/20/28817.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/28817.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2006/01/20/28817.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/28817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/28817.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ibatis DAO 框架提供了事务管理模块。而这个事务管理可以应用到很多场合，包括JDBC、Hibernate、JTA、SQLMAP等。下面以最简单的JDBC来分析一下其如何实现事务管理。首先来看一段代码：public&nbsp;class&nbsp;OrderService&nbsp;{&nbsp;&nbsp;private&nbsp;DaoManager&nbsp;daoManager;...&nbsp;&nbsp;<a href='http://www.blogjava.net/RongHao/archive/2006/01/20/28817.html'>阅读全文</a><img src ="http://www.blogjava.net/RongHao/aggbug/28817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2006-01-20 17:50 <a href="http://www.blogjava.net/RongHao/archive/2006/01/20/28817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么会重复的造轮子？？</title><link>http://www.blogjava.net/RongHao/archive/2005/12/28/25763.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Wed, 28 Dec 2005 10:19:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2005/12/28/25763.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/25763.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2005/12/28/25763.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/25763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/25763.html</trackback:ping><description><![CDATA[<P>&nbsp;项目终于上线运行了，但是还是问题多多，但还好都不是涉及到逻辑的大问题。这两天把数据备份这块重做了一下，原先是自己写的一个线程池，功能其实就是每天对mysql进行备份（当初设计为什么会把这个功能放到程序里实现？？）。这完全是重复的造轮子！开始是用Jrontab重构了下，后来讨论后决定在程序里把这项功能删除，改在Linux里写个备份脚本。每天的晚上12点进行备份，然后本机一份，ftp到另一台服务器一份。有段时间没操作Linux了，结果好多命令都忘了，寒！为什么会重复的造轮子？？</P><img src ="http://www.blogjava.net/RongHao/aggbug/25763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2005-12-28 18:19 <a href="http://www.blogjava.net/RongHao/archive/2005/12/28/25763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对原有系统进行重构</title><link>http://www.blogjava.net/RongHao/archive/2005/11/15/19933.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 15 Nov 2005 10:04:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2005/11/15/19933.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/19933.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2005/11/15/19933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/19933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/19933.html</trackback:ping><description><![CDATA[最近一直打算对原有的一套业务管理系统进行重构。原因很简单，原来的系统采用的是JSP+JAVABEAN+MYSQL的两层架构，在JSP中直接调用JAVABEAN，并且包含了太多的业务逻辑，在维护的时候很困难。<BR>初步的打算是采用jstl+struts+spring+hibernate。<BR>struts仅仅用于表现层，它的Action中不可以涉及到业务逻辑<BR>最近看了看jbpm的源代码，但是还没有在具体的项目中实践。也决定先不在程序中包含工作流。<img src ="http://www.blogjava.net/RongHao/aggbug/19933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2005-11-15 18:04 <a href="http://www.blogjava.net/RongHao/archive/2005/11/15/19933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat中配置运行jbpm自带的websale </title><link>http://www.blogjava.net/RongHao/archive/2005/11/10/19192.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 10 Nov 2005 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2005/11/10/19192.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/19192.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2005/11/10/19192.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/19192.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/19192.html</trackback:ping><description><![CDATA[<P>1. 从 http://www.jboss.com/products/jbpm/downloads 下载 jbpm-3.0.zip </P>
<P>2. 解压缩 jbpm-3.0.zip 到 'temp' 目录 </P>
<P>3. 使用 eclipse, 将 'temp\jbpm-3.0' 作为 an existing project into workspace 导入 </P>
<P><STRONG>配置连接 MySQL</STRONG> </P>
<P>1. 在 'jbpm-3.0\lib' 目录下 创建 'mysql' 目录 </P>
<P>2. 将 mysql数据库驱动 (mysql-connector-java-3.1.7-bin.jar) 拷贝到 'mysql' 目录 </P>
<P>3. 在 mysql 中创建一个数据库，数据库名字 </P>
<P><DB-NAME>4. 在 'jbpm-3.0\src\resources'目录下创建 'mysql' 目录 </P>
<P>5. 把两个配置文件 (create.db.hibernate.properties, identity.db.xml) 从 'hsqldb' 目录下 拷贝到 'mysql' 目录 </P>
<P>6. 按下面所示编辑 'create.db.hibernate.properties' 文件: hibernate.dialect=org.hibernate.dialect.MySQLDialect <BR><BR>hibernate.connection.driver_class=com.mysql.jdbc.Driver <BR><BR>hibernate.connection.url=jdbc:mysql://localhost:3306/<DB-NAME> <BR><BR>hibernate.connection.username=<USERNAME> hibernate.connection.password=<PASSWORD> <BR><BR>hibernate.show_sql=true hibernate.query.substitutions=true 1, false 0 <BR><BR>hibernate.c3p0.min_size=1 hibernate.c3p0.max_size=3 </P>
<P>7. 另一个文件 'identity.db.xml'不做改动 </P>
<P>8. 在 'jbpm-3.0' 根目录, 编辑ANT的脚本 'build.deploy.xml' 找到 target name="create.db", 删除 db.start, db.stop 在这个目标块中将所有的'hsqldb' 替换为 'mysql' </P>
<P>9. 运行ANT ant create.db -buildfile build.deploy.xml 运行完毕后就会发现mysql中多出很多表，这是jbpm保持状态用的 </P>
<P><STRONG>创建 jbpm.war 使其在tomcat中运行</STRONG> </P>
<P>默认的打war包时，掉了一些库文件 </P>
<P>1. 在 eclipse中, 编辑ant脚本 'build.deploy.xml' 在目标块 target name="build.webapp" 中在</P>
<P>&lt;copy todir="build/jbpm.war.dir/WEB-INF/lib"&gt;<COPY todir="build/jbpm.war.dir/WEB-INF/lib">&nbsp;下将</P>
<P>&lt;fileset dir="build" includes="jbpm-webapp-${jbpm.version}.jar" /&gt; <FILESET dir=build includes="jbpm-webapp-${jbpm.version}.jar" />替换为</P>
<P>&lt;fileset dir="build" includes="jbpm*.jar" /&gt; </P>
<P>&nbsp;<FILESET dir=build includes="jbpm*.jar" />另外加入新的两行</P>
<P>&lt;fileset dir="lib/hibernate" includes="*.jar" /&gt; <BR>&lt;fileset dir="lib/bsh" includes="*.jar" /&gt; </P>
<P><FILESET dir=lib/hibernate includes="*.jar" /><FILESET dir=lib/bsh includes="*.jar" />2.因为 Hibernate 不能将它的SessionFactory与tomcat的jndi 绑定 , 我们直接在源码中修改 </P>
<P>3. 打开源文件 JbpmSessionFactory.java, 在 getInstance() 方法里, 删除下面代码 </P>
<P>InitialContext initialContext = new InitialContext(); Object o = initialContext.lookup(jndiName); </P>
<P>将下面这行 </P>
<P>instance = (JbpmSessionFactory) PortableRemoteObject.narrow<BR>(o, JbpmSessionFactory.class); </P>
<P>替换为 instance = (JbpmSessionFactory) PortableRemoteObject.narrow<BR>(new JbpmSessionFactory(createConfiguration()), JbpmSessionFactory.class); </P>
<P>4.在 createConfiguration(String configResource) 方法里, 注释掉这段代码 </P>
<P>String hibernatePropertiesResource = JbpmConfiguration.getString("jbpm.hibernate.properties"); </P>
<P>if (hibernatePropertiesResource!=null) { Properties hibernateProperties = <BR>new Properties(); </P>
<P>try { hibernateProperties.load( ClassLoaderUtil.getStream(hibernatePropertiesResource) ); } </P>
<P>catch (IOException e) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException<BR>&nbsp;&nbsp; ("couldn't load the hibernate properties from resource&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '"hibernatePropertiesResource"'", e); <BR>} <BR>log.debug("overriding hibernate properties with "+ hibernateProperties); configuration.setProperties(hibernateProperties); <BR>} <BR>同时加入下面的代码 </P>
<P>configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); <BR><BR>configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); <BR><BR>configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/<DB-NAME>";); <BR><BR>configuration.setProperty("hibernate.connection.username", "<USERNAME>"); </P>
<P>configuration.setProperty("hibernate.connection.password", "<PASSWORD>"); </P>
<P>configuration.setProperty("hibernate.connection.pool_size", "15"); </P>
<P>5. 运行脚本命令 ant build ant build.webapp -buildfile build.deploy.xml </P>
<P>6. 将jbpm.war 从 'jbpm-3.0\build' 下拷贝到 'tomcat.home\webapps' </P>
<P>7. 启动 tomcat </P>
<P>8. 打开浏览器 'http://localhost:8080/jbpm' </P><img src ="http://www.blogjava.net/RongHao/aggbug/19192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2005-11-10 17:31 <a href="http://www.blogjava.net/RongHao/archive/2005/11/10/19192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>