﻿<?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-西津渡日志 软件架构,saas-随笔分类-J2EE Technich</title><link>http://www.blogjava.net/stephen80/category/5942.html</link><description>软件架构,saas,战略管理</description><language>zh-cn</language><lastBuildDate>Tue, 05 Jan 2010 06:07:23 GMT</lastBuildDate><pubDate>Tue, 05 Jan 2010 06:07:23 GMT</pubDate><ttl>60</ttl><item><title>mysql best practice</title><link>http://www.blogjava.net/stephen80/archive/2010/01/05/308270.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Tue, 05 Jan 2010 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2010/01/05/308270.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/308270.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2010/01/05/308270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/308270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/308270.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CJIANQI%7E1.HZ%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]>
<style>
st1":*{behavior:url(#ieooui) }
</style>
<![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:Calibri;
mso-bidi-font-family:"Times New Roman";}
h1
{mso-style-link:" Char Char5";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:240%;
page-break-after:avoid;
font-size:22.0pt;
font-family:Calibri;
mso-bidi-font-family:"Times New Roman";
font-weight:bold;}
h3
{mso-style-link:" Char Char3";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:173%;
page-break-after:avoid;
font-size:16.0pt;
font-family:Calibri;
mso-bidi-font-family:"Times New Roman";
font-weight:bold;}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;
text-underline:single;}
p
{
margin-right:0cm;
margin-left:0cm;
font-size:12.0pt;
font-family:宋体;}
pre
{margin:0cm;
margin-bottom:.0001pt;
tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;
font-size:12.0pt;
font-family:宋体;}
span.CharChar5
{mso-style-name:" Char Char5";
mso-style-link:"标题 1";
font-family:Calibri;
font-weight:bold;}
span.CharChar3
{mso-style-name:" Char Char3";
mso-style-link:"标题 3";
font-family:Calibri;
font-weight:bold;}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<h1><span>Myisam is preferred without transaction and little
update(delete)</span></h1>
<p>Big than 4G datafile can user Myisam merge table. </p>
<h1>InnoDB with auto_increment primary key is preferred.</h1>
<h1>Few storage process</h1>
<h1><span>Guess: 20m
records max per table , 500G
data max per tablespace , 256 tables per database (may problem)</span></h1>
<h1>Use prepared statement and &nbsp;batch </h1>
<h3>Optimize Your Queries For the Query Cache</h3>
<pre>// query cache does NOT work</pre>
<pre>$r = mysql_query("SELECT username FROM user WHERE signup_date &gt;= CURDATE()");</pre>
<pre>&nbsp;</pre>
<pre>// query cache works!</pre>
<pre>$today = date("Y-m-d");</pre>
<pre>$r = mysql_query("SELECT username FROM user WHERE signup_date &gt;= '$today'");</pre>
<h3>EXPLAIN Your SELECT Queries</h3>
<h3>LIMIT 1 When Getting a Unique Row</h3>
<h3>Index and Use Same Column Types for Joins</h3>
<h3>Do Not ORDER BY RAND()</h3>
<h3>Avoid SELECT *</h3>
<p><span>t is a good habit to always specify which
columns you need when you are doing your SELECT&#8217;s.</span></p>
<h3>Use ENUM over VARCHAR</h3>
<h3>Use NOT NULL If You Can</h3>
<h3>Store IP Addresses as UNSIGNED INT (?)</h3>
<h3>Fixed-length (Static) Tables are Faster</h3>
<h3>Vertical Partitioning</h3>
<p><span>Vertical Partitioning is the act of splitting your table
structure in a vertical manner for optimization reasons.</span></p>
<p><strong><span style="font-family: 宋体;">Example
1</span></strong><span>: You might have a users table that contains
home addresses, that do not get read often. You can choose to split your table
and store the address info on a separate table. This way your main users table
will shrink in size. As you know, smaller tables perform faster.</span></p>
<p><strong><span style="font-family: 宋体;">Example
2</span></strong><span>: You have a &#8220;last_login&#8221; field in your
table. It updates every time a user logs in to the website. But every update on
a table causes the query cache for that table to be flushed. You can put that
field into another table to keep updates to your users table to a minimum.</span></p>
<p><span>But you also need to make sure you don&#8217;t constantly need to
join these 2 tables after the partitioning or you might actually suffer
performance decline.</span></p>
<h3>Split the Big DELETE or INSERT Queries</h3>
<p><span>If you have some kind of maintenance script
that needs to delete large numbers of rows, just use the LIMIT clause to do it
in smaller batches to avoid this congestion.</span></p>
<h3>Smaller Columns Are Faster</h3>
<h3>Use an Object Relational Mapper</h3>
<p><span>f you do not need the time component, use
DATE instead of DATETIME.</span></p>
<h3><span>Consider horizontally spitting many-columned tables if
they contain a lot of NULLs or rarely used columns.</span></h3>
<h3><span>Be an SQL programmer who thinks in sets, not procedural
programming paradigms</span></h3>
<h3><span>InnoDB can&#8217;t optimize SELECT COUNT(*) queries. Use counter
tables! That&#8217;s how to scale InnoDB.</span></h3>
<h3>Prefer MM with hive</h3>
<p>refer :</p>
<p><a href="http://blog.tuvinh.com/top-20-mysql-best-practices/">http://blog.tuvinh.com/top-20-mysql-best-practices/</a></p>
<img src ="http://www.blogjava.net/stephen80/aggbug/308270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2010-01-05 13:38 <a href="http://www.blogjava.net/stephen80/archive/2010/01/05/308270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql jdbc driver code browser</title><link>http://www.blogjava.net/stephen80/archive/2009/12/30/307741.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Wed, 30 Dec 2009 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2009/12/30/307741.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/307741.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2009/12/30/307741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/307741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/307741.html</trackback:ping><description><![CDATA[<br />
从时序图中可以看到，createNewIO()就是新建了一个com.mysql.jdbc.MysqlIO，利用 com.mysql.jdbc.StandardSocketFactory来创建一个socket。然后就由这个mySqlIO来与MySql服务器进行握手(doHandshake())，这个doHandshake主要用来初始化与Mysql server的连接，负责登陆服务器和处理连接错误。在其中会分析所连接的mysql server的版本，根据不同的版本以及是否使用SSL加密数据都有不同的处理方式，并把要传输给数据库server的数据都放在一个叫做packet的 buffer中，调用send()方法往outputStream中写入要发送的数据。<br />
<img src="http://www.blogjava.net/images/blogjava_net/stephen80/mysqljdbc.jpg" alt="" border="0" /><br />
<br />
useServerPreparedStmts置为true的话，mysql驱动可以通过PreparedStatement的子类ServerPreparedStatement来实现真正的PreparedStatement的功能<br />
<br />
<br />
<br />
<br />
第一位表示数据包的开始位置，就是数据存放的起始位置，一般都设置为0，就是从第一个位置开始。第二和第三个字节标识了这个数据包的大小，注意的是，这个大小是出去标识的4个字节的大小，对于非最后一个数据包来说，这个大小都是一样的，就是splitSize，也就是maxThreeBytes，它的值是 255 * 255 * 255。<br />
最后一个字节中存放的就是数据包的编号了，从0开始递增。<br />
在标识位设置完毕之后，就可以把255 * 255 * 255大小的数据从我们准备好的待发送数据包中copy出来了，注意，前4位已经是标识位了，所以应该从第五个位置开始copy数据<br />
<br />
&nbsp;# packetToSend = compressPacket(headerPacket, HEADER_LENGTH,&nbsp;&nbsp;&nbsp;&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; splitSize, HEADER_LENGTH);&nbsp; <br />
<br />
LoadBalancingConnectionProxy <br />
package java.lang.reflect 。 proxy .<br />
<br />
<br />
http://developer.51cto.com/art/200907/137823.htm<br />
<br />
http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-implementation-notes.html<br />
<br />
<p>
PreparedStatements are implemented by the driver, as MySQL
does not have a prepared statement feature. Because of this,
the driver does not implement
<code class="function">getParameterMetaData()</code> or
<code class="function">getMetaData()</code> as it would require the
driver to have a complete SQL parser in the client.
</p>
<p>
Starting with version 3.1.0 MySQL Connector/J, server-side
prepared statements and binary-encoded result sets are used
when the server supports them.
</p>
<br />
<font size="3">但这是不是说PreparedStatement没用呢？不是的，PreparedStatement有其他的好处：<br />
1.代码的可读性和可维护性<br />
2.最重要的一点是极大地提高了安全性，可以防止SQL注入<br />
<br />
然后我又看了一些网上其他人的经验，基本和我的判断一致，有两点要特别提请大家注意：<br />
<br />
1.并不是说PreparedStatement在所有的DB上都不会提高效率，PreparedStatement需要服务器端的支持，比如在
Oracle上就会有显著效果。上面说的测试都是在MySQL上测试的，我找到了一个MySQL架构师的帖子，比较明确地说明了MySQL不支持
PreparedStatement。<br />
<br />
2.即便PreparedStatement不能提高性能，在少数使用时甚至会降低效率，但仍然应该使用PreparedStatement！因为其他好
处实在是太大了！当然，当SQL查询比较复杂时，可能PreparedStatement好处会更大，只是我没有测试，不敢肯定。<br />
<br />
3.既然PreparedStatement不能提高效率，那PreparedStatement Pool也就没有必要了。但可以看到每次新建Connection的开销实在很大，因此Connection Pool绝对必要。</font><br />
<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/307741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2009-12-30 12:41 <a href="http://www.blogjava.net/stephen80/archive/2009/12/30/307741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java post mortem diagnos</title><link>http://www.blogjava.net/stephen80/archive/2009/12/07/304998.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Mon, 07 Dec 2009 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2009/12/07/304998.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/304998.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2009/12/07/304998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/304998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/304998.html</trackback:ping><description><![CDATA[jmap -heap 16761<br />
jstat -gcutil 16761<br />
jmap -finalizerinfo 16761<br />
jmap -histo 16761<br />
jstack -l 16761<br />
jinfo 16761<br />
<br />
Examine the fatal error log file. Default file name is hs_err_pidpid.log in the working-directory.<br />
<br />
-XX:+HeapDumpOnOutOfMemoryError<br />
java -agentlib:hprof=heap=dump,format=b application<br />
$ jmap -dump:format=b,file=snapshot.jmap process-pid<br />
<br />
1、在jvm启动时加上：<span>-agentlib:hprof=heap=sites,file=heap.txt
&nbsp;，然后执行一段时间后执行 kill -3
&lt;pid&gt;，就可以获取jvm的内存镜像。类似的通过-agentlib:hprof=cpu=samples,file=cpu.txt查
看cpu的状况。</span><br />
<br />
http://java.sun.com/javase/6/webnotes/trouble/other/matrix6-Unix.html<br />
<br />
<br />
<h2>Quick Troubleshooting Tips on Solaris OS and Linux for Java SE 6</h2>
<p>This "Quick Start Guide" gives you some quick tips for troubleshooting.
The subsections list some typical functions that can help you in
troubleshooting, including one or more ways to get the
information or perform the action.
</p>
<p>These tips are organized as follows:
</p>
<blockquote><a href="http://java.sun.com/javase/6/webnotes/trouble/other/matrix6-Unix.html#hung">Hung, Deadlocked, or Looping Process</a> <br />
<a href="http://java.sun.com/javase/6/webnotes/trouble/other/matrix6-Unix.html#post">Post-mortem Diagnostics, Memory Leaks</a> <br />
<a href="http://java.sun.com/javase/6/webnotes/trouble/other/matrix6-Unix.html#monitor">Monitoring</a><br />
<a href="http://java.sun.com/javase/6/webnotes/trouble/other/matrix6-Unix.html#remote">Actions on a Remote Debug Server</a><br />
<a href="http://java.sun.com/javase/6/webnotes/trouble/other/matrix6-Unix.html#other">Other Functions</a>
</blockquote>
<h3>Hung, Deadlocked, or Looping Process</h3>
<ul>
    <li>Print thread stack for all Java threads:
    <ul>
        <li>Control-" </li>
        <li><tt>kill -QUIT</tt> <em>pid</em> </li>
        <li><tt>jstack</tt> <em>pid</em> (or <tt>jstack -F</tt> <em>pid</em> if <tt>jstack</tt> <em>pid</em> does not respond)</li>
    </ul>
    </li>
    <li>Detect deadlocks:
    <ul>
        <li>Request deadlock detection: JConsole tool, Threads tab
        </li>
        <li>Print information on deadlocked threads: Control-"
        </li>
        <li>Print list of concurrent locks owned by each thread: <tt>-XX:+PrintConcurrentLocks</tt> set, then Control-"
        </li>
        <li>Print lock information for a process: <tt>jstack -l</tt> <em>pid</em>
        </li>
    </ul>
    </li>
    <li>Get a heap histogram for a process:
    <ul>
        <li>Start Java process with <tt>-XX:+PrintClassHistogram</tt>, then Control-" </li>
        <li><tt>jmap -histo</tt> <em>pid</em> (with <tt>-F</tt> option if <em>pid</em> does not respond)</li>
    </ul>
    </li>
    <li>Dump Java heap for a process in binary format to file:
    <ul>
        <li><tt>jmap -dump:format=b,file=</tt><em>filename pid</em>  (with <tt>-F</tt> option if <em>pid</em> does not respond)</li>
    </ul>
    </li>
    <li>Print shared object mappings for a process:
    <ul>
        <li><tt>jmap</tt> <em>pid</em></li>
    </ul>
    </li>
    <li>Print heap summary for a process:
    <ul>
        <li>Control-" </li>
        <li><tt>jmap -heap</tt> <em>pid</em>
        </li>
    </ul>
    </li>
    <li>Print finalization information for a process:
    <ul>
        <li><tt>jmap -finalizerinfo</tt> <em>pid</em></li>
    </ul>
    </li>
    <li>Attach the command-line debugger to a process:
    <ul>
        <li><tt>jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=</tt><em>pid</em> </li>
    </ul>
    </li>
