??xml version="1.0" encoding="utf-8" standalone="yes"?>
配置需求说?/h2>
在工作中,目需要实现多U程序配|方?每种E序配置均有各自的文件复?变量替换(替换文本文g中的变量占位W?,修改脚本文g的需? 为减重复代?化配|实?我们实现了此配置框架.需求片断示?
需求分?/h2>
从上q需求来?W一印象是用ANT或类ANT XML文g可以很好的满上述需? 但是q需要做下面增强才会好用:
实现?/h2>
Ҏ上述分析,目最l的XML配置文g格式如下:
<root>
<common>
<resource-bundle>ResourceBundle Message Class</resource-bundle>
<variables>
<!-- If contains CONFIG_XINFO ,copy it to PLATCODE -->
<variable name="PLATCODE" value="${CONFIG_XINFO}">
<condition>
<varexists name="CONFIG_XINFO" />
</condition>
</variable>
<!-- Give it a default value -->
<variable name="IS_WINDOWS" value="FALSE" />
<variable name="IS_WINDOWS" value="TRUE">
<condition>
<or>
<variable name="PLATCODE" value="windows"/>
<variable name="PLATCODE" value="windows64"/>
</or>
</condition>
</variable>
</variables>
</common>
<configure>
<action-invoke
class="CustomizedActionClass"
index="1"
/>
<action-copy
file="${Source File Variable}"
dest="${Dest file Variable}"
index="60"
reason="Error Reason Key"
/>
<action-write
file="${File to Write}"
index="20"
reason="Error Reason Key"
><![CDATA[QUALDIR=${QUALDIR}
]]></action-write>
<action-expand
file="${File to be expanded}"
index="30"
/>
</configure>
</root>
配置框架依次Ҏ个要执行的动作调用performAction动作,如果当前Actionq回p|错误?则对已经成功执行的Action反向依次调用 performCompensation动作,执行回滚操作,从而保证配|过E的一致? 如果全部成功,则依ơ调用performComplete操作,释放占用的时资?如下?
决问?,我们为每个action指定了一个index,用它规定执行序,配置框架从公共配|文件和U有配置文g中合qƈ排序所有的配置 action, 通过预先分配common action和private action的index范围, 每个单独的配|过E可以完全抽出重复配|动?
决问?, 每个action,每个变量定义(property 标记) 都可以有自己的condition 定义. 如此一?配置文g的写法更cM于程序的执行q程,从开发角度也更加自然.
其它Ҏ?脚本文g自动分析和插入配|行
应用服务器的启动脚本是用户可定制?我们无法预见文g格式. 册个问?我们采用了如下方?
ȝ
本文介绍了一U多文g操作配置框架的思\,q具体解释类事务的配|动作实现过E? 该配|框架在目实践中达C预期目的,收到不错的效?
]]>
最q在目中面临中文全文检索的需求,关键需求如下:
1 支持中文、英文字词的全文索,待检索文本是古文a文?br>2 全文索表辑ּ支持Q?AND,OR,NOT,NEAR,BEFORE q算W,支持()?br>3 速度要求Q?00M文本Q要求在2-5U内能够索完毕?br>
试Lucene以及攑ּ原因Q?/h3>
在尝试Lucene和不同的中文Analyzer后,l告攑ּ?br>原因如下Q?br>׃待检索文本是古文Q中文分词技术无法派上用场。在分隔存储每个汉字后Q发CLucene中检索到的文本远q少于关键字实际匚w的文本,q一问题对于较长的检索关键字其明显?br>因ؓ对于索准程度要求很高,故此攑ּQ但是Lucene出的q个问题的原因尚不清楚,希望能够有h提出解答?br>
自行实现中文全文索原理以及方法:
1 构徏q程Q忽略标点符P自行计算每个汉字在每个文本文件中的偏U量Qƈ保存?br>2 索过E,定位每个汉字的偏U量Q如果检索表辑ּ中每个汉字的预期偏移量与实际偏移量吻合,则匹配成功?br>3 采用 MappedByteBuffer 加快索速度Q采用二分查扑֊快偏U量匚w速度Q?个左右的关键字复合检索能够在1U内完成匚wQ要求操作系l有_大的~存Q?br>
目前实现的一些局限和优势Q?/h3>
0 中文索速度_Q准度比Lucene高(如果有高手能够解册个问题,我会很高兴的废弃掉这些类的)
1 合适于中文Q不适用英文文本
2 全文索烦引文件与原始文本文g的大大Uؓ2:3-3:4之间Q?00M大小Q比Lucene大约?0M?br>3 索引文g的构建时间长Q?00M大约需?时Q同时由于如果Q何文本文件更斎ͼ都需要重新构建烦引文Ӟ
因此不合适要l常变化的文本烦引?br>
全文索代码示?TestFullTextQuery.java)Q?br>File storeDir = new File("C:\\temp\\fulltext\\index");
StoreSearcher searcher = new StoreSearcher(storeDir);
String str = "??& 阉K"; //同时出现 "?? ?"阉K"Q??代表L字符
searcher.queryBegin(str, true);
while(true){
StoreSearcherResult ssr = searcher.getNextQueryResult();
if ( ssr == null ){
break;
}
System.out.println("ID "+ssr.docId+":"+ssr.matchedCount);
}
searcher.queryEnd();
searcher.close();
q行l果
ID T01n0001.TXT:320
ID T01n0002.TXT:3
ID T01n0004.TXT:2
ID T01n0005.TXT:202
ID T01n0006.TXT:131
....
附:全文索表辑ּ举例
关键字中间可以出?Q表明匹配Q意字W?br>
q算W名Uͼq算W字W?br>AND:&
OR:,
BEFORE:*
NEAR:+
NOT:-
表达式D例:
(KEY1 <AND|OR|BEFORE|NEAR> KEY2) & (NOT KEY3)
KEY1 KEY2 (关键字之间无q算W假设ؓAND)
附:全文索文件格式信?br>
DocInfoStore(文档信息)
--HEAD--
DocCount:Integer 文档数目
--DOC HEAD(PER DOC)--
DocSeq: Integer 文档序P内部使用
DocId: Char[128] 文档唯一IDQ字W串格式
DocSepOfs: Integer 文档分隔W数l的Ofs
--DOC SEP OFS(PER DOC)--
DocOfs: ArrayOfInteger 文档分隔数组
WordInfoStore(每个汉字信息)
--HEAD--
WordCount:Integer 汉字?br>--WORD IDX(Per Word)--
WordChar:Integer 汉字的Unicode?br>WordInfoOfs:Integer 汉字信息在文件中的偏U量
WordInfoSize:Integer 汉字信息大小
--WORD INFO(Per Word)--
DocCount: 汉字出现的文档数
DocSeq(Per Doc): 每个文档的顺序号
WordInDocs:ArrayOfInteger 每个文档中出现的汉字的偏ULl,从小到大排列
源文件及CLASS下蝲地址Q?br>http://m.tkk7.com/Files/zhugf000/foreader2_ftsearch.zip
]]>
模式名称 | 启用Q禁?br /> | ~省启用 | 说明 |
UNIX_LINES | (?d)启用Q??-d)用 | ?br /> | 启用Unix行模式?br />在此模式下,只有 '\n'被认为是行结束符。它会媄?tt>., ^, ?$ 的行为?br /> |
CASE_INSENSITIVE | (?i)启用Q??-i)用 | ?br /> | 启用忽略大小写模式?br />~省Ӟ忽略大小写模式只会媄?ASCII字符的匹配?而Unicode范围的忽略大写匚w需要通过 UNICODE_CASE 标志与本标志联合使用?br />启用此模式会影响匚w性能?br /> |
COMMENTS | (?x)启用Q??-x)用 | ?br /> | 允许I格和注释出现在正则表达式中?br />在此模式下,I格被忽略,?开始的单行注释被忽略? |
MULTILINE | (?m)启用Q??-m)用 | ?br /> | 启用多行模式?br />In multiline mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the input sequence. By default these expressions only match at the beginning and the end of the entire input sequence. |
DOTALL | (?s)启用Q??-s)用 | ?br /> | ?可以匚w行结束符?br />在此模式下,元字W?tt>.可以匚w行结束符。缺省不允许如此匚w?br /> |
UNICODE_CASE | (?u)启用Q??-u)用 | ?br /> | Enables Unicode-aware case folding. When this flag is specified then case-insensitive matching, when enabled by the CASE_INSENSITIVE flag, is done in a manner consistent with the Unicode Standard. By default, case-insensitive matching assumes that only characters in the US-ASCII charset are being matched. 启用此模式会影响性能?br /> |
CANON_EQ | (?c)启用Q??-c)用 | ?br /> | Enables canonical equivalence. When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression "a\u030A", for example, will match the string "?" when this flag is specified. By default, matching does not take canonical equivalence into account. 启用此模式会影响性能?br /> |
正则表达式字W串 | 匚w的字W串 |
X | 字符XQ包?CJK ExtB 区汉?br /> |
\\ | 反斜杠\ |
\0n | 八进?n代表的字W?0<=n<=7) |
\0nn | 八进?nn代表的字W?0<=n<=7) |
\0mnn | 八进?mnn代表的字W?0<=m<=3,0<=n<=7) |
\xhh | 十六q制 0xhh所代表的字W?br /> |
\uhhhh | 十六q制 0xhhhh所代表的字W?font color="#ff0000">注意Q目前尚不支持CJK ExtB区汉字?br /> |
\t | 制表W?'\u0009') |
\n | 换行('\u000A') |
\r | 回R('\u000D') |
\a | 响铃W?'\u0007') |
\e | 取消WEscape('\001B') |
\cx | x所代表的控制字W?br /> |
正则表达式字W串 | 匚w的字W串 |
XY | X后面跟随Y |
X|Y | X或?i>Y |
(X) | X作ؓ分组表达?br /> |
正则表达式字W串 | 匚w的字W串 |
\n | W?b>n个匹配的分组 |
边界字符 | 匚w的字W串 |
^ | 行首 |
$ | 行末 |
\b | 字符边界 |
\B | 非字W边?br /> |
\A | 输入的开?br /> |
\G | 上次匚w的结束处 |
\Z | 输入的l束Q或者是最后一个行l束W,参见行结束符?br /> |
\z | 输入的l束 |
正则表达式字W串 | 匚w的字W串 |
X? | X重复一ơ,或者不重复 |
X* | X重复0ơ或多次 |
X+ | X重复1ơ或多次 |
X{n} | X重复nơ,不多也不?br /> |
X{n,} | X臛_重复n?br /> |
X{n,m} | X臛_重复nơ,臛_重复mơ?br /> |
正则表达式字W串子集 | 匚w的字W串 | l合方式 |
[abc] | 字符a,b或cQ包?CJK ExtB 区汉?br /> | 单子?br /> |
[^abc] | L非a,b或c的字W?br /> | 排除 |
[a-zA-Z] | 从a到zQ或者A到ZQ包含a,z,A,Z?br /> | 区间 |
[a-d[m-p]] | 从a到dQ或者m到pQ等于[a-dm-p]?br /> | 联合 |
[a-z&&[def]] | d,e或者f?br /> | 交集 |
[a-z&&[^bc]] | 从a到zQ除了b和cQ等于[ad-z] | 扣除 |
[a-z&&[^m-p]] | 从a到zQƈ且不包括从m到pQ等于[a-lq-z] | 扣除 |
边界字符 | 匚w的字W串 |
. | L字符Q可能匹配行l束W?br /> |
\d | 数字[0-9] |
\D | 非数字[^0-9] |
\s | I白W[ \t\n\x0B\f\r] |
\S | 非空白符[^\s] |
\w | 单词W,包含有字母和数字[a-zA-Z_0-9] |
\W | 非单词符Q不包含有字母和数字?br /> |
正则表达式字W串 | 匚w的字W串 |
名称 | 块名Uͼ\p{InXXX}Q?br /> | 化通配W?br /> | 标准Unicode块,或者汉字列?br /> |
L双字节字W(汉字或全角符P | \p{InQuqnJiao} | \E | L由GBK表示的汉字,不包括GB18030扩展部分Q?br />以及CJK ExtB区的汉字?br /> |
L单字节字W?br /> | \p{InFQuanJiao} | \~E | L单字节字W?br /> |
L全角ASCII字符 | \p{InQJAscii} | \H | 标准HalfwidthandFullwidthForms?br /> |
L收录在BIG5码集中的双字节字W?br /> | \p{InBig5} | \I | Big5可编码双字节字符 |
匚w未收录在BIG5码集中的双字节字W?/td> | \p{InFBig5} | \~I | 非Big5可编码双字节字符 |
匚wL汉字(不包括符? | \p{InHanziOrCJKExtB} | \X | L汉字Q包括GB18030扩展部分?br /> |
匚wL汉字(不包括符? | \p{InHanzi} | \M | L汉字Q不包括GB18030扩展部分?br /> |
匚w非汉字的双字节字W?br /> | \p{InFHanzi} | \~M | L非汉字的双字节字W, 包括GB18030扩展部分?br /> |
地支字符 | \p{InDiZhi} | \U | 子丑寅卯辰埩午未申酉戌亥 |
匚w收录在GB码集中的双字节字W?br /> | \p{InGB} | \g | 收录在GB码集中的双字节字W, 不包括GB18030扩展部分?br /> |
匚w非收录在GB码集中的双字节字W?br /> | \p{InFGB} | \~g | 未收录在GB码集中的双字节字W, 不包括GB18030扩展部分?br /> |
匚w收录在GBK码集中的双字节字W?br /> | \p{InGBK} | \h | 收录在GBK码集中的双字节字W, 不包括GB18030扩展部分?br /> |
匚w非收录在GBK码集中的双字节字W?br /> | \p{InFGBK} | \~h | 未收录在GBK码集中的双字节字W, 不包括GB18030扩展部分?br /> |
大写希腊字母 | \p{InDaXila} | \K | ΑΒΓΔΕΖΗΘΙΚΛΜΝ ΞΟΠΡΣf`ΦΨΩ |
日文片假?br /> | \p{InPianJia} | \j | 标准Katakana?br /> |
日文q_?br /> | \p{InPingJia} | \J | 标准Hiragana?br /> |
写希腊字母 | \p{InXiaoXila} | \k | βδεζηθικλμ^ ξοπρστυφχψω |
数学W号 | \p{InMathe} | \m | u×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒?br />∫∮≡≌≈∽∝≠≮≯≤≥∞∵?br /> |
中文数字 | \p{InCnDigit} | \i | 〇一二三四五六七八九十百千万亿兆吉京 |
大写中文数字 | \p{InDaCnDigit} | \N | 零壹贰叁肆伍陆柒捌玖拾䘪仟萬亿兆吉京 |
全角标点W号 | \p{InQJBiaoDian} | \o | 、。·ˉˇ¨〃々—~‖…‘’“”〔?br />〈〉《》「」『』〖〗【】!Q'Q)Q?br />Q.Q;Q=Q?Q]{|}`H﹊H﹌H﹎H﹐H﹒H﹕H﹗H﹚ H﹜H﹞|︶|ؓ|﹀|DH﹂H﹄ |Ӈ|P|x|?br /> |
写俄文字母 | \p{InXiaoEWen} | \l | аб{Cеёжзийaxмн о\рстуфхцчшщъыьэюя |
大写俄文字母 | \p{InDaEWen} | \R | АБВГДЕЁЖЗИЙКЛМНО ПРСТУФ[ЦЧШЩЪЫЬfy |
中文序号 | \p{InCnSN} | \q | ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ ⅰⅱ⅜yⅴⅵⅶⅷⅸⅹ 再加上Unicode标准EnclosedAlphanumerics?br /> |
天干字符 | \p{InTianGan} | \T | 甲乙丙丁戊己庚辛壬癸 |
竖排标点W号 | \p{InSPBiaoDian} | \V | |︶|ؓ|﹀|DH﹂H﹄|Ӈ|P|x|?br /> |
拼音字符 | \p{InPinyin} | \y | ā֙ǎàēéě؈īTǐìōQǒòūúǔùǖǘǚǜü^ɑńň GBK -> 0xA8A1- 0xA8C0 只是Unicode标准LatinExtended-A块的一部分?br /> |
注音字符 | \p{InZhuyin} | \Y | 标准Bopomofo?br /> |
制表字符 | \p{InZhiBiao} | \C | 标准BoxDrawing块?br />l检查发?textpro 的算法含有部分非?br />准Unicode制表W:“∟∣≒≦≧⊎앐”?br /> |
正则表达式字W串 | 匚w的字W串 |
\p{Lower} | 写字母[a-z] |
\p{Upper} | 大写字母[A-Z] |
\p{ASCII} | 所有的ASCII字符[\x00-\x7F] |
\p{Alpha} | 大小写字母[\p{Lower}\p{Upper}] |
\p{Digit} | 数字[0-9] |
\p{Alnum} | 字母数字W,包含大小写字母和数字[\p{Alpha}\p{Digit}] |
\p{Punct} | 标点W号Q?"#$%&'()*+,-./:;<=>?@[\]^_`{|}~之一?br /> |
\p{Graph} | 可显C字W[\p{Alnum}\p{Punct}] |
\p{Print} | 可打印字W[\p{Graph}] |
\p{Blank} | I格或者制表符[ \t] |
\p{Cntrl} | 控制字符[\x00-\x1F\x7F |
\p{XDigit} | 十六q制数字[0-9a-fA-F] |
\p{Space} | I白W[ \t\n\x0B\f\r] |
?br /> | 中文名称Q摘自Word XPQ?br /> | 代码区域 |
BasicLatin | 基本拉丁?br /> | \u0000-\u007F |
Latin-1Supplement | 拉丁?1 | \u0080-\u00FF |
LatinExtended-A | 拉丁语扩?A | \u0100-\u017F |
LatinExtended-Bound | 拉丁语扩?B | \u0180-\u024F |
IPAExtensions | 国际x扩充 | \u0250-\u02AF |
SpacingModifierLetters | q格的修饰字W?br /> | \u02B0-\u02FF |
CombiningDiacriticalMarks | l合用发音符 | \u0300-\u036F |
Greek | 基本希腊?br /> | \u0370-\u03FF |
Cyrillic | 襉K语 | \u0400-\u04FF |
Armenian | \u0530-\u058F | |
Hebrew | \u0590-\u05FF | |
Arabic | \u0600-\u06FF | |
Syriac | \u0700-\u074F | |
Thaana | \u0780-\u07BF | |
Devanagari | \u0900-\u097F | |
Bengali | \u0980-\u09FF | |
Gurmukhi | \u0A00-\u0A7F | |
Gujarati | \u0A80-\u0AFF | |
Oriya | \u0B00-\u0B7F | |
Tamil | \u0B80-\u0BFF | |
Telugu | \u0C00-\u0C7F | |
Kannada | \u0C80-\u0CFF | |
Malayalam | \u0D00-\u0D7F | |
Sinhala | \u0D800-\uDFF | |
Thai | \u0E00-\u0E7F | |
Lao | \u0E80-\u0EFF | |
Tibetan | 藏语 | \u0F00-\u0FFF |
Myanmar | \u1000-\u109F | |
Georgian | \u10A0-\u10FF | |
HangulJamo | \u1100-\u11FF | |
Ethiopic | \u1200-\u137F | |
Cherokee | \u13A0-\u13FF | |
UnifiedCanadianAboriginalSyllabics | \u1400-\u167F | |
Ogham | \u1680-\u169F | |
Runic | \u16A0-\u16FF | |
Khmer | \u1780-\u17FF | |
Mongolian | 蒙古?br /> | \u1800-\u18AF |
LatinExtendedAdditional | \u1E00-\u1EFF | |
GreekExtended | \u1F00-\u1FFF | |
GeneralPunctuation | q义标点 | \u2000-\u206F |
SuperscriptsandSubscripts | \u2070-\u209F | |
CurrencySymbols | 货币W号 | \u20A0-\u20CF |
CombiningMarksforSymbols | \u20D0-\u20FF | |
LetterlikeSymbols | cM字母的符?br /> | \u2100-\u214F |
NumberForms | 数字形式 | \u2150-\u218F |
Arrows | 头 | \u2190-\u21FF |
MathematicalOperators | 数学q算W?br /> | \u2200-\u22FF |
MiscellaneousTechnical | 零杂技术用W号 | \u2300-\u23FF |
ControlPictures | \u2400-\u243F | |
OpticalCharacterRecognition | \u2440-\u245F | |
EnclosedAlphanumerics | 带括L字母数字 | \u2460-\u24FF |
BoxDrawing | 制表W?br /> | \u2500-\u257F |
BlockElements | 方块囑Ş | \u2580-\u259F |
GeometricShapes | 几何囑Ş | \u25A0-\u25FF |
MiscellaneousSymbols | 零杂丁贝W(C意W等Q?br /> | \u2600-\u26FF |
Dingbats | \u2700-\u27BF | |
BraillePatterns | \u2800-\u28FF | |
CJKRadicalsSupplement | \u2E80-\u2EFF | |
KangxiRadicals | \u2F00-\u2FDF | |
IdeographicDescriptionCharacters | \u2FF0-\u2FFF | |
CJKSymbolsandPunctuation | CJKW号和标?br /> | \u3000-\u303F |
Hiragana | q_?br /> | \u3040-\u309F |
Katakana | 片假?br /> | \u30A0-\u30FF |
Bopomofo | 注音 | \u3100-\u312F |
HangulCompatibilityJamo | \u3130-\u318F | |
Kanbun | \u3190-\u319F | |
BopomofoExtended | 扩展注音 | \u31A0-\u31BF |
EnclosedCJKLettersandMonths | 带括LCJK字母及月?br /> | \u3200-\u32FF |
CJKCompatibility | CJK兼容字符 | \u3300-\u33FF |
CJKUnifiedIdeographsExtensionA | CJKl一汉字扩展-A | \u3400-\u4dBF |
CJKUnifiedIdeographs | CJKl一汉字 | \u4E00-\u9fAF |
YiSyllables | \uA000-\uA48F | |
YiRadicals | \uA490-\uA4CF | |
HangulSyllables | \uAC00-\uD7A3 | |
HighSurrogates | \uD800-\uDB7F | |
HighPrivateUseSurrogates | \uDB80-\uDBFF | |
LowSurrogates | \uDC00-\uDFFF | |
PrivateUse | 专用?br /> | \uE000-\uF8FF |
CJKCompatibilityIdeographs | CJK兼容汉字 | \uF900-\uFAFF |
AlphabeticPresentationForms | \uFB00-\uFB4F | |
ArabicPresentationForms-A | \uFB50-\uFDFF | |
CombiningHalfMarks | \uFE20-\uFE2F | |
CJKCompatibilityForms | CJK兼容形式 | \uFE30-\uFE4F |
SmallFormVariants | 写变体 | \uFE50-\uFE6F |
ArabicPresentationForms-Bound | \uFE70-\ufeFF | |
Specials | \uFFF0-\uFFFF | |
HalfwidthandFullwidthForms | 半Ş及全形字W?br /> | \uFF00-\uFFEF |
分类 | 全称 | 说明 |
Cn | UNASSIGNED | |
Lu | UPPERCASE_LETTER | |
Ll | LOWERCASE_LETTER | |
Lt | TITLECASE_LETTER | |
Lm | MODIFIER_LETTER | |
Lo | OTHER_LETTER | |
Mn | NON_SPACING_MARK | |
Me | ENCLOSING_MARK | |
Mc | COMBINING_SPACING_MARK | |
Nd | DECIMAL_DIGIT_NUMBER | |
Nl | LETTER_NUMBER | |
No | OTHER_NUMBER | |
Zs | SPACE_SEPARATOR | |
Zl | LINE_SEPARATOR | |
Zp | PARAGRAPH_SEPARATOR | |
Cc | CNTRL | |
Cf | FORMAT | |
Co | PRIVATE_USE | |
Cs | SURROGATE | |
Pd | DASH_PUNCTUATION | |
Ps | START_PUNCTUATION | |
Pe | END_PUNCTUATION | |
Pc | CONNECTOR_PUNCTUATION | |
Po | OTHER_PUNCTUATION | |
Sm | MATH_SYMBOL | |
Sc | CURRENCY_SYMBOL | |
Sk | MODIFIER_SYMBOL | |
So | OTHER_SYMBOL | |
L | LETTER | |
M | MARK | |
N | NUMBER | |
Z | SEPARATOR | |
C | CONTROL | |
P | PUNCTUATION | |
S | SYMBOL | |
LD | LETTER_OR_DIGIT | |
L1 | Latin-1 | |
all | ALL | |
ASCII | ASCII | |
Alnum | 字母数字(0-9,a-z,A-Z) | |
Alpha | 字母(a-z,A-Z) | |
Blank | I格和制表符(' '|\t) | |
Cntrl | 控制字符Q不可打?br /> | |
Digit | 数字(0-9) | |
Graph | 可打C可视字母Q例如空? '是可打印的但不是可视字母Q?`a' 两者都是。) | |
Lower | 写字母 | |
Print | 可打印字母(非控制字W) | |
Punct | 标符P字母、数字、控制、空白符以外的字母)Q如Q?@#$%}{<>,./?[]{等?br /> | |
Space | I白W?' ',\t,0x09,0x0A,0x0B,0x0C,0x0D,0x20) | |
Upper | 大写字母 | |
XDigit | 十六q制数字(0-9Qa-f, A-F) |
Ҏ字符介绍 | 描述 |
\n | 换行 |
\b | 向前删除一个字W。当q个字符位于替换串之首时Q将删除匚w串之前的一个字W。若匚w串位于行首,匚w串所在行与前一行相合ƈ?br /> |
\d | 向后删除一个字W。当q个字符位于替换串之末时Q将删除匚w串之后的一个字W。若匚w串位于行末,匚w串所在行与下一行相合ƈ?br /> |
\e | 插入一个ESC字符 |
\t | 插入一个TAB字符 |
\n | n代表查找正则表达式中的子表达式(l)。\1代表W一个子表达式,\2代表W二个子表达式,依次cL。\0代表整个匚w到的字符丌Ӏ?br /> |
\v | 大写下一个字?br /> |
\U | 全部大写以后的字母,直到到其它指示Wؓ止?br /> |
\l | 写下一个字?br /> |
\L | 全部写以后的字母,直到到其它指示Wؓ止?br /> |
\E | 取消所有的字母大小写指C符?br /> |
垂直扩展Q简单的_是当单一pȝg升扩展Ӟ如增加CPUQ内存,应用E序能够随之U性提高业务处理能力?BR>多线E是服务?Java 应用的标准处理方式,其优点不用赘q。本文要讨论的是Q如何在设计阶段降低多线E之间的竞争性同步开销?/P>
假设一个Web应用Q需要ؓ当前用户l护在线用户信息。此用户信息列表会放?Application 范围的一?Map 中,那么我们增加或删除一个在U用L操作会是q样Q?BR>Map clientMap = ...// from Application Context
synchronized(clientMap){
clientMap.put(clientId,clientObject);
}
q是一个典型的全局同步代码Q当q发U程增加Ӟq部分代码就有可能会存在潜在垂直扩展瓉?/P>
最单解军_法:?ConcurrentHashMap?BR>ConcurrentHashMap的多U程下的表现要比HashMap好的多,可以做到随着U程数增长性能基本保持E_?BR>参见Q?A >http://www-128.ibm.com/developerworks/cn/java/j-jtp07233/index.html
?ConcurrentHashMap 的分析,参见Q?A >http://www-128.ibm.com/developerworks/cn/java/j-jtp08223/index.html
?ConcurrentMap/ConcurrentLinkedQueue 不能帮助我们的情况下Q我们需要明设计以避免全局竞争?BR>基本原则是:
1 预分配,降低争用出现的频率?BR>2 降低锁的_度Q将全局竞争变ؓ局部竞争?/P>
预分配策略示例:
对于一在线交易处理pȝQ需要ؓ每个交易生成交易水P假设有多C易服务器按照集群方式配置Q同时提供服务。那么需要在交易服务器之间进行同步,以保证交易流水号的正常增ѝ?BR>一U处理方式ؓQ在数据库中保存当前交易水L最高|每台机器一ơ预分配1000水Q内部采用线E同步进行分配,用完再从数据库分配。这里数据库充当了全局存储和全局同步工具Q如果每来一条交易,p问一ơ数据库Q考虑到数据库同步和事务的负担Q这里会成ؓ严重的性能瓉?/P>
降低锁粒度策略示例:
1 ConcurrentHashMap 本n是个很好的模范。它采用32颗锁Q来代替普?HashMap 的单颗对象锁?BR>2 对于数据库中q发大的表,可以考虑表U锁改ؓ行锁,提高q发性?BR>
暂时想不hCZQ有I再?/FONT>
Unicode 与超大字W集
国标 GB18030 规定?字节扩展部分Q这部分区域目前?Unicode 规范中作为CJK Ext B区存在,卛_说的中文大字符集。这部分区域~码?\U20000 - \U2A6D6?/P>
UTF-16与Java String/Character 对象
一个完整的 Unicode 字符?代码?CodePointQ而一?Java char ?代码单元 code unit?BR>String 对象以UTF-16保存 Unicode 字符Q需要用2个字W表CZ?大字符集的汉字Q这q种表示方式UC?SurrogateQ第一个字W叫 Surrogate HighQ第二个是 Surrogate Low?/P>
判断一个char是否?Surrogate 区的字符Q用 Character?isHighSurrogate()/isLowSurrogate()Ҏ?BR>从两个Surrogate High/Low 字符Q返回一个完整的 Unicode CodePoint ?Character.toCodePoint()/codePointAt()Ҏ?/P>
一?Code Point Q可能需要一个也可能需要两个char表示Q因此不能直接?CharSequence.length()Ҏ直接q回一个字W串到底有多个汉字Q而需要用String.codePointCount()/Character.codePointCount()?/P>
要定位字W串中的WN个字W,不能直接?N 作ؓ偏移量,而需要从字符串头部依ơ遍历得刎ͼ需要用String/Character.offsetByCodePoints() Ҏ?/P>
从字W串的当前字W,扑ֈ上一个字W,也不能直接用offset -- 实现Q而需要用 String.codePointBefore()/Character.codePointBefore()Q或?String/Character.offsetByCodePoints()
从当前字W,找下一个字W,不能直接?offset ++ 实现Q需要判断当?CodePoint 的长度后Q再计算得到Q或?String/Character.offsetByCodePoints() ?/P>
Swing ?大字符集的支持
JTextPane增加了对 大字符集的支持Q只要设|字体正,可以显C和~辑大字符集?BR>
Thread Dump分析的一些经?BR>1 扑ևq几ơThread dump 文g中,有哪?Java Thread 处于长时间等待状态,很有可能是问题之所在?BR>2 如果Java U程{在某些不可能出错的地方Q如 java.lang.XXX/java.util.XXX对象的某个方法,则很有可能是因ؓ出现?OutOfMemoryError 异常Q原因不外乎是JVM 堆内存过或出现内存泄漏?BR>3 对于死锁Q最直接的表现就是至两个线E长旉{待怺持有的对象(每个U程所持有的对象和它当前等待的对象都可以从 dump 中看刎ͼ?BR>4 对于d@环,要辅助CPU占用率确定;如果发现CPU臛_一颗用率?00%Qƈ且有U程长时间位于用户代码处Q则很有可能是死循环引v?/P>
heapprofile(http://www.virtualmachine.de/)
JVM Thread DUMP 基本?/STRONG>
Windows 下用Ctrl-Break,Unix 下用 kill -3 <pid> 的命令让JVM输出 thread dump?BR>每隔几秒 thread dump 一ơ,多做几次Q分析比较?/P>
多线E缺h?BR>对于Java死锁问题很少出现Q多U程讉K变量时冲H很常见?BR>一般出在多U程׃n同一对象实例如全局MapQServlet,InterceptorQ或如多U程同时讉K某个静态方法,而此静态方法不巧又讉K另一个静态变量?BR>q类问题自测发现不了Q在q发压力试时才能发现。如果代码的入口查做得好Q多半会抛出一些莫名其妙的异常Q要不然׃出现正常q行但数据库记录不对的情c?BR>对这U问题,q无多好的办法解冻I主要q是靠看异常堆栈和静态代码分析来解决?BR>
内存泄漏排查
一般用商用辅助工具排查Q但有可能出现在JVM heap dump 模式下,q行极度~慢的情c?BR>W笨曄用过一个非常简单的工具Q效果不错,它可以做到在不媄响jvm 执行速度的情况下Q做heap dumpQ然后对dump出的文gq行排序Q检查即可?/P>
]]>
EJB q行时所享受?J2EE 基础服务
1 参与AppServer 提供分布式事务管?JTA,JTS)?BR>2 AppServer 提供高性能通讯框架(ZRMI ?IIOP实现)和大q发处理?BR> 1) AppServer ?WebLogic/WebSphere 替换?Sun 标准 RMI 实现Q基于著名的多线E阻塞IOQ,国内?Apusic 4 则基于纯 NIO ?IIOP通讯协议实现EJB q程通讯?
2) AppServer 提供 EJB 实例池、请求队列、执行线E池{等服务?/P>
3 AppServer 提供透明 EJB 集群理Q负载均衡、故障恢复)Q保证应用的处理能力能够水^扩展?BR>4 J2EE 安全体系
5 AppServer Ҏ的附加增值服?BR> 1) ?WebLogic WTC EJBQ可实现从TUXEDO Service(C语言) 高性能讉K EJB?/P>
大型目所x的重?/STRONG>
对于大型目如全国集中这一U别而言Q它所x的重炚w险反而是pȝ的性能、吞吐量、稳定性、高可用性这L一些基本属性,q里q说具体的业务功能׃重要Q而是与上q的基本属性相比,业务功能可以说是相对的不重要?BR>基本属性如果有某一Ҏ有达刎ͼ直接后果是目p|Q或者运行时存在高风险?BR>业务功能则主要是堆时间、堆人、堆代码、堆试人员的问题,如果实在来不及了Q那放到第二期d好了Q不影响L律么?/P>
对于大型目而言Q采用新技术的x点主要是Q?BR>1 能否满基本质量属性,无重大运行时风险?BR>比如_数据讉K层,从性能和稳定性角度而言Q还直接采?JDBC ~码合适,最多采用SQL映射型JDO。对于带~冲的JDO实现则不宜采用,会带来水qx展和E_性风险?/P>
2 目l相关h员是否有此技术的l验Q最好不要付出学习成本,避免因不熟悉所带来的风险?/P>
EJB ?IoC 框架?Spring 的定位比?/STRONG>
Spring IoC/Context/AOP 可以认ؓ是一个代码组l?Assembler)框架Q关注代码如何组l和去耦?/P>
EJB 则是q行l构Q关注我们的应用如何q行Q如何做集群Q系l计资源如何分配等{?BR>EJB 3 的改q主要还是从代码l织角度做出的,对于 EJB q行时架构ƈ没有多少变化Q如果说错了Q还h正)QBEA q有q将 EJB 3的代码翻译ؓ EJB 2.1 q行时架构的考虑Q参?BEA 的关?EJB 3 的一文?A >http://www.javaworld.com/javaworld/jw-08-2004/jw-0809-ejb_p.htmlQ?BR>
从上q角度来看,EJB ?Spring 是从不同的角度看待应用,我们完全可以做到?Spring l织代码实现EJB?/P>
With or Without EJB?
从上q讨论可以看出,用Springq是用EJBq不是个问题Q最l还是看用户的实际需求而定。小Web目多半不关注性能、ƈ发、集等{属性,Z开发过E简单和学习成本的考虑Q完全可以不用EJBQ而大型项目可能还是得用EJB?BR>
基本代码执行
Java与C?1:3-1:5左右Q在Intelq_上用JDK1.4得?BR>JNI不快Q一ơ基本JNI调用差不多等于一ơJavaҎ调用Q未考虑大数据量传输Q?/P>
数据库访?/STRONG>
JDBC与数据库本地接口差距较大Q差不多??个数量左右Q或更多。可以认为在1:10 - 1:50之间
socket|络传输
Java要分普通多U程和NIO方式
多线E方式,q发受限Q一般不会超q?50-200个ƈ发,再多性能不会增加。这U方式下Q网l传输性能与C差距可以认ؓ?个数量左右Q即1:10-1:30?BR>NIO方式Qƈ发不错,能够支持到几千个q发Q性能差距些Q可以做到在1:3 -- 1:5 左右?BR>C 通过select/poll/epoll技术,q发10000没有多少问题Qƈ且通过Zero-Copy技术,可以避开Java 所无法避免~冲区复?Java->C~冲区复?的问题?/P>
ȝ来看QJava与C在普通多层Web应用斚wQ差距可以认为在1个数量左右Q关键应用如TP Monitor目前q无法用Java?BR>