</ul>
<h3>Post-mortem Diagnostics, Memory Leaks</h3>
<ul>
    <li>Examine the fatal error log file. Default file name is <tt>hs_err_pid</tt><em>pid</em><tt>.log</tt> in the working-directory.
    </li>
    <li>Create a heap dump:
    <ul>
        <li>Start the application with HPROF enabled: <tt>java -agentlib:hprof=file=</tt><em>file</em><tt>,format=b</tt> <em>application</em>; then Control-"
        </li>
        <li>Start the application with HPROF enabled: <tt>java -agentlib:hprof=heap=dump</tt> <em>application</em>
        </li>
        <li>JConsole tool, MBeans tab
        </li>
        <li>Start VM with <tt>-XX:+HeapDumpOnOutOfMemoryError</tt>; if <tt>OutOfMemoryError</tt> is thrown, VM generates a heap dump.
        </li>
    </ul>
    </li>
    <li>Browse Java heap dump:
    <ul>
        <li><tt>jhat</tt> <em>heap-dump-file</em></li>
    </ul>
    </li>
    <li>Dump Java heap from core file in binary format to a file:
    <ul>
        <li><tt>jmap -dump:format=b,file=</tt><em>filename corefile</em> </li>
    </ul>
    </li>
    <li>Get a heap histogram for a process:
    <ul>
        <li>Start Java process with <tt>-XX:+PrintClassHistogram</tt>, then Control-" </li>
        <li><tt>jmap -histo</tt> <em>pid</em> (with <tt>-F</tt> option if <em>pid</em> does not respond)</li>
    </ul>
    </li>
    <li>Get a heap histogram from a core file:
    <ul>
        <li><tt>jmap -histo</tt> <em>corefile</em></li>
    </ul>
    </li>
    <li>Print shared object mappings from a core file:
    <ul>
        <li><tt>jmap</tt> <em>corefile</em></li>
    </ul>
    </li>
    <li>Print heap summary from a core file:
    <ul>
        <li><tt>jmap -heap</tt> <em>corefile</em></li>
    </ul>
    </li>
    <li>Print finalization information from a core file:
    <ul>
        <li><tt>jmap -finalizerinfo</tt> <em>corefile</em></li>
    </ul>
    </li>
    <li>Print Java configuration information from a core file:
    <ul>
        <li><tt>jinfo</tt> <em>corefile</em></li>
    </ul>
    </li>
    <li>Print thread trace from a core file:
    <ul>
        <li><tt>jstack</tt> <em>corefile</em></li>
    </ul>
    </li>
    <li>Print lock information from a core file:
    <ul>
        <li><tt>jstack -l</tt> <em>corefile</em></li>
    </ul>
    </li>
    <li>Attach the command-line debugger to a core file on the same machine:
    <ul>
        <li><tt>jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:javaExecutable=</tt><em>path</em><tt>,core=</tt><em>corefile</em>
        </li>
    </ul>
    </li>
    <li>Attach the command-line debugger to a core file on a different machine:
    <ul>
        <li>On the machine with the core file: <tt>jsadebugd </tt> <em>path corefile</em>
        <br />
        and on the machine with the debugger: <tt>jdb -connect
        sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=</tt><em>machine</em>
        </li>
    </ul>
    </li>
    <li><tt>libumem</tt> can be used to debug memory leaks.
    </li>
</ul>
<h3>Monitoring</h3>
<p>Note: The <em>vmID</em> argument for the <tt>jstat</tt> command is the virtual machine identifier.
See the <a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jstat.html"><tt>jstat</tt> man page</a> for a detailed explanation.
</p>
<ul>
    <li>Print statistics on the class loader:
    <ul>
        <li><tt>jstat -class</tt> <em>vmID</em>
        </li>
    </ul>
    </li>
    <li>Print statistics on the compiler:
    <ul>
        <li>Compiler behavior: <tt>jstat -compiler</tt> <em>vmID</em>
        </li>
        <li>Compilation method statistics: <tt>jstat -printcompilation</tt> <em>vmID</em>
        </li>
    </ul>
    </li>
    <li>Print statistics on garbage collection:
    <ul>
        <li>Summary of statistics: <tt>jstat -gcutil</tt> <em>vmID</em>
        </li>
        <li>Summary of statistics, with causes: <tt>jstat -gccause</tt> <em>vmID</em>
        </li>
        <li>Behavior of the gc heap: <tt>jstat -gc</tt> <em>vmID</em>
        </li>
        <li>Capacities of all the generations: <tt>jstat -gccapacity</tt> <em>vmID</em>
        </li>
        <li>Behavior of the new generation: <tt>jstat -gcnew</tt> <em>vmID</em>
        </li>
        <li>Capacity of the new generation: <tt>jstat -gcnewcapacity</tt> <em>vmID</em>
        </li>
        <li>Behavior of the old and permanent generations: <tt>jstat -gcold</tt> <em>vmID</em>
        </li>
        <li>Capacity of the old generation: <tt>jstat -gcoldcapacity</tt> <em>vmID</em>
        </li>
        <li>Capacity of the permanent generation: <tt>jstat -gcpermcapacity</tt> <em>vmID</em>
        </li>
    </ul>
    </li>
    <li>Monitor objects awaiting finalization:
    <ul>
        <li>JConsole tool, VM Summary tab</li>
        <li><tt>jmap -finalizerinfo</tt> <em>pid</em></li>
        <li><tt>getObjectPendingFinalizationCount</tt> method in <tt>java.lang.management.MemoryMXBean</tt> class
        </li>
    </ul>
    </li>
    <li>Monitor memory:
    <ul>
        <li>Heap allocation profiles via HPROF: <tt>java -agentlib:hprof=heap=sites</tt>
        </li>
        <li>JConsole tool, Memory tab
        </li>
        <li>Control-" prints generation information.
        </li>
    </ul>
    </li>
    <li>Monitor CPU usage:
    <ul>
        <li>By thread stack: <tt>java -agentlib:hprof=cpu=samples</tt> <em>application</em>
        </li>
        <li>By method: <tt>java -agentlib:hprof=cpu=times</tt> <em>application</em>
        </li>
        <li>JConsole tool, Overview and VM Summary tabs
        </li>
    </ul>
    </li>
    <li>Monitor thread activity:
    <ul>
        <li>JConsole tool, Threads tab</li>
    </ul>
    </li>
    <li>Monitor class activity:
    <ul>
        <li>JConsole tool, Classes tab</li>
    </ul>
    </li>
</ul>
<h3>Actions on a Remote Debug Server</h3>
<p>First, attach the debug daemon <tt>jsadebugd</tt>, then execute the command:
</p>
<ul>
    <li>Dump Java heap in binary format to a file: <tt>jmap -dump:format=b,file=</tt><em>filename hostID</em>
    </li>
    <li>Print shared object mappings: <tt>jmap</tt> <em>hostID</em>
    </li>
    <li>Print heap summary : <tt>jmap -heap</tt> <em>hostID</em>
    </li>
    <li>Print finalization information : <tt>jmap -finalizerinfo</tt> <em>hostID</em>
    </li>
    <li>Print lock information : <tt>jstack -l</tt> <em>hostID</em>
    </li>
    <li>Print thread trace : <tt>jstack</tt> <em>hostID</em>
    </li>
    <li>Print Java configuration information: <tt>jinfo</tt> <em>hostID</em>
    </li>
</ul>
<h3>Other Functions</h3>
<ul>
    <li>Interface with the instrumented Java virtual machines:
    <ul>
        <li>Monitor for the creation and termination of instrumented VMs: <tt>jstatd</tt> daemon
        </li>
        <li>List the instrumented VMs: <tt>jps</tt>
        </li>
        <li>Provide interface between remote monitoring tools and local VMs: <tt>jstatd</tt> daemon
        </li>
        <li>Request garbage collection: JConsole tool, Memory tab
        </li>
    </ul>
    </li>
    <li>Print Java configuration information from a running process:
    <ul>
        <li><tt>jinfo</tt> <em>pid</em></li>
    </ul>
    </li>
    <li>Dynamically set, unset, or change the value of certain Java VM flags for a process:
    <ul>
        <li><tt>jinfo -flag</tt> <em>flag</em></li>
    </ul>
    </li>
    <li>Print command-line flags passed to the VM:
    <ul>
        <li><tt>jinfo -flags</tt></li>
    </ul>
    </li>
    <li>Print Java system properties:
    <ul>
        <li><tt>jinfo -sysprops</tt></li>
    </ul>
    </li>
    <li>Pass a Java VM flag to the virtual machine:
    <ul>
        <li><tt>jconsole -J</tt><em>flag</em> ...
        </li>
        <li><tt>jhat -J</tt><em>flag</em> ...
        </li>
        <li><tt>jmap -J</tt><em>flag</em> ...
        </li>
    </ul>
    </li>
    <li>Print statistics of permanent generation of Java heap, by class loader:
    <ul>
        <li><tt>jmap -permstat</tt></li>
    </ul>
    </li>
    <li>Report on monitor contention.
    <ul>
        <li><tt>java -agentlib:hprof=monitor=y</tt> <em>application</em></li>
    </ul>
    </li>
    <li>Evaluate or execute a script in interactive or batch mode:
    <ul>
        <li><tt>jrunscript</tt></li>
    </ul>
    </li>
    <li>Interface dynamically with an MBean, via JConsole tool, MBean tab:
    <ul>
        <li>Show tree structure.
        </li>
        <li>Set an attribute value.
        </li>
        <li>Invoke an operation.
        </li>
        <li>Subscribe to notification.
        </li>
    </ul>
    </li>
    <li>Run interactive command-line debugger:
    <ul>
        <li>Launch a new VM for the class: <tt>jdb</tt> <em>class</em>
        </li>
        <li>Attach debugger to a running VM: <tt>jdb -attach</tt> <em>address</em></li>
    </ul>
    http://www.blogjava.net/justinchen/archive/2009/01/08/248738.html
    </li>
</ul>
<img src ="http://www.blogjava.net/stephen80/aggbug/304998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2009-12-07 14:16 <a href="http://www.blogjava.net/stephen80/archive/2009/12/07/304998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java performance </title><link>http://www.blogjava.net/stephen80/archive/2009/07/22/287892.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Wed, 22 Jul 2009 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2009/07/22/287892.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/287892.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2009/07/22/287892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/287892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/287892.html</trackback:ping><description><![CDATA[experience learned.<br />
<br />
1. first think algorithm before concurrent<br />
2. first solve top problem<br />
3. memory can be problem with huge data processing<br />
4.&nbsp; not to use refletion frequently<br />
5. prefering strategy that can optimize both cpu and memory .<br />
<br />
technical <br />
1. thread synchronizing is how to queuing<br />
&nbsp;&nbsp; be sure to use "while(!Thread.currentThread.isInterupted())<br />
<br />
2. prefer high level&nbsp; synchronizing facility to low level methodology such as await,notify<br />
<br />
3. dedicated sorter is much faster<br />
<br />
<br />
&nbsp; <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/287892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2009-07-22 18:07 <a href="http://www.blogjava.net/stephen80/archive/2009/07/22/287892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个性能的注意点</title><link>http://www.blogjava.net/stephen80/archive/2007/09/26/148247.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Wed, 26 Sep 2007 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/26/148247.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/148247.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/26/148247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/148247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/148247.html</trackback:ping><description><![CDATA[<br />
http://www.xker.com/edu/dev/104/0652109570034579.html<br />
<br />
<span class="style1">
<h3><font color="#ff0000">十二、不要在循环中调用synchronized(</font>同步)方法 </h3>
<br />
方法的同步需要消耗相当大的资料，在一个循环中调用它绝对不是一个好主意。<br />
<br />
例子：<br />
import java.util.Vector;<br />
public class SYN {<br />
&nbsp;&nbsp;&nbsp;&nbsp;public synchronized void method (Object o) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;private void test () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; vector.size(); i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method (vector.elementAt(i));&nbsp;&nbsp;&nbsp;&nbsp;// violation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Vector vector = new Vector (5, 5);<br />
}<br />
<br />
更正：<br />
不要在循环体中调用同步方法，如果必须同步的话，推荐以下方式：<br />
import java.util.Vector;<br />
public class SYN {<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void method (Object o) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
private void test () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;synchronized{//在一个同步块中执行非同步方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; vector.size(); i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method (vector.elementAt(i));&nbsp;&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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Vector vector = new Vector (5, 5);<br />
}<br />
<br />
<br />
</span><span class="style1">
<h3><font color="#ff0000">十三、将try/catch</font>块移出循环</h3>
<br />
把try/catch块放入循环体内，会极大的影响性能，如果编译JIT被关闭或者你所使用的是一个不带JIT的JVM，性能会将下降21%之多!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
例子：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
import java.io.FileInputStream;<br />
public class TRY {<br />
&nbsp;&nbsp;&nbsp;&nbsp;void method (FileInputStream fis) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; size; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// violation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_sum += fis.read();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;private int _sum;<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
更正：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
将try/catch块移出循环&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;void method (FileInputStream fis) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; size; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_sum += fis.read();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
参考资料：<br />
Peter Haggar: "Practical Java - Programming Language Guide".<br />
Addison Wesley, 2000, pp.81 &#8211; 83<br />
<br />
<br />
</span><span class="style1">
<h3><font color="#ff0000">十九、不要在循环体中实例化变量</font></h3>
<br />
在循环体中实例化临时变量将会增加内存消耗<br />
<br />
例子：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
import java.util.Vector;<br />
public class LOOP {<br />
&nbsp;&nbsp;&nbsp;&nbsp;void method (Vector v) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0;i &lt; v.size();i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object o = new Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o = v.elementAt(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
更正：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
在循环体外定义变量，并反复使用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
import java.util.Vector;<br />
public class LOOP {<br />
&nbsp;&nbsp;&nbsp;&nbsp;void method (Vector v) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object o;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0;i&lt;v.size();i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o = v.elementAt(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span class="style1">
<h3><font color="#ff0000">二十一、尽可能的使用栈变量</font></h3>
<br />
如果一个变量需要经常访问，那么你就需要考虑这个变量的作用域了。static? local?还是实例变量？访问静态变量和实例变量将会比访问局部变量多耗费2-3个时钟周期。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
例子：<br />
public class USV {<br />
&nbsp;&nbsp;&nbsp;&nbsp;void getSum (int[] values) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i &lt; value.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_sum += value[i];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// violation.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;void getSum2 (int[] values) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i &lt; value.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_staticSum += value[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;private int _sum;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private static int _staticSum;<br />
}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
更正：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
如果可能，请使用局部变量作为你经常访问的变量。<br />
你可以按下面的方法来修改getSum()方法：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
void getSum (int[] values) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int sum = _sum;&nbsp;&nbsp;// temporary local variable.<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i &lt; value.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum += value[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;_sum = sum;<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
参考资料：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Peter Haggar: "Practical Java - Programming Language Guide".<br />
Addison Wesley, 2000, pp.122 &#8211; 125<br />
<br />
</span><span class="style1"><br />
<br />
</span>
<img src ="http://www.blogjava.net/stephen80/aggbug/148247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-26 10:59 <a href="http://www.blogjava.net/stephen80/archive/2007/09/26/148247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大量字符串操作中的性能问题</title><link>http://www.blogjava.net/stephen80/archive/2007/09/26/148224.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Wed, 26 Sep 2007 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/26/148224.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/148224.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/26/148224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/148224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/148224.html</trackback:ping><description><![CDATA[http://www.javafan.net/menu/jczs/200701/20070108185247.html<br />
<br />
1). 简单的认为 .append() 效率好于 "+" 是错误的！<br />
&nbsp;&nbsp;&nbsp; 2). 不要使用 new 创建 String<br />
&nbsp;&nbsp;&nbsp; 3). 注意 .intern() 的使用<br />
&nbsp;&nbsp;&nbsp; 4). 在编译期能够确定字符串值的情况下，使用"+"效率最高<br />
&nbsp;&nbsp;&nbsp; 5). 避免使用 "+=" 来构造字符串<br />
&nbsp;&nbsp;&nbsp; 6). 在声明StringBuffer对象的时候，指定合适的capacity，不要使用默认值(18)<br />
&nbsp;&nbsp;&nbsp; 7). 注意以下二者的区别不一样<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - String s = "a" + "b";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - String s = "a";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s += "b";<br />
<br />
<strong>关键点</strong><br />
1.&nbsp;无论何时只要可能的话使用字符串字面量来常见字符串而不是使用new关键字来创建字符串。<br />
2.&nbsp;无论何时当你要使用new关键字来创建很多内容重复的字符串的话，请使用String.intern()方法。<br />
3.&nbsp;+操作符会为字符串连接提供最佳的性能――当字符串是在编译期决定的时候。<br />
4.&nbsp;如果字符串在运行期决定，使用一个合适的初期容量值初始化的StringBuffer会为字符串连接提供最佳的性能。<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/148224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-26 10:14 <a href="http://www.blogjava.net/stephen80/archive/2007/09/26/148224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重归简约</title><link>http://www.blogjava.net/stephen80/archive/2007/09/14/145158.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Fri, 14 Sep 2007 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/14/145158.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/145158.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/14/145158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/145158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/145158.html</trackback:ping><description><![CDATA[经过一段时间的折腾。一堆东西能避免使用就避免使用。<br />
<br />
<br />
castor, dwr, acegi, 几乎扔掉。<br />
<br />
spring ，hibernate 也只用在适当的场合。<br />
<br />
struts2 ,也只用在适当的场合。<br />
<br />
<br />
一些偷懒的技术，尽量避免。<br />
opensession in view.<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/145158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-14 15:52 <a href="http://www.blogjava.net/stephen80/archive/2007/09/14/145158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重新评估 solr</title><link>http://www.blogjava.net/stephen80/archive/2007/09/07/143491.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Fri, 07 Sep 2007 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/07/143491.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/143491.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/07/143491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/143491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/143491.html</trackback:ping><description><![CDATA[<h3 class="boxed">一直困扰于 indexSearcher 的重新 new ,query filter 的cache 没了。</h3>
重读solr ，发现非常好。也许我应该考虑用 solr 了。<br />
<br />
<h3 class="boxed"><br />
</h3>
<h3 class="boxed">Caching</h3>
<ul>
    <li>Configurable Query Result, Filter, and Document cache instances</li>
    <li>Pluggable Cache implementations</li>
    <li>Cache warming in background
    <ul>
        <li>
        When a new searcher is opened, configurable searches are run against it
        in order to warm it up to avoid slow first hits. During warming, the
        current searcher handles live requests. </li>
    </ul>
    </li>
    <li>Autowarming in background
    <ul>
        <li>The
        most recently accessed items in the caches of the current searcher are
        re-populated in the new searcher, enabing high cache hit rates across
        index/searcher changes.</li>
    </ul>
    </li>
    <li>Fast/small filter implementation</li>
    <li>User level caching with autowarming support</li>
</ul>
9-26<br />
&nbsp; 今天，我发现，我可以用不同的方式实现cache ，也许在我的情况下比solr 的方式更好。<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/143491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-07 17:18 <a href="http://www.blogjava.net/stephen80/archive/2007/09/07/143491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于j2ee 性能的一个课题</title><link>http://www.blogjava.net/stephen80/archive/2007/09/06/143275.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Thu, 06 Sep 2007 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/06/143275.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/143275.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/06/143275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/143275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/143275.html</trackback:ping><description><![CDATA[在一台 8G ，2 dual core cpu 的2u ， struts2+spring+hibernate .<br />
开源软件，用什么样的 proxy, cache, web container 达到最好的性能。<br />
<br />
瓶颈在于：<br />
&nbsp;tomcat 只能用到2g ram<br />
<br />
经过研究，<br />
xmx 在windows 2003,jdk1.5.06 ,1999M. <br />
所以如果是一台单纯的web container server 就不要搞8G了， 1U 的4G ok.<br />
<br />
需要用到那么高的性能场景，只能是两台1U做 banlance.<br />
<br />
再次研究<br />
用 session stick ，balance 2 个　tomcat ,应该可以达到较好的性能。<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/143275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-06 20:55 <a href="http://www.blogjava.net/stephen80/archive/2007/09/06/143275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c3p0 ,hibernate 配置，spring</title><link>http://www.blogjava.net/stephen80/archive/2007/09/06/143150.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Thu, 06 Sep 2007 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/06/143150.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/143150.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/06/143150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/143150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/143150.html</trackback:ping><description><![CDATA[http://www.mchange.com/projects/c3p0/#configuration_properties<br />
<br />
<br />
spring+hibernate<br />
&nbsp;&nbsp;&nbsp; <br />
连接池<br />
<br />
&lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"&gt;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverClass" value="com.mysql.jdbc.Driver"/&gt;<br />
&lt;property name="jdbcUrl" value="jdbc:mysql://localhost:3306/openfire"/&gt;<br />
&lt;property name="user" value="root"/&gt;<br />
&lt;property name="password" value="password"/&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&lt;/beans&gt;<br />
<br />
tomcat jndi:<br />
<br />
&lt;Resource auth="Container"
description="DB Connection"
driverClass="com.mysql.jdbc.Driver"
maxPoolSize="4"
minPoolSize="2"
acquireIncrement="1"
name="jdbc/TestDB"
user="test"
password="ready2go"
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
jdbcUrl="jdbc:mysql://localhost:3306/test?autoReconnect=true" /&gt;<br />
<br />
<br />
<br />
<br />
<br />
<br />
建议：c3p0.propertyies<br />
<br />
c3p0.acquireIncrement=5&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
c3p0.idleConnectionTestPeriod=1800&nbsp;&nbsp;&nbsp; <br />
c3p0.initialPoolSize=5&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
c3p0.maxIdleTime=1000<br />
c3p0.maxPoolSize=20&nbsp;&nbsp;&nbsp; <br />
c3p0.maxStatements=100&nbsp;&nbsp;&nbsp; <br />
c3p0.minPoolSize=5<br />
<br />
<br />
just hibernate:<br />
hibernate.connection.provider_class＝org.hibernate.connection.C3P0ConnectionProvider <br />
<br />
<br />
调优：在我的环境下<br />
maxpoolSize 30, 1822 ， 15， 1655 。 可能和测试过程有关。<br />
maxStatement 加上， 3600。严重影响性能。<br />
<br />
扩大 xms xmx 512 ,957<br />
<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/143150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-06 13:16 <a href="http://www.blogjava.net/stephen80/archive/2007/09/06/143150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tree ，hibernate,  db hierarchical </title><link>http://www.blogjava.net/stephen80/archive/2007/09/05/142887.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Wed, 05 Sep 2007 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/05/142887.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/142887.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/05/142887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/142887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/142887.html</trackback:ping><description><![CDATA[tree 结构很常见，当persist 到数据库中。<br />
<br />
有些操作，在db 中更好。<br />
<br />
1。取得所有的叶子节点。<br />
<br />
SELECT Name FROM Projects p
WHERE NOT EXISTS(
SELECT * FROM Projects
WHERE Parent=p.VertexId)<br />
<br />
2。multilevel operation ，用数据库的辅助表， 用triger 。<br />
<pre>CREATE TABLE ProjectPaths(<br />
<br />
VertexId INTEGER,<br />
<br />
Depth INTEGER,<br />
<br />
Path VARCHAR(300) 。<br />
<br />
<br />
<br />
)</pre>
3. 用 hibernate 时，如果 stack over flow,考虑用 stack 代替recursive algrithm<br />
<br />
<pre><strong>public</strong> <strong>void</strong> <span class="color2040A0">traverseDepthFirst</span><span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">AST</span> <span class="color2040A0">ast</span> <span class="color4444FF"><strong>)</strong></span><br />
<span class="color4444FF"><strong>{</strong></span><br />
<span class="color444444">//  Root AST node cannot be null or</span><br />
<span class="color444444">//  traversal of its subtree is impossible.</span><br />
<strong>if</strong> <span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">ast</span> <span class="color4444FF">=</span><span class="color4444FF">=</span> <strong>null</strong> <span class="color4444FF"><strong>)</strong></span><br />
<span class="color4444FF"><strong>{</strong></span><br />
<strong>throw</strong> <strong>new</strong> <span class="color2040A0">IllegalArgumentException</span><span class="color4444FF"><strong>(</strong></span><br />
<span class="color008000">"node to traverse cannot be null!"</span> <span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<span class="color4444FF"><strong>}</strong></span><br />
<span class="color444444">//  Map to hold parents of each</span><br />
<span class="color444444">//  AST node.  Unfortunately the AST</span><br />
<span class="color444444">//  interface does not provide a method</span><br />
<span class="color444444">//  for finding the parent of a node, so</span><br />
<span class="color444444">//  we use the Map to save them.</span><br />
<br />
<span class="color2040A0">Map</span> <span class="color2040A0">parentNodes</span> <span class="color4444FF">=</span> <strong>new</strong> <span class="color2040A0">HashMap</span><span class="color4444FF"><strong>(</strong></span><span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<span class="color444444">//  Start tree traversal with first child</span><br />
<span class="color444444">//  of the specified root AST node.</span><br />
<br />
<span class="color2040A0">AST</span> <span class="color2040A0">currentNode</span> <span class="color4444FF">=</span> <span class="color2040A0">ast</span>.<span class="color2040A0">getFirstChild</span><span class="color4444FF"><strong>(</strong></span><span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<span class="color444444">//  Remember parent of first child.</span><br />
<br />
<span class="color2040A0">parentNodes</span>.<span class="color2040A0">put</span><span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">currentNode</span> , <span class="color2040A0">ast</span> <span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<span class="color444444">//  Iterate through nodes, simulating</span><br />
<span class="color444444">//  recursive tree traversal, and add them</span><br />
<span class="color444444">//  to queue in proper order for later</span><br />
<span class="color444444">//  linear traversal.  This "flattens" the</span><br />
<span class="color444444">//  into a linear list of nodes which can</span><br />
<span class="color444444">//  be visited non-recursively.</span><br />
<br />
<strong>while</strong> <span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">currentNode</span> <span class="color4444FF">!</span><span class="color4444FF">=</span> <strong>null</strong> <span class="color4444FF"><strong>)</strong></span><br />
<span class="color4444FF"><strong>{</strong></span><br />
<span class="color444444">//  Visit the current node.</span><br />
<br />
<span class="color2040A0">strategy</span>.<span class="color2040A0">visit</span><span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">currentNode</span> <span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<span class="color444444">//  Move down to current node's first child</span><br />
<span class="color444444">//  if it exists.</span><br />
<br />
<span class="color2040A0">AST</span> <span class="color2040A0">childNode</span>   <span class="color4444FF">=</span> <span class="color2040A0">currentNode</span>.<span class="color2040A0">getFirstChild</span><span class="color4444FF"><strong>(</strong></span><span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<span class="color444444">//  If the child is not null, make it</span><br />
<span class="color444444">//  the current node.</span><br />
<br />
<strong>if</strong> <span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">childNode</span> <span class="color4444FF">!</span><span class="color4444FF">=</span> <strong>null</strong> <span class="color4444FF"><strong>)</strong></span><br />
<span class="color4444FF"><strong>{</strong></span><br />
<span class="color444444">//  Remember parent of the child.</span><br />
<br />
<span class="color2040A0">parentNodes</span>.<span class="color2040A0">put</span><span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">childNode</span> , <span class="color2040A0">currentNode</span> <span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<span class="color444444">//  Make child the current node.</span><br />
<br />
<span class="color2040A0">currentNode</span> <span class="color4444FF">=</span> <span class="color2040A0">childNode</span><span class="color4444FF">;</span><br />
<br />
<strong>continue</strong><span class="color4444FF">;</span><br />
<span class="color4444FF"><strong>}</strong></span><br />
<br />
<strong>while</strong> <span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">currentNode</span> <span class="color4444FF">!</span><span class="color4444FF">=</span> <strong>null</strong> <span class="color4444FF"><strong>)</strong></span><br />
<span class="color4444FF"><strong>{</strong></span><br />
<span class="color444444">//  Move to next sibling if any.</span><br />
<br />
<span class="color2040A0">AST</span> <span class="color2040A0">siblingNode</span> <span class="color4444FF">=</span> <span class="color2040A0">currentNode</span>.<span class="color2040A0">getNextSibling</span><span class="color4444FF"><strong>(</strong></span><span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<strong>if</strong> <span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">siblingNode</span> <span class="color4444FF">!</span><span class="color4444FF">=</span> <strong>null</strong> <span class="color4444FF"><strong>)</strong></span><br />
<span class="color4444FF"><strong>{</strong></span><br />
<span class="color444444">//  Get current node's parent.</span><br />
<span class="color444444">//  This is also the parent of the</span><br />
<span class="color444444">//  sibling node.</span><br />
<br />
<span class="color2040A0">AST</span> <span class="color2040A0">parentNode</span>  <span class="color4444FF">=</span> <span class="color4444FF"><strong>(</strong></span><span class="color2040A0">AST</span><span class="color4444FF"><strong>)</strong></span><span class="color2040A0">parentNodes</span>.<span class="color2040A0">get</span><span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">currentNode</span> <span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<span class="color444444">//  Remember parent of sibling.</span><br />
<br />
<span class="color2040A0">parentNodes</span>.<span class="color2040A0">put</span><span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">siblingNode</span> , <span class="color2040A0">parentNode</span> <span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<span class="color444444">//  Make sibling the current node.</span><br />
<br />
<span class="color2040A0">currentNode</span>     <span class="color4444FF">=</span> <span class="color2040A0">siblingNode</span><span class="color4444FF">;</span><br />
<br />
<strong>break</strong><span class="color4444FF">;</span><br />
<span class="color4444FF"><strong>}</strong></span><br />
<span class="color444444">//  Move up to parent if no sibling.</span><br />
<span class="color444444">//  If parent is root node, we're done.</span><br />
<br />
<span class="color2040A0">currentNode</span> <span class="color4444FF">=</span> <span class="color4444FF"><strong>(</strong></span><span class="color2040A0">AST</span><span class="color4444FF"><strong>)</strong></span><span class="color2040A0">parentNodes</span>.<span class="color2040A0">get</span><span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">currentNode</span> <span class="color4444FF"><strong>)</strong></span><span class="color4444FF">;</span><br />
<br />
<strong>if</strong> <span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">currentNode</span>.<span class="color2040A0">equals</span><span class="color4444FF"><strong>(</strong></span> <span class="color2040A0">ast</span> <span class="color4444FF"><strong>)</strong></span> <span class="color4444FF"><strong>)</strong></span><br />
<span class="color4444FF"><strong>{</strong></span><br />
<span class="color2040A0">currentNode</span> <span class="color4444FF">=</span> <strong>null</strong><span class="color4444FF">;</span><br />
<span class="color4444FF"><strong>}</strong></span><br />
<span class="color4444FF"><strong>}</strong></span><br />
<span class="color4444FF"><strong>}<br />
<br />
</strong></span></pre>
<br />
<br />
<br />
参考:<br />
<br />
http://wordhoard.northwestern.edu/userman/hibernatechanges.html<br />
<br />
《Tansact Sql cookbook.》<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/142887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-05 14:18 <a href="http://www.blogjava.net/stephen80/archive/2007/09/05/142887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 的几个注意点</title><link>http://www.blogjava.net/stephen80/archive/2007/09/05/142860.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Wed, 05 Sep 2007 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/05/142860.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/142860.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/05/142860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/142860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/142860.html</trackback:ping><description><![CDATA[一、one-many ，需要一个有序的list. 建议影射方式 ：<br />
<br />
private List _items; <br />
<br />
&lt;bag<br />
name="items"<br />
inverse="true"&nbsp;&nbsp; //尽量使用双向关联<br />
order-by="DATE_TIME"<br />
cascade="all"&gt;<br />
&lt;key column="BLOG_ID"/&gt;<br />
&lt;one-to-many class="BlogItem"/&gt;<br />
&lt;/bag&gt;<br />
<br />
<br />
many-to-many ,建议用 set<br />
<br />
<br />
<br />
二、one-to-one 适用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过主键进行关联<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 相当于把大表拆分为多个小表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 例如把大字段单独拆分出来，以提高数据库操作的性能<br />
<br />
三、composite element ,必须依赖的导航关系<br />
<br />
&nbsp;&lt;list name="lineItems" table="line_items"&gt;<br />
&lt;key column="order_id"/&gt;<br />
&lt;list-index column="line_number"/&gt;<br />
&lt;composite-element class="LineItem"&gt;<br />
&lt;property name="quantity"/&gt;<br />
&lt;many-to-one name="product" column="product_id"/&gt;<br />
&lt;/composite-element&gt;<br />
&lt;/list&gt;<br />
<br />
四、 one-one formula , 很复杂，有点不明白<br />
<br />
&nbsp;&lt;class name="Person"&gt;<br />
&lt;id name="name"/&gt;<br />
&lt;one-to-one name="address"<br />
cascade="all"&gt;<br />
&lt;formula&gt;name&lt;/formula&gt;<br />
&lt;formula&gt;'HOME'&lt;/formula&gt;<br />
&lt;/one-to-one&gt;<br />
&lt;one-to-one name="mailingAddress"<br />
cascade="all"&gt;<br />
&lt;formula&gt;name&lt;/formula&gt;<br />
&lt;formula&gt;'MAILING'&lt;/formula&gt;<br />
&lt;/one-to-one&gt;<br />
&lt;/class&gt;<br />
&lt;class name="Address" batch-size="2"<br />
check="addressType in ('MAILING', 'HOME', 'BUSINESS')"&gt;<br />
&lt;composite-id&gt;<br />
&lt;key-many-to-one name="person"<br />
column="personName"/&gt;<br />
&lt;key-property name="type"<br />
column="addressType"/&gt;<br />
&lt;/composite-id&gt;<br />
&lt;property name="street" type="text"/&gt;<br />
&lt;property name="state"/&gt;<br />
&lt;property name="zip"/&gt;<br />
&lt;/class&gt;<br />
<br />
<br />
五、继承关系， per subclass table ，no discriminator ,joined-subclass<br />
<br />
<br />
<br />
<br />
六、tree<br />
拷贝： http://www.thogau.net/tutorials/tree/tutorial02-01.jsp <br />
<br />
<br />
package net.thogau.website.model;<br />
<br />
import java.io.Serializable;<br />
import java.util.ArrayList;<br />
import java.util.List;<br />
<br />
import org.apache.commons.lang.builder.EqualsBuilder;<br />
import org.apache.commons.lang.builder.HashCodeBuilder;<br />
import org.apache.commons.lang.builder.ToStringBuilder;<br />
import org.apache.commons.lang.builder.ToStringStyle;<br />
<br />
/**<br />
&nbsp;* This class implements a persisted tree node.<br />
&nbsp;* <br />
&nbsp;* @author &lt;a href="mailto:thogau@thogau.net"&gt;thogau&lt;/a&gt;<br />
&nbsp;* <br />
&nbsp;* @struts.form include-all="false" extends="BaseForm"<br />
&nbsp;* @hibernate.class table="node"<br />
&nbsp;*/<br />
public class Node extends BaseObject implements Serializable {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // mapped to primary key in node table<br />
&nbsp;&nbsp;&nbsp; protected Long id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected String name;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected Node parent = null;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; protected List children = new ArrayList();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.id column="id" generator-class="native" unsaved-value="null"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @struts.form-field<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Long getId() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return id;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setId(Long id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.id = id;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Returns the node name.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.property column="name" not-null="true" unique="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @struts.form-field<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @struts.validator type="required"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Returns the node's children.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return List<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.list cascade="all-delete-orphan" inverse="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.collection-one-to-many class="net.thogau.website.model.Node"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.collection-index column="position"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.collection-key column="parent_id"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @struts.form-field<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public List getChildren() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return children;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setChildren(List children) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.children = children;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Returns the position of the node in the children list (if it has parent).<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return int<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.property column="position"<br />
&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int getPosition() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return parent.getChildren().indexOf(this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(NullPointerException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if it has no parent, position makes no sense<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void setPosition(int position) { /* not used */ }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Returns the node's parent.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return Node<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.many-to-one column = "parent_id" class="net.thogau.website.model.Node" cascade = "none"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @hibernate.column name="parent_id"<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Node getParent() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return parent;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void setParent(Node n) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.parent = n;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see java.lang.Object#equals(Object)<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public boolean equals(Object object) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(object instanceof Node)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node rhs = (Node) object;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new EqualsBuilder().append(this.name, rhs.name).append(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.children, rhs.children).append(this.parent, rhs.parent)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(this.id, rhs.id).isEquals();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see java.lang.Object#hashCode()<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public int hashCode() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new HashCodeBuilder(1036586079, -537109207).append(this.name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append(this.parent.getName()).append(this.id)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .toHashCode();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see java.lang.Object#toString()<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String toString() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("name", this.name).append("parent", this.parent)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .append("id", this.id).append("position", this.getPosition()).toString();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
}<br />
<br />
好像，equal ,hash 是必须的。<br />
<br />
# /** <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 树形遍历 <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 不用递归，用堆栈. <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 这里只是做为例子，本人不建议把业务逻辑封装在Entity层. <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp; public List getVisitResults() {&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List l = new ArrayList();&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stack s = new Stack();&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.push(this);&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (s.empty() == false) {&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cat c = (Cat) s.pop();&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l.add(c);&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List children = c.getChildren();&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (children != null) {&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt;&nbsp; hildren.size(); i++)&nbsp;&nbsp; {&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cat cat = (Cat) children.get(i);&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.push(cat);&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end for&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end if&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end while&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return l;&nbsp; <br />
#&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br />
<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/142860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-05 12:11 <a href="http://www.blogjava.net/stephen80/archive/2007/09/05/142860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lucene 的index 更新</title><link>http://www.blogjava.net/stephen80/archive/2007/09/04/142612.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Tue, 04 Sep 2007 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/04/142612.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/142612.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/04/142612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/142612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/142612.html</trackback:ping><description><![CDATA[searcher 新开后，cache 会失效。<br />
所以，重新开 searcher 的频率对于很重的访问量来说，不能太频繁。这样查询肯定有不能同步的问题。<br />
<br />
对于不要求同步的场景来说，够了。<br />
继续研究。<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/142612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-04 14:00 <a href="http://www.blogjava.net/stephen80/archive/2007/09/04/142612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>solr 部署</title><link>http://www.blogjava.net/stephen80/archive/2007/09/04/142611.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Tue, 04 Sep 2007 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/09/04/142611.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/142611.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/09/04/142611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/142611.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/142611.html</trackback:ping><description><![CDATA[在 conf/catalina/localhost/ 建 solr.xml<br />
<br />
jndi solr/home :<br />
<br />
&lt;Context docBase="D:\sourcecode\apache-solr\dist\solr.war" debug="0" crossContext="true" &gt;<br />
&nbsp;&nbsp; &lt;Environment name="solr/home" type="java.lang.String" value="D:\sourcecode\solr-sample\solr" override="true" /&gt;<br />
&lt;/Context&gt;<br />
<br />
solr/home 的结构<br />
conf<br />
data/index<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/142611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-09-04 13:53 <a href="http://www.blogjava.net/stephen80/archive/2007/09/04/142611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 ognl 与 jsp2.1 el 的冲突问题</title><link>http://www.blogjava.net/stephen80/archive/2007/08/29/140988.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Wed, 29 Aug 2007 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/29/140988.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/140988.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/29/140988.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/140988.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/140988.html</trackback:ping><description><![CDATA[tomcat6 , jetty6 采用 jsp2.1。 <br>由于 nio 带来的性能提升，tomcat6 不能被忽略。<br><br>办法1：<br><br><a title="http://www.devzuz.org/blogs/bporter/2006/08/05/1154706744655.html" href="http://www.devzuz.org/blogs/bporter/2006/08/05/1154706744655.html">http://www.devzuz.org/blogs/bporter/2006/08/05/1154706744655.html</a><br><br>&lt;ww:select list="#{'default' : 'Maven 2.x Repository', 'legacy' : 'Maven 1.x Repository'}" /&gt;<br><br>改用-------------------------------------------------------------<br>&lt;ww:select list="#@java.util.HashMap@{'default' : 'Maven 2.x Repository', 'legacy' : 'Maven 1.x Repository'}" /&gt;<br><br>这样 jsp2.1 el 就不会有问题了。<br><br>办法2： 对于旧的程序，不愿意改了，可以向后兼容<br><a title="http://today.java.net/lpt/a/272#backwards-compatibility" href="http://today.java.net/lpt/a/272#backwards-compatibility">http://today.java.net/lpt/a/272#backwards-compatibility</a><br><br><span></span><span>必须用 Servlet <strong class="highlight">2</strong>.<strong class="highlight">5</strong> XSD.
<br></span><font size="-1">&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee" version="<font color="#cc0033">2.5</font>" xmlns:xsi="http://www.<wbr>w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.<font color="#cc0033">xsd</font>"&gt; </font><span></span><br><br>
<pre><code>&lt;jsp-property-group&gt;<br>  &lt;deferred-syntax-allowed-as-literal&gt;<br>    true<br>  &lt;/deferred-syntax-allowed-as-literal&gt;<br><br><br>&lt;/jsp-property-group&gt;</code></pre>
或者在页面中<br>
<pre><code>&lt;%@page  language="java" deferredSyntaxAllowedAsLiteral="true" %&gt;<br><br>办法3 ：不用 jsp2.1 el<br><br></code>&gt;   &lt;jsp-config&gt;<br>&gt;     &lt;jsp-property-group&gt;<br>&gt;       &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br>&gt;       &lt;el-ignored&gt;true&lt;/el-ignored&gt;<br>&gt;     &lt;/jsp-property-group&gt;<br>&gt;   &lt;/jsp-config&gt;
<br><br><a href="http://www.mail-archive.com/dev@struts.apache.org/msg28920.html" title="http://www.mail-archive.com/dev@struts.apache.org/msg28920.html">http://www.mail-archive.com/dev@struts.apache.org/msg28920.html
</a><br>我现在的疑问<br>在一个页面中采用两个 el 引擎，是否会对性能造成一定影响？<br>较小。<br><br><br><br><br><br><br><br><br><code><br><br><br><br><br></code></pre>
<br><br><br><br>   <img src ="http://www.blogjava.net/stephen80/aggbug/140988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-29 17:00 <a href="http://www.blogjava.net/stephen80/archive/2007/08/29/140988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mod_cache </title><link>http://www.blogjava.net/stephen80/archive/2007/08/27/140067.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Mon, 27 Aug 2007 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/27/140067.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/140067.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/27/140067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/140067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/140067.html</trackback:ping><description><![CDATA[LoadModule cache_module modules/mod_cache.so<br>LoadModule disk_cache_module modules/mod_disk_cache.so<br>LoadModule mem_cache_module modules/mod_mem_cache.so<br><br>&lt;IfModule mod_cache.c&gt;<br>&nbsp;&nbsp;&nbsp; &lt;IfModule mod_mem_cache.c&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CacheEnable mem /images<br>&nbsp;&nbsp;&nbsp; CacheEnable mem /styles<br>&nbsp;&nbsp;&nbsp; CacheEnable mem /scripts<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MCacheSize 10240<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MCacheMaxObjectCount 100<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MCacheMinObjectSize 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MCacheMaxObjectSize 2048<br>&nbsp;&nbsp;&nbsp; &lt;/IfModule&gt;<br>&nbsp;&nbsp; <br>&lt;/IfModule&gt;<br><br><img src ="http://www.blogjava.net/stephen80/aggbug/140067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-27 17:44 <a href="http://www.blogjava.net/stephen80/archive/2007/08/27/140067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apach mod_http_proxy ,mod_rewrite 一起工作</title><link>http://www.blogjava.net/stephen80/archive/2007/08/27/140029.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Mon, 27 Aug 2007 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/27/140029.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/140029.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/27/140029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/140029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/140029.html</trackback:ping><description><![CDATA[LoadModule proxy_http_module modules/mod_proxy_http.so<br />
<br />
&lt;VirtualHost *:80&gt;<br />
&nbsp; <br />
<br />
RewriteLogLevel 3 <br />
RewriteLog "f:/temp/logs/lelerewrite.log"<br />
RewriteEngine&nbsp;&nbsp;&nbsp; on<br />
RewriteRule&nbsp;&nbsp;&nbsp; ^(.*)\.html$&nbsp;&nbsp;&nbsp; http://www.lele.com/ [P]<br />
<br />
&nbsp;ProxyPass /images !<br />
ProxyPass /styles !<br />
ProxyPass /scripts !<br />
&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp; ProxyPass / http://localhost:8082/<br />
&nbsp;ProxyPassReverse / http://localhost:8082/ <br />
&nbsp;ServerName www.lele.com:8082<br />
<br />
<br />
&nbsp;CustomLog logs/lele_access.log common<br />
<br />
DocumentRoot "D:/apachedocroot/www.lele.com/"<br />
<br />
&nbsp;<br />
<br />
&lt;Directory /&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; Options FollowSymLinks<br />
&nbsp;&nbsp;&nbsp; AllowOverride None<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; Order allow,deny<br />
&nbsp;&nbsp;&nbsp; Allow from all<br />
<br />
<br />
&lt;/Directory&gt;<br />
<br />
<br />
&lt;/VirtualHost&gt;<br />
<br />
一 、tomcat 中要配置：&lt;connector ,proxy ,&gt; .否则返回有问题。<br />
二、 mod_proxy_ajp 在 apr 情况下性能应该比 mod_http_proxy 好。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/140029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-27 16:48 <a href="http://www.blogjava.net/stephen80/archive/2007/08/27/140029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache access log，关闭缺省</title><link>http://www.blogjava.net/stephen80/archive/2007/08/27/139995.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Mon, 27 Aug 2007 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/27/139995.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/139995.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/27/139995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/139995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/139995.html</trackback:ping><description><![CDATA[关闭 缺省主机的 log<br>&nbsp;#customLog logs/access.log common<br><br>在 virtualhost 中加<br>&nbsp; CustomLog logs/lele_access.log common<br><br><img src ="http://www.blogjava.net/stephen80/aggbug/139995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-27 16:13 <a href="http://www.blogjava.net/stephen80/archive/2007/08/27/139995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache mod_rewrite</title><link>http://www.blogjava.net/stephen80/archive/2007/08/27/139910.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Mon, 27 Aug 2007 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/27/139910.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/139910.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/27/139910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/139910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/139910.html</trackback:ping><description><![CDATA[LoadModule mod_rewrite<br><br>在 &lt;virtualHost&gt; 中<br><br>RewriteLogLevel 3 <br>RewriteLog "f:/temp/logs/sosorewrite.log"<br>RewriteEngine&nbsp;&nbsp;&nbsp; on<br>RewriteRule&nbsp;&nbsp;&nbsp; ^(.*)\.html$&nbsp;&nbsp;&nbsp; /index.php <br> <img src ="http://www.blogjava.net/stephen80/aggbug/139910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-27 14:19 <a href="http://www.blogjava.net/stephen80/archive/2007/08/27/139910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 apache mod_proxy_ajp 与 tomcat 集成, 很简单的步骤</title><link>http://www.blogjava.net/stephen80/archive/2007/08/27/139846.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Mon, 27 Aug 2007 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/27/139846.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/139846.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/27/139846.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/139846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/139846.html</trackback:ping><description><![CDATA[一、修改 http.conf<br />
&nbsp;loadmodule mod_proxy<br />
&nbsp;loadmobule mod_proxy_ajp<br />
&nbsp;<br />
&nbsp;增加 <br />
&nbsp;<code>ProxyRequests Off<br />
<br />
&lt;Proxy *&gt;<br />
<span class="indent">Order
deny,allow<br />
Allow from all<br />
</span>&lt;/Proxy&gt;<br />
</code><br />
<br />
&lt;VirtualHost *:80&gt;<br />
&nbsp; <br />
&nbsp;ProxyPass /images !<br />
ProxyPass /styles !<br />
ProxyPass /scripts !<br />
&nbsp;&nbsp; <br />
&nbsp;ProxyPass / ajp://localhost:8009/<br />
&nbsp;ProxyPassReverse / ajp://localhost:8009/&nbsp;&nbsp; <br />
&nbsp;ServerName www.lele.com:8082<br />
<br />
<br />
&nbsp;CustomLog logs/lele_access.log common<br />
<br />
DocumentRoot "D:/apachedocroot/www.lele.com/"<br />
<br />
&nbsp;<br />
<br />
&lt;Directory /&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; Options FollowSymLinks<br />
&nbsp;&nbsp;&nbsp; AllowOverride None<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; Order allow,deny<br />
&nbsp;&nbsp;&nbsp; Allow from all<br />
<br />
<br />
&lt;/Directory&gt;<br />
<br />
<br />
&lt;/VirtualHost&gt;<br />
<br />
tomcat 不用做修改。<br />
安装 tomcat apr, 性能会比较好。<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/139846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-27 11:59 <a href="http://www.blogjava.net/stephen80/archive/2007/08/27/139846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习配置 apache 虚拟主机</title><link>http://www.blogjava.net/stephen80/archive/2007/08/27/139823.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Mon, 27 Aug 2007 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/27/139823.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/139823.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/27/139823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/139823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/139823.html</trackback:ping><description><![CDATA[一、 在 http.conf 末尾加<br><br>Listen 80<br><br>NameVirtualHost *:80<br><br>&lt;VirtualHost *:80&gt;<br><br>DocumentRoot "D:/apachedocroot/www.soso.com/"<br>ServerName www.soso.com<br><br><br>&lt;Directory /&gt;<br><br>&nbsp;&nbsp;&nbsp; Options FollowSymLinks<br>&nbsp;&nbsp;&nbsp; AllowOverride None<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; Order allow,deny<br>&nbsp;&nbsp;&nbsp; Allow from all<br><br>&lt;/Directory&gt;<br><br><br>&lt;/VirtualHost&gt;<br><br>&lt;VirtualHost *:80&gt;<br><br>DocumentRoot "D:/apachedocroot/static.soso.com/"<br>ServerName static.soso.com<br><br>&lt;Directory /&gt;<br><br>&nbsp;&nbsp;&nbsp; Options FollowSymLinks<br>&nbsp;&nbsp;&nbsp; AllowOverride None<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; Order allow,deny<br>&nbsp;&nbsp;&nbsp; Allow from all<br><br>&lt;/Directory&gt;<br><br>&lt;/VirtualHost&gt; <br><br>二、修改 hosts 文件<br>三、 httpd.ext -S 测试配置<br><br><br><img src ="http://www.blogjava.net/stephen80/aggbug/139823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-27 11:12 <a href="http://www.blogjava.net/stephen80/archive/2007/08/27/139823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2ee 员学习 配置 apache2.2.4  php 5.2.3</title><link>http://www.blogjava.net/stephen80/archive/2007/08/24/139174.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Fri, 24 Aug 2007 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/24/139174.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/139174.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/24/139174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/139174.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/139174.html</trackback:ping><description><![CDATA[只是愈多愈好。<br />
<br />
配置 apache2.2.4 ,php 5.2.3.<br />
<br />
1. 解压到 c:\php<br />
2. 拷贝 php.ini-dist 到 c:\windows 为 php.ini <br />
&nbsp;&nbsp;&nbsp; ** 不能用recommend**<br />
3. 拷贝 php5ts.dll 到 c:\windows\system32<br />
<br />
配置：apache ,http.conf<br />
1. LoadModule php5_module "c:/php/php5apache2_2.dll"<br />
&nbsp;&nbsp;&nbsp; ** 对应apache2.2 必须用这个**<br />
2. AddType application/x-httpd-php&nbsp; .php<br />
3. if module dir_modle ,<br />
&nbsp;&nbsp;&nbsp; DirectoryIndex&nbsp; index.php ,index.html<br />
<br />
配置php.ini ,启动 mysql<br />
extension=php_mysql.dll<br />
extension=php_mysqli.dll<br />
<br />
测试<br />
phpinfo.php<br />
<br />
&lt;? echo phpinfo(); ?&gt;<br />
<br />
ok.<br />
<br />
<img src ="http://www.blogjava.net/stephen80/aggbug/139174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-24 20:46 <a href="http://www.blogjava.net/stephen80/archive/2007/08/24/139174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mediator 设计模式</title><link>http://www.blogjava.net/stephen80/archive/2007/08/07/134998.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Tue, 07 Aug 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/08/07/134998.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/134998.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/08/07/134998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/134998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/134998.html</trackback:ping><description><![CDATA[这个模式一直没有好好的理解。最近作IM 相关的应用，才明白了。<br>就是两个人之间要沟通，不是直接，而是通过 mediator.<br>也就是 ,不是 <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; user1.sendMessage(user2，"some message");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 而是 <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; user1.getMediator().sendMessage("user2","some message");<br><br>&nbsp;有什么好处呢：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 职责分离：mediator 完成自己该承担的职责。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mediator 也可以搞这搞那。<br><br>插一段实际代码：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.getChatManager().createChat("thewho@stephenli",new MessageListener() {<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void processMessage(Chat chat, Message message) {<br>&nbsp;&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; if(logger.isDebugEnabled())<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; logger.debug("Received message: " + message.toXML());<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }).sendMessage("测试发送!");<br><br><br>下面是junit 一段别人的代码，可以Ｒｕｎ：<br><br>代码看起来很蠢，不能说明使用mediator 的好处。不过意思就是这样啦！（从Ｃ＃　拷的）<br><br><br>import junit.framework.TestCase;<br><br><br>public class MediatorTest extends TestCase {<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public void testMediator(){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Mediator m = new Mediator();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataProviderColleague c1 = new DataProviderColleague(m);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataConsumerColleague c2 = new DataConsumerColleague();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m.IntroduceColleagues(c1,c2);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; c1.ChangeData();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><br><br><br>&nbsp;&nbsp;&nbsp; class Mediator <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private DataProviderColleague dataProvider;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private DataConsumerColleague dataConsumer;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void IntroduceColleagues(DataProviderColleague c1, DataConsumerColleague c2)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataProvider = c1;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataConsumer = c2;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void DataChanged()<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i = dataProvider.getIMyData();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataConsumer.NewValue(i);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; class DataConsumerColleague <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void NewValue(int i)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("New value "+ i);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; class DataProviderColleague<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private Mediator mediator;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private int iMyData=0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private int MyData ;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public DataProviderColleague(Mediator m)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mediator = m;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void ChangeData()<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iMyData = 403;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Inform mediator that I have changed the data<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (mediator != null)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mediator.DataChanged();&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public int getIMyData() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return iMyData;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void setIMyData(int myData) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iMyData = myData;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; <br><br><br><br><br><br><br><br><br><br><br><br><br><br><img src ="http://www.blogjava.net/stephen80/aggbug/134998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-08-07 16:43 <a href="http://www.blogjava.net/stephen80/archive/2007/08/07/134998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐一篇 StAX and WoodStox 的介绍文章，英文</title><link>http://www.blogjava.net/stephen80/archive/2007/07/23/131820.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Mon, 23 Jul 2007 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/07/23/131820.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <a href="http://www.vsj.co.uk/articles/display.asp?id=643"> StAX the odds with Woodstox </a><br><br><br>刚读了，感觉不错。<br><br>Over a decade into XML evolution, however, these parsing technologies are slowly showing their age, requiring bypasses and optimizations to overcome their well-known limitations. StAX, or Streaming API for XML, is the new-age XML parser that offers the best features of the existing models, and at the same time provides high performance and efficient access to the underlyi&nbsp;&nbsp;<a href='http://www.blogjava.net/stephen80/archive/2007/07/23/131820.html'>阅读全文</a><img src ="http://www.blogjava.net/stephen80/aggbug/131820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-07-23 10:36 <a href="http://www.blogjava.net/stephen80/archive/2007/07/23/131820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>规划一下能力提高的步骤</title><link>http://www.blogjava.net/stephen80/archive/2007/07/13/130116.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Fri, 13 Jul 2007 08:25:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2007/07/13/130116.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/130116.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2007/07/13/130116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/130116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/130116.html</trackback:ping><description><![CDATA[最近一直用已有的知识，再规划一下，最近的学习重点<br>1.rick&nbsp; client 的全面掌握<br>&nbsp; 以前用dwr ，再复习一下&nbsp; . ok ,prototypes . 07-08-01 <br>2.db procedure <br>&nbsp; 以前基本不会。<br>3.ejb3 <br>&nbsp; 高可靠性transaction <br>4. StAX, woodstox<br>&nbsp;&nbsp; 学习一下新的xml 处理技术。 ok.&nbsp; 07-08-01<br>5.REST<br>&nbsp;&nbsp; 新东西，很重要&nbsp;&nbsp;&nbsp; .&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok. 07-08-1<br>6.english<br><br><br><br><br>   <img src ="http://www.blogjava.net/stephen80/aggbug/130116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2007-07-13 16:25 <a href="http://www.blogjava.net/stephen80/archive/2007/07/13/130116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>接口优于继承，组合优于继承</title><link>http://www.blogjava.net/stephen80/archive/2006/07/21/59410.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Fri, 21 Jul 2006 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2006/07/21/59410.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/59410.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2006/07/21/59410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/59410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/59410.html</trackback:ping><description><![CDATA[这两个原则最近有了切肤之痛的感受。<br />看来坚持面向interface 的开发是必须的了。<br />问题在<br />  Abstract class 不能复杂，我想这也是template pattern 时候要注意的。<br />  template 要稳定，不确定的东西不能放在template 中，当然简单的东西容易稳定。<br /> <br /> 否则必然违背 ocp 原则。<br /><img src ="http://www.blogjava.net/stephen80/aggbug/59410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2006-07-21 14:05 <a href="http://www.blogjava.net/stephen80/archive/2006/07/21/59410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>htmlparser 的装死问题</title><link>http://www.blogjava.net/stephen80/archive/2006/07/21/59408.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Fri, 21 Jul 2006 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2006/07/21/59408.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/59408.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2006/07/21/59408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/59408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/59408.html</trackback:ping><description><![CDATA[由于httpconnection 并不能总是很好的处理 “System.connectionTimeOut" 问题。<br />htmlParser 会装死。<br />我想只能加一个monitor thread ,不过没有完成。<br /><img src ="http://www.blogjava.net/stephen80/aggbug/59408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2006-07-21 14:00 <a href="http://www.blogjava.net/stephen80/archive/2006/07/21/59408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>htmlParser 遇到的encoding 问题</title><link>http://www.blogjava.net/stephen80/archive/2006/07/21/59407.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Fri, 21 Jul 2006 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2006/07/21/59407.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/59407.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2006/07/21/59407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/59407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/59407.html</trackback:ping><description><![CDATA[    html parser 在处理 一些网页的时候，会出现乱码'3f3f' .<br />    问题在于 页面的charset=gb2312 ,而 页面中有gbk 的码 ,比如 'fb9c'.<br />    代码可以验证，<br />        byte[] gbchar = new byte[2];<br />        gbchar[0]=(byte) 0xfb;<br />        gbchar[1]=(byte) 0x9c;<br />        System.out.print(new String(gbchar,"gbk"));<br />        System.out.print(new String(gbchar,"gb2312"));<br /><br />    不过，我并没有解决这个问题。<br /><br /><img src ="http://www.blogjava.net/stephen80/aggbug/59407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2006-07-21 13:58 <a href="http://www.blogjava.net/stephen80/archive/2006/07/21/59407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webalizer 作点击量统计</title><link>http://www.blogjava.net/stephen80/archive/2006/04/30/44228.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Sun, 30 Apr 2006 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2006/04/30/44228.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/44228.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2006/04/30/44228.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/44228.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/44228.html</trackback:ping><description><![CDATA[统计结果，可以再用JasperReporter 整理一下，更好的满足业务需要。<br /><img src ="http://www.blogjava.net/stephen80/aggbug/44228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2006-04-30 16:33 <a href="http://www.blogjava.net/stephen80/archive/2006/04/30/44228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用clickStream 做业务日志</title><link>http://www.blogjava.net/stephen80/archive/2006/04/30/44227.html</link><dc:creator>西津渡</dc:creator><author>西津渡</author><pubDate>Sun, 30 Apr 2006 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/stephen80/archive/2006/04/30/44227.html</guid><wfw:comment>http://www.blogjava.net/stephen80/comments/44227.html</wfw:comment><comments>http://www.blogjava.net/stephen80/archive/2006/04/30/44227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stephen80/comments/commentRss/44227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stephen80/services/trackbacks/44227.html</trackback:ping><description><![CDATA[    这样的设计，避免了业务与日志的耦合。<br /><img src ="http://www.blogjava.net/stephen80/aggbug/44227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stephen80/" target="_blank">西津渡</a> 2006-04-30 16:31 <a href="http://www.blogjava.net/stephen80/archive/2006/04/30/44227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>