??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av日韩精品久久久久久a,国产精品亚洲w码日韩中文,亚洲av无码不卡http://www.tkk7.com/yeshucheng/q逐自己,q逐方向,心随(zhn)所?/description>zh-cnFri, 09 May 2025 17:26:27 GMTFri, 09 May 2025 17:26:27 GMT60【{】PreparedStatement防止SQL注入http://www.tkk7.com/yeshucheng/archive/2010/12/14/340635.html叶澍?/dc:creator>叶澍?/author>Tue, 14 Dec 2010 05:58:00 GMThttp://www.tkk7.com/yeshucheng/archive/2010/12/14/340635.html在JDBC应用?如果你已l是E有水^开发?你就应该始终以PreparedStatement代替Statement.也就是说,在Q何时候都不要使用Statement.
Z以下的原?
一.代码的可L和可维护?
虽然用PreparedStatement来代替Statement会代码多出几行,但这L代码无论从可L还是可l护性上来说.都比直接用Statement的代码高很多次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();

不用我多?对于W一U方?别说其他人去M的代?是你自p一D|间再去读,都会觉得伤心.

?PreparedStatement最大可能提高性能.
每一U数据库都会最大努力对预编译语句提供最大的性能优化.因ؓ预编译语句有可能被重复调?所以语句在被DB的编译器~译后的执行代码被缓存下?那么下次调用时只要是相同的预~译语句׃需要编?只要参数直接传入编译过的语句执行代码中(相当于一个涵?׃得到执行.qƈ不是说只有一?Connection中多ơ执行的预编译语句被~存,而是对于整个DB?只要预编译的语句语法和缓存中匚w.那么在Q何时候就可以不需要再ơ编译而可以直接执?而statement的语句中,即是相同一操作,而由于每ơ操作的数据不同所以整个语句相匹配的Z极小,几乎不太可能匚w.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即是相同操作但因ؓ数据内容不一?所以整个个语句本n不能匚w,没有~存语句的意?事实是没有数据库会对普通语句编译后的执行代码缓?q样每执行一ơ都要对传入的语句编译一?

当然q不是所以预~译语句都一定会被缓?数据库本w会用一U策?比如使用频度{因素来军_什么时候不再缓存已有的预编译结?以保存有更多的空间存储新的预~译语句.

?最重要的一Ҏ(gu)极大地提高了安全?

即到目前ؓ?仍有一些hq基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作ؓvarpasswd传入q来.用户名随?看看会成Z?

select * from tb_name = '随意' and passwd = '' or '1' = '1';
因ؓ'1'='1'肯定成立,所以可以Q何通过验证.更有甚?
把[';drop table tb_name;]作ؓvarpasswd传入q来,?
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功?但也有很多数据库可以ɘq些语句得到执行.

而如果你使用预编译语?你传入的M内容׃会和原来的语句发生Q何匹配的关系.(前提是数据库本n支持预编?但上前可能没有什么服务端数据库不支持~译?只有数的桌面数据库,是直接文g讉K的那?只要全用预~译语句,你就用不着对传入的数据做Q何过?而如果用普通的statement, 有可能要对drop,;{做费尽心机的判断和q虑.

上面的几个原?q不你在M时候都使用PreparedStatement?

 

 

有的Ch可能此时对于用法q不太理解下面给个小例子

Code Fragment 1:

String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE ′Colombian′"; 
stmt.executeUpdate(updateString);

Code Fragment 2:

PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? "); 
updateSales.setInt(1, 75); 
updateSales.setString(2, "Colombian"); 
updateSales.executeUpdate();

set中的1对应W一个? 2对应W二个? 同时注意你set 的类?是intq是string  哈哈很简单吧


原文出处Q?span style="font-family: Simsun; line-height: normal; font-size: medium; ">http://blog.csdn.net/spcusa/archive/2009/05/09/4164076.aspx



]]>
Futurel合ExecutorService的简单实?/title><link>http://www.tkk7.com/yeshucheng/archive/2010/12/12/340393.html</link><dc:creator>叶澍?/dc:creator><author>叶澍?/author><pubDate>Sun, 12 Dec 2010 06:44:00 GMT</pubDate><guid>http://www.tkk7.com/yeshucheng/archive/2010/12/12/340393.html</guid><description><![CDATA[<p>//ValueObjectc?/p> <p> <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> AdEntity {<br />     </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> String id;<br />     </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> String name;<br />     </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> String broker;<br />     </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> String date;<br />     </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> String body;<br />     </span><span style="color: #008000; ">//</span><span style="color: #008000; ">get/set<img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">    <img src="http://www.tkk7.com/Images/dot.gif" alt="" /><br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> String toString(){<br />         </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">【编号ؓ:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">id</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,q告名称?</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">name</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,代理商ؓ:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">broker</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,发布日期?</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">date</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,内容?</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">body</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">?/span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />     }<br /> }</span></div> </p> <p>//调用dc?/p> <p> <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> AdTask </span><span style="color: #0000FF; ">implements</span><span style="color: #000000; "> Callable</span><span style="color: #000000; "><</span><span style="color: #000000; ">AdEntity</span><span style="color: #000000; ">></span><span style="color: #000000; "> {<br />     @Override<br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> AdEntity call() </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br />         </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 模拟q程调用p的一些时?/span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">        Thread.sleep(</span><span style="color: #000000; ">5</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />         AdEntity vo</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AdEntity();<br />         vo.setId(String.valueOf(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Random().nextInt(</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">)));<br />         vo.setName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Ad@内衣q告</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         vo.setBroker(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CHANNEL</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         Date date</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Date();<br />         SimpleDateFormat sdf</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SimpleDateFormat(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">yyyy-MM-dd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         String dateStr</span><span style="color: #000000; ">=</span><span style="color: #000000; ">sdf.format(date);<br />         vo.setDate(dateStr);<br />         vo.setBody(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">q端内容</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> vo;<br />     }<br /> }<br /> </span></div> </p> <p>//d?/p> <p> <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> TestQueryMemg {<br />     <br />     </span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />      * </span><span style="color: #808080; ">@param</span><span style="color: #008000; "> args<br />      * </span><span style="color: #808080; ">@throws</span><span style="color: #008000; "> ExecutionException <br />      * </span><span style="color: #808080; ">@throws</span><span style="color: #008000; "> InterruptedException <br />      </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> InterruptedException, ExecutionException {<br />         ExecutorService exec</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Executors.newCachedThreadPool();<br />         </span><span style="color: #008000; ">//</span><span style="color: #008000; ">创徏Future来完成网l调用Q?/span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">        Callable</span><span style="color: #000000; "><</span><span style="color: #000000; ">AdEntity</span><span style="color: #000000; ">></span><span style="color: #000000; "> returnAd</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AdTask();<br />         Future</span><span style="color: #000000; "><</span><span style="color: #000000; ">AdEntity</span><span style="color: #000000; ">></span><span style="color: #000000; "> future</span><span style="color: #000000; ">=</span><span style="color: #000000; ">exec.submit(returnAd);<br />         <br />         </span><span style="color: #008000; ">//</span><span style="color: #008000; ">开始执行本地化查询信息</span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">        AdEntity localAd</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AdEntity();<br />         localAd.setId(String.valueOf(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Random().nextInt(</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">)));<br />         localAd.setName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Ad@食品q告</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         localAd.setBroker(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">蒙牛</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         SimpleDateFormat sdf</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> SimpleDateFormat(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">yyyy-MM-dd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         String dateStr</span><span style="color: #000000; ">=</span><span style="color: #000000; ">sdf.format(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Date());<br />         localAd.setDate(dateStr);<br />         localAd.setBody(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">内容本地</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /> <br />         System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">当前本地化查询内容ؓQ?/span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">localAd.toString());<br />         System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">E等片刻以获取远端信?img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         <br />         </span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">future.isDone()){<br />             </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br />                 Thread.sleep(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />             } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {<br />                 e.printStackTrace();<br />             }<br />         }<br />         AdEntity entityRemote</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(AdEntity)future.get();<br /> <br />         System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">合ƈ查询内容为:\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">localAd.toString()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">entityRemote.toString());<br />     }<br /> }</span></div> </p> <div><br /> </div> <p> </p> <p> </p> <p> </p> <img src ="http://www.tkk7.com/yeshucheng/aggbug/340393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yeshucheng/" target="_blank">叶澍?/a> 2010-12-12 14:44 <a href="http://www.tkk7.com/yeshucheng/archive/2010/12/12/340393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Future的一个简单实?/title><link>http://www.tkk7.com/yeshucheng/archive/2010/12/10/340298.html</link><dc:creator>叶澍?/dc:creator><author>叶澍?/author><pubDate>Fri, 10 Dec 2010 12:53:00 GMT</pubDate><guid>http://www.tkk7.com/yeshucheng/archive/2010/12/10/340298.html</guid><description><![CDATA[<p> </p> <p>个h账户c:</p> <p> <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> PrivateAccount </span><span style="color: #0000FF; ">implements</span><span style="color: #000000; "> Callable {<br />     Integer total;<br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> Object call() </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> Exception {<br />         Thread.sleep(</span><span style="color: #000000; ">5</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />         total</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Integer(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Random().nextInt(</span><span style="color: #000000; ">10000</span><span style="color: #000000; ">));<br />         System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">(zhn)个̎户上q有</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">total</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; "> 存款可以支配</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> total;<br />     }<br /> }<br /> </span></div> </p> <p> </p> <p>d数测试:</p> <p> <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SumTest {<br />     </span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />      * </span><span style="color: #808080; ">@param</span><span style="color: #008000; "> args<br />      * </span><span style="color: #808080; ">@throws</span><span style="color: #008000; "> ExecutionException <br />      * </span><span style="color: #808080; ">@throws</span><span style="color: #008000; "> InterruptedException <br />      </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) </span><span style="color: #0000FF; ">throws</span><span style="color: #000000; "> InterruptedException, ExecutionException {<br />         Callable privateAccount</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> PrivateAccount();<br />         FutureTask task</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> FutureTask(privateAccount);<br />                 </span><span style="color: #008000; ">//</span><span style="color: #008000; ">创徏新线E获取个̎户信?/span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">        Thread thread</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Thread(task);<br />         thread.start();<br /> <br />         </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> total</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Random().nextInt(</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />         System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ȝE在q工?img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">(zhn)目前操作金额ؓQ?nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">total</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; "> .</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">L待计个̎L金额<img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         </span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">task.isDone()){</span><span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否已经获取q回?/span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">try</span><span style="color: #000000; "> {<br />                 Thread.sleep(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">);<br />             } </span><span style="color: #0000FF; ">catch</span><span style="color: #000000; "> (InterruptedException e) {<br />                 </span><span style="color: #008000; ">//</span><span style="color: #008000; "> TODO Auto-generated catch block</span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">                e.printStackTrace();<br />             }<br />         }<br />         Integer privateSingle</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(Integer)task.get();<br />         </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> post</span><span style="color: #000000; ">=</span><span style="color: #000000; ">privateSingle.intValue();<br />         <br />         System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">(zhn)当前̎户共有金额ؓ:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">(total</span><span style="color: #000000; ">+</span><span style="color: #000000; ">post)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; "> K?/span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />     }<br /> <br /> }</span></div> </p> <div><br /> </div> <p> </p> <p> </p> <img src ="http://www.tkk7.com/yeshucheng/aggbug/340298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yeshucheng/" target="_blank">叶澍?/a> 2010-12-10 20:53 <a href="http://www.tkk7.com/yeshucheng/archive/2010/12/10/340298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]memcached server LRU 深入分析http://www.tkk7.com/yeshucheng/archive/2010/08/17/329128.html叶澍?/dc:creator>叶澍?/author>Tue, 17 Aug 2010 09:45:00 GMThttp://www.tkk7.com/yeshucheng/archive/2010/08/17/329128.html
曄我也看过很多剖析memcached内部机制的文章,有一Ҏ(gu)P但是看过之后又忘CQ而且没有什么深ȝ概念Q但是最q我遇到一个问题,q个问题q我重新来认识memcacheQ下面我阐述一下我遇到的问?

问题Q我有几千万的数据,q些数据会经常被用到Q目前来看,它必要攑ֈmemcached中,以保证访问速度Q但是我的memcached中数据经怼有丢失,而业务需求是memcached中的数据是不能丢q。我的数据丢q时候,memcached server的内存才使用?0%Q也是q有40%内存被严重的费掉了。但不是所有的应用都是q样Q其他应用内存浪费的比较少。ؓ什么内存才使用?0%的时候LRU执行了呢(之所以确定是LRU执行是因为我发现我的数据丢失的L前面放进ȝQ而且q个q程中,q些数据都没有被讉KQ比如第一ơ访问的时候,只能讉KW?000w条,而第300w条或者之前的数据都已l丢׃Q从日志里看Q第300w条肯定是放进MQ?

带着q些疑问Q我开始重新审视memcachedq个产品Q首先从它的内存模型开始:我们知道c++里分配内存有两种方式Q预先分配和动态分配,昄Q预先分配内存会使程序比较快Q但是它的缺Ҏ(gu)不能有效利用内存Q而动态分配可以有效利用内存,但是会ɽE序q行效率下降Qmemcached的内存分配就是基于以上原理,昄Z获得更快的速度Q有时候我们不得不以空间换旉?

也就是说memcached会预先分配内存,对了Qmemcached分配内存方式UC为allocatorQ首先,q里?个概念:
1 slab
2 page
3 chunk
解释一下,一般来说一个memcahcedq程会预先将自己划分q个slabQ每个slab下又有若q个pageQ每个page下又有多个chunkQ如果我们把q?个咚咚看作是object得话Q这是两个一对多得关pR再一般来_slab得数量是有限得,几个Q十几个Q或者几十个Q这个跟q程配置得内存有兟뀂而每个slab下得page默认情况?mQ也是说如果一个slab占用100m得内存得话,那么默认情况下这个slab所拥有得page得个数就?00Q而chunk是我们得数据存攑־最l地斏V?

举一个例子,我启动一个memcachedq程Q占用内?00mQ再打开telnetQtelnet localhost 11211Q连接上memcache之后Q输入stats  slabsQ回车,出现如下数据Q?
Java代码 复制代码
  1. STAT 1:chunk_size 80  
  2. STAT 1:chunks_per_page 13107  
  3. STAT 1:total_pages 1  
  4. STAT 1:total_chunks 13107  
  5. STAT 1:used_chunks 13107  
  6. STAT 1:free_chunks 0  
  7. STAT 1:free_chunks_end 13107  
  8. STAT 2:chunk_size 100  
  9. STAT 2:chunks_per_page 10485  
  10. STAT 2:total_pages 1  
  11. STAT 2:total_chunks 10485  
  12. STAT 2:used_chunks 10485  
  13. STAT 2:free_chunks 0  
  14. STAT 2:free_chunks_end 10485  
  15. STAT 3:chunk_size 128  
  16. STAT 3:chunks_per_page 8192  
  17. STAT 3:total_pages 1  
  18. STAT 3:total_chunks 8192  
  19. STAT 3:used_chunks 8192  
  20. STAT 3:free_chunks 0  
  21. STAT 3:free_chunks_end 8192  


以上是?个slab得详l信?
chunk_size表示数据存放块得大小Qchunks_per_page表示一个内存页page中拥有得chunk得数量,total_pages表示每个slab下page得个数。total_chunks表示q个slab下chunk得LQ=total_pages * chunks_per_pageQ,used_chunks表示该slab下已l用得chunk得数量,free_chunks表示该slab下还可以使用得chunks数量?

从上面得CZslab 1一共有1m得内存空_而且现在已经被用完了Qslab2也有1m得内存空_也被用完了,slab3得情况依然如此?而且从这3个slab中chunk得size可以看出来,W一个chunk?0bQ第二个?00bQ第3个是128bQ基本上后一个是前一个得1.25倍,但是q个增长情况我们是可以控制得Q我们可以通过在启动时得进E参?–f来修改这个|比如?–f 1.1表示q个增长因子?.1Q那么第一个slab中得chunk?0b得话Q第二个slab中得chunk应该?0*1.1左右?

解释了这么多也该可以看出来我遇到得问题得原因了,如果q看不出来,那我再补充关键的一句:memcached中新的valueq来存放的地址是该value的大决定的QvalueL会被选择存放到chunk与其最接近的一个slab中,比如上面的例子,如果我的value?0bQ那么我q所有的valueL会被存放?号slab中,?号slab中的free_chunks已经?了,怎么办呢Q如果你在启动memcached的时候没有追?MQ禁止LRUQ这U情况下内存不够时会out of memoryQ,那么memcached会把q个slab中最q最被使用的chunk中的数据清掉Q然后放上最新的数据。这p释了Z么我的内存还?0%的时候LRU执行了Q因为我的其他slab中的chunk_size都远大于我的valueQ所以我的valueҎ(gu)不会攑ֈ那几个slab中,而只会放到和我的value最接近的chunk所在的slab?而这些slab早就满了Q郁闷了)。这导致了我的数据被不停的覆盖Q后者覆盖前者?

问题扑ֈ了,解决Ҏ(gu)q是没有扑ֈQ因为我的数据必要求命中率?00%Q我只能通过调整slab的增长因子和page的大来量来命中率接q?00%Q但是ƈ不能100%保证命中率是100%Q这话怎么读v来这么别扭呢Q自我检讨一下自q语文水^Q,如果(zhn)说Q这U方案不行啊Q因为我的memcached server不能停啊Q不要紧q有另外一个方法,是memcached-toolQ执行move命oQ如Qmove 3 1Q代表把3号slab中的一个内存页Ud?号slab中,有h问了Q这有什么用呢,比如说我?0号slab的利用率非常低,但是page却又很多Q比?00Q那么就?00mQ?好slabl常发生LRUQ明显page不够Q我可以move 20 2Q把20号slab的一个内存页Ud?号slab上,q样p更加有效的利用内存了Q有了,一ơ只Ud一个pageQ多ȝ啊?ahuaxuan_q是写个脚本Q@环一下吧Q?

有h说不行啊Q我的memcache中的数据不能丢失啊,okQ试试新的memcachedb吧,虽然我没有用q,但是大家可以试试Q它也利用memcache协议和berkeleyDB做的Q写到这里,我不得不佩服danga了,我觉得它最大的贡献不是memcache server本nQ而是memcache协议Q,据说它被用在新浪的不应用上Q包括新的博客?

补充Qstats slab命o可以查看memcached中slab的情况,而stats命o可以查看你的memcached的一些健h况,比如说命中率之类的,CZ如下Q?
Java代码 复制代码
  1. STAT pid 2232  
  2. STAT uptime 1348  
  3. STAT time 1218120955  
  4. STAT version 1.2.1  
  5. STAT pointer_size 32  
  6. STAT curr_items 0  
  7. STAT total_items 0  
  8. STAT bytes 0  
  9. STAT curr_connections 1  
  10. STAT total_connections 3  
  11. STAT connection_structures 2  
  12. STAT cmd_get 0  
  13. STAT cmd_set 0  
  14. STAT get_hits 0  
  15. STAT get_misses 0  
  16. STAT bytes_read 26  
  17. STAT bytes_written 16655  
  18. STAT limit_maxbytes 104857600  

从上面的数据可以看到q个memcachedq程的命中率很好Qget_misses低达0个,怎么回事啊,因ؓq个q程使我刚启动的Q我只用telnetq了一下,所以curr_connections?Q而total_items?Q因为我没有放数据进去,get_hits?Q因为我没有调用getҎ(gu)Q最后的l果是misses当然?Q哇哦,换句话说命中率就?00%Q又yy了?

该到ȝ的时候了Q从q篇文章里我们可以得C下几个结论:
l论一Qmemcached得LRU不是全局的,而是针对slab的,可以说是区域性的?
l论二,要提高memcached的命中率Q预估我们的value大小q且适当的调整内存页大小和增长因子是必须的?
l论三,带着问题扄案理解的要比随便看看的效果好得多?


]]>
ORACLE卸蝲q净http://www.tkk7.com/yeshucheng/archive/2010/05/19/321401.html叶澍?/dc:creator>叶澍?/author>Wed, 19 May 2010 10:35:00 GMThttp://www.tkk7.com/yeshucheng/archive/2010/05/19/321401.html
  1. 关闭所有oracle的服务和E序
  2. 选择开始| E序|oracle Installation Products命oQ运行Universal InstallerQ弹出欢q对话框
  3. 单机 卸蝲产品 按钮Q弹出Inventory对话?/li>
  4. 选中Inventroy对话框中的所有节点,点击删除Q确认即?/li>
  5. ??开始|q行 输入regeditq按ENTER键,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLEQ删除此象,然后选择 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ServicesQ滚动此列表Q删除与oracle有关的所 有选项?/li>
  6. 从桌面上、STARTUP和程序菜单中删除所有ORACLE的组和图标?/li>
  7. 重启pȝ?/li>
  8. 删除包括文g在内的安装目录。至此ORACLE的全部卸载完成?/li>


]]>
位运应用技??http://www.tkk7.com/yeshucheng/archive/2010/03/30/316930.html叶澍?/dc:creator>叶澍?/author>Tue, 30 Mar 2010 05:59:00 GMThttp://www.tkk7.com/yeshucheng/archive/2010/03/30/316930.htmlhttp://www.tkk7.com/yeshucheng/comments/316930.htmlhttp://www.tkk7.com/yeshucheng/archive/2010/03/30/316930.html#Feedback0http://www.tkk7.com/yeshucheng/comments/commentRss/316930.htmlhttp://www.tkk7.com/yeshucheng/services/trackbacks/316930.html位运应用口诀

清零取位要用与,某位|一可用?/p>

若要取反和交换,轻轻松松用异?/p>

UMq算

要点 1 它们都是双目q算W,两个q算分量都是整ŞQ结果也是整形?/p>

     2 "<<" 左移Q右边空出的位上?Q左边的位将从字头挤掉,其值相当于??/p>

     3 ">>"右移Q右边的位被挤掉。对于左边移出的IZQ如果是正数则空位补0Q若敎ͼ可能?或补1Q这取决于所用的计算机系l?/p>

     4 ">>>"q算W,双的位被挤掉,对于左边Ud的空位一概补??/p>

位运符的应?(源操作数s 掩码mask)

(1) 按位?- &

1 清零特定?(mask中特定位|?Q其它位?Qs=s&mask)

2 取某C指定?(mask中特定位|?Q其它位?Qs=s&mask)

(2) 按位?- |

    常用来将源操作数某些位置1Q其它位不变?(mask中特定位|?Q其它位? s=s|mask)

(3) 位异?- ^

1 使特定位的值取?(mask中特定位|?Q其它位? s=s^mask)

2 不引入第三变量,交换两个变量的?(?a=a1,b=b1)

    ??nbsp;          ??nbsp;             操作后状?/p>

a=a1^b1         a=a^b              a=a1^b1,b=b1

b=a1^b1^b1      b=a^b              a=a1^b1,b=a1

a=b1^a1^a1      a=a^b              a=b1,b=a1

二进制补码运公式:

-x = ~x + 1 = ~(x-1)

~x = -x-1

-(~x) = x+1

~(-x) = x-1

x+y = x - ~y - 1 = (x|y)+(x&y)

x-y = x + ~y + 1 = (x|~y)-(~x&y)

x^y = (x|y)-(x&y)

x|y = (x&~y)+y

x&y = (~x|y)-~x

x==y:    ~(x-y|y-x)

x!=y:    x-y|y-x

x< y:    (x-y)^((x^y)&((x-y)^x))

x<=y:    (x|~y)&((x^y)|~(y-x))

x< y:    (~x&y)|((~x|y)&(x-y))//无符号x,y比较

x<=y:    (~x|y)&((x^y)|~(y-x))//无符号x,y比较

应用举例

(1) 判断int型变量a是奇数还是偶?nbsp;          

a&1   = 0 偶数

       a&1 =   1 奇数

(2) 取int型变量a的第k?(k=0,1,2……sizeof(int))Q即a>>k&1

(3) int型变量a的第k位清0Q即a=a&~(1<<k)

(4) int型变量a的第k位置1Q?即a=a|(1<<k)

(5) int型变量@环左Ukơ,即a=a<<k|a>>16-k   (设sizeof(int)=16)

(6) int型变量a循环右移kơ,即a=a>>k|a<<16-k   (设sizeof(int)=16)

(7)整数的^均?/p>

对于两个整数x,yQ如果用 (x+y)/2 求^均|会生溢出,因ؓ x+y 可能会大于INT_MAXQ但是我们知道它们的q_值是肯定不会溢出的,我们用如下算法:

int average(int x, int y)   //q回X,Y 的^均?/p>

{   

     return (x&y)+((x^y)>>1);

}

(8)判断一个整数是不是2的幂,对于一个数 x >= 0Q判断他是不?的幂

boolean power2(int x)

{

    return ((x&(x-1))==0)&&(x!=0)Q?/p>

}

(9)不用temp交换两个整数

void swap(int x , int y)

{

    x ^= y;

    y ^= x;

    x ^= y;

}

(10)计算l对?/p>

int abs( int x )

{

int y ;

y = x >> 31 ;

return (x^y)-y ;        //or: (x+y)^y

}

(11)取模q算转化成位q算 (在不产生溢出的情况下)

         a % (2^n) {h(hun)?a & (2^n - 1)

(12)乘法q算转化成位q算 (在不产生溢出的情况下)

         a * (2^n) {h(hun)?a<< n

(13)除法q算转化成位q算 (在不产生溢出的情况下)

         a / (2^n) {h(hun)?a>> n

        ? 12/8 == 12>>3

(14) a % 2 {h(hun)?a & 1       

(15) if (x == a) x= b;

            else x= a;

        {h(hun)?x= a ^ b ^ x;

(16) x ?相反?表示?(~x+1)



]]>
多线E方法基理解http://www.tkk7.com/yeshucheng/archive/2009/07/20/287407.html叶澍?/dc:creator>叶澍?/author>Mon, 20 Jul 2009 02:00:00 GMThttp://www.tkk7.com/yeshucheng/archive/2009/07/20/287407.htmlhttp://www.tkk7.com/yeshucheng/comments/287407.htmlhttp://www.tkk7.com/yeshucheng/archive/2009/07/20/287407.html#Feedback0http://www.tkk7.com/yeshucheng/comments/commentRss/287407.htmlhttp://www.tkk7.com/yeshucheng/services/trackbacks/287407.htmlU程Q是指正在执行的一个指点o序列。在javaq_上是指从一个线E对象的start()开始。运?/span>runҎ(gu)体中的那一D늛对独立的q程?/span>

U程的ƈ发与q行

在过ȝ?sh)脑都已?/span>CPU作ؓ主要的处理方式,无论?/span>PC或者是服务器都是如此。系l调用某一个时d能有一个线E运行。当然这当中采用了比较多的策略来做时间片轮询。通过不断的调度切换来q行U程q行Q而这U方式就叫做q发Q?/span>concurrentQ?/span>

随着工艺水^的逐渐提升Q?/span>CPU的技术也在不断增q。因此在如今多个CPU已经不是什么特别的Q而大家常总SMP的方式来形容多个CPU来处理两个或者两个以上的U程q行方式q为ƈ行(parallelQ?/span>

JAVAU程对象

                                          l承ThreadQ实?/span>start()Ҏ(gu)

要实现线E运行,JAVA中有两种方式Q?/span>

                                      实现RunnableQ然后再传递给Thread实例

注意Q线E对象和U程是两个截然不同的概念?/span>

U程对象?/span>JVM产生的一个普通的Object子类

U程?/span>CPU分配l这个对象的一个运行过E?/span>

public class Test {

 public static void main(String[] args) throws Exception{

    MyThread mt = new MyThread();

    mt.start();

    mt.join();

    Thread.sleep(3000);

    mt.start();

 }

}

当线E对?/span>mtq行完成?/span>,我们让主U程休息一下,然后我们再次在这个线E对象上启动U程.l果我们看到Q?/span>

Exception in thread "main" java.lang.IllegalThreadStateException

Ҏ(gu)原因是在以下源代码中扑ևQ?/span>

public synchronized void start() {

        if (started)
            throw new IllegalThreadStateException();

        started = true;

       group.add(this);

        start0();

 }

一?/span>Thread的实例一旦调?/span>start()Ҏ(gu)Q这个实例的started标记标CؓtrueQ事实中不管q个U程后来有没有执行到底,只要调用了一?/span>start()再也没有机会运行了Q这意味着Q?/span>

【通过Thread实例?/span>start()Q一?/span>Thread的实例只能生一个线E?/span>

interrupt()Ҏ(gu)

当一个线E对象调?/span>interrupt()Ҏ(gu)Q它对应的线Eƈ没有被中断,只是改变了它的中断状态。当前U程的状态变以中断状态,如果没有其它影响Q线E还会自ql执行。只有当U程执行?/span>sleepQ?/span>waitQ?/span>join{方法时Q或者自己检查中断状态而抛出异常的情况下,U程才会抛出异常?/span>

join()Ҏ(gu)

join()Ҏ(gu)Q正如第一节所aQ在一个线E对象上调用joinҎ(gu)Q是当前U程{待q个U程对象对应的线E结?/span>

例如Q有两个工作Q工?/span>A要耗时10U钟Q工?/span>B要耗时10U或更多。我们在E序中先生成一个线E去做工?/span>BQ然后做工作A?/span>

        new B().start();//做工?/span>B

A();//做工?/span>A

工作A完成后,下面要等待工?/span>B的结果来q行处理。如果工?/span>Bq没有完成我׃能进行下面的工作CQ所以:

B b = new B();

b.start();//做工?/span>B

A();//做工?/span>A

b.join();//{工?/span>B完成.

C();//l箋工作C

原则Q?/span>join是测试其它工作状态的唯一正确Ҏ(gu)?/span>

yield()Ҏ(gu)

yield()Ҏ(gu)也是cL法,只在当前U程上调用,理由同上Q它L让当前线E放弃本ơ分配到的时间片Q调用这个方法不会提高Q何效率,只是降低?/span>CPU的d期上面介l的U程一些方法,Z(基础?/span>)而言只能单提及。以后具体应用中我会l合实例详细?/span>

原则Q【不是非常必要的情况下,没有理由调用它?/span>

wait()?/span>notify()/notityAll()Ҏ(gu)

首先明确一点他们的属于普通对象方法,q是线E对象方法;其次它们只能在同步方法中调用。线E要惌用一个对象的wait()Ҏ(gu)p先获得该对象的监视锁,而一旦调?/span>wait()后又立即释放该锁?/span>

U程的互斥控?/span>

多个U程同时操作某一对象Ӟ一个线E对该对象的操作可能会改变其状态,而该状态会影响另一U程对该对象的真正结果?/span>

synchornized关键?/span>

把一个单元声明ؓsynchornized,可以让在同一旉只有一个线E操作该Ҏ(gu)。作忆可以把synchronized看作是一个锁。但是我们要理解锁是被动的,q是d的呢Q换而言之它到底锁什么了Q锁谁了Q?/span>

例如Q?/span>

synchronized(obj){

                 //todo…

}

如果代码q行到此处,synchronized首先获取obj参数对象的锁Q若没有获取U程只能{待Q如果多个线E运行到q只能有一个线E获?/span>obj的锁Q然后再执行{}中的代码。因?/span>obj作用范围不同Q控制程序也不同?/span>

如果一个方法声明ؓsynchornized的,则等同于把在ZҎ(gu)上调?/span>synchornized(this)?/span>

如果一个静态方法被声明?/span>synchornizedQ则{同于把在ؓ个方法上调用synchornized(c?/span>.class)

 

真正的停止线E?/span>

要让一个线E得到真正意义的停止Q需要了解当前的U程在干什么,如果U程当前没有做什么,那立刻让Ҏ(gu)退出,当然是没有Q何问题,但是如果Ҏ(gu)正在手头赶工Q那必让他停止,然后收拾D局。因此,首先需要了解步骤:

1.     正常q行Q?/span>

2.       处理l束前的工作,也就是准备结束;

3.       l束退出?/span>

注:以上部分概括某位牛h大哥的笔讎ͼl常拜读他的博客

]]>
Effective Java2泛读后感http://www.tkk7.com/yeshucheng/archive/2009/07/17/287192.html叶澍?/dc:creator>叶澍?/author>Fri, 17 Jul 2009 10:09:00 GMThttp://www.tkk7.com/yeshucheng/archive/2009/07/17/287192.htmlhttp://www.tkk7.com/yeshucheng/comments/287192.htmlhttp://www.tkk7.com/yeshucheng/archive/2009/07/17/287192.html#Feedback0http://www.tkk7.com/yeshucheng/comments/commentRss/287192.htmlhttp://www.tkk7.com/yeshucheng/services/trackbacks/287192.html对于q本书的阅读Q说来也很惭愧。过去黎敏基本对于他译q的书,都有邮寄送给我,书拿到手后,都是内心的高兴——哇Q不用花q书,爽!Q自?/span>YY下)唯一要求是能够d能写个读后感Q但是很多次都抱歉的忽?zhn)了他。尽如此他q次译的书q是一如既往的邮寄给我(当然也是在我厚脸皮的ȝ要的前提下,哈哈Q,同样{应写一读后感Q可是迟到的d感一直到现在才肯出炉Q确实有点对不住他。这本书是在我每天早早挤车一个星期多d来的Q那个汽车真叫热啊,嘿嘿。切入正题,谈谈对于本书的一个看法和意见?/span>

       q本书整体风格基本还是沿袭了W一版本的套路,把每个重炚w写成一个条目来针对性的阐述Q本书d条目Z十八条(W一版书共有五十七条Q。当中很多是?/span>JDK5基础上作为第一版的更新Q与W一版比较明昄征是把原有第一版的W五章,W六章的l构化特征和Ҏ(gu)换成JDK5的新Ҏ(gu):泛型Q枚举,Ҏ(gu)Q?/span>

       q本书我到现在都怀疑出版社没有花很多时间在排版上,Z么这么说Q在黎敏在翻译阶D也有拿书的样E给我看q,我第一看到是面问题——居然是黄色的,当时p他提出来Q这个需要他和出版社d好的斟酌一番。当旉敏也说已l跟出版C֕量过Q哪知道最后拿到手上的居然q是“黄色”。可见出版社不知道是Z什么来考虑Q让我来猜想下:N是怕大伙都是色盲非要用黄色来提醒大家吗Q更为失望的居然标题使用U色Q晕啊!其次p说书U张也未免太扯E了吧Q我W一感觉U张是草稿U怸般,实在无语。在代码处理斚wQ显得不如第一版的那种爽朗Q是不是出版C考虑节省U张啊?非要把很多代码的间隔弄的特小Q这样对于可L来说确实很有疲x。所以这里向提醒以后的出版社——你忽?zhn)是可以,但是别把读者当?c)?/span>

       上面是谈到在书的~排和效果的问题。现在谈谈书中内容的一些感受。整体上说书译q是可以Q不q当中也不乏一些乏味用词过当的问题Q这里要说到最明显的就是书中出现很多在每一个条目后的ȝ词汇都或多或带?#8220;本条?#8221;一词,个h觉得偶尔写写是没很大问题Q但是过多重复显得机械化的审疲劻I甚至有时候过多这L词汇对于阅读畅性稍微欠佟뀂像q样cM的词汇还有—?#8220;不严格地?#8221;Q?#8220;而言?#8221;Q这些词汇确实稍微媄响阅L。这里小U下不爽或者错误的位置Q?/span>P240处第二段W三行和W四行中出现两个“现在”Q这个可能在校正时没有很好去润色?/span>P216倒数W二D늬三行有一个估计是印刷错误Q【原】仅仅一个异常就会导致该Ҏ(gu)不得?strong>?/em>?/span>… 如果没有错的话,q个字应该是Q?strong>处?/em>

q有cMW二章谈到的Q静态工厂方法与构造器不同的第三的优势在于Q它们可以返回原q回cd的Q何子cd的对象。就q句话,老实讲我真看了很久才明白啥意思?/span>

       以上是谈C些不的l微之处Q不q阅L书后Q确实对于以前一些不L的所谓了解语法也很好的得Cơ重新的认识。比如以前在使用非检警告上Q以前很习惯的直接在整个cM直接使用标记表示Q对于了?/span>for-each的@环上得到q一步的认识Q对于枚丄型的使用上更加灵zR这些都是个人对于此书泛M后的一些浅薄的看法。如果对于译者有不敬之处q望原谅Q?/span>



]]>
[转帖]如何定义Xsd文ghttp://www.tkk7.com/yeshucheng/archive/2009/02/24/256399.html叶澍?/dc:creator>叶澍?/author>Tue, 24 Feb 2009 03:18:00 GMThttp://www.tkk7.com/yeshucheng/archive/2009/02/24/256399.html阅读全文

]]>
HTTP协议Q{载)http://www.tkk7.com/yeshucheng/archive/2009/02/17/255153.html叶澍?/dc:creator>叶澍?/author>Tue, 17 Feb 2009 09:26:00 GMThttp://www.tkk7.com/yeshucheng/archive/2009/02/17/255153.htmlhttp://www.tkk7.com/yeshucheng/comments/255153.htmlhttp://www.tkk7.com/yeshucheng/archive/2009/02/17/255153.html#Feedback0http://www.tkk7.com/yeshucheng/comments/commentRss/255153.htmlhttp://www.tkk7.com/yeshucheng/services/trackbacks/255153.html引言                                       

HTTP是一个属于应用层的面向对象的协议Q由于其捗快速的方式Q适用于分布式媒体信息系l。它?990q提出,l过几年?br /> 使用与发展,得到不断地完善和扩展。目前在WWW中用的是HTTP/1.0的第六版QHTTP/1.1的规范化工作正在q行之中Q而且HTTP-
NG(Next Generation of HTTP)的徏议已l提出?br /> HTTP协议的主要特点可概括如下Q?br /> 1.支持客户/服务器模式?br /> 2.单快速:客户向服务器h服务Ӟ只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每U方法规定了客户与服
务器联系的类型不同。由于HTTP协议单,使得HTTP服务器的E序规模,因而通信速度很快?br /> 3.灉|QHTTP允许传输Lcd的数据对象。正在传输的cd由Content-Type加以标记?br /> 4.无连接:无连接的含义是限制每ơ连接只处理一个请求。服务器处理完客LhQƈ收到客户的应{后Q即断开q接。采用这U方
式可以节省传输时间?br /> 5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺状态意味着如果后箋处理需要前面的信息Q则
它必重传,q样可能D每次q接传送的数据量增大。另一斚wQ在服务器不需要先前信息时它的应答p快?/font>

一、HTTP协议详解之URL?br />

    httpQ超文本传输协议Q是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方
式,HTTP1.1版本中给ZU持l连接的机制Q绝大多数的Web开发,都是构徏在HTTP协议之上的Web应用?br />

HTTP URL (URL是一U特D类型的URIQ包含了用于查找某个资源的够的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通过HTTP协议来定位网l资源;host表示合法的InternetL域名或者IP地址Qport指定一个端口号Q?br /> 为空则用缺省端?0Qabs_path指定h资源的URIQ如果URL中没有给出abs_pathQ那么当它作求URI
Ӟ必须?#8220;/”的Ş式给出,通常q个工作览器自动帮我们完成?br /> eg:
1、输入:
www.guet.edu.cn
览器自动{换成Q?/font>http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp 

二、HTTP协议详解之请求篇

    httph׃部分l成Q分别是Q请求行、消息报头、请求正?br />

1、请求行以一个方法符号开_以空格分开Q后面跟着h的URI和协议的版本Q格式如下:Method Request-
URI HTTP-Version CRLF 
其中 Method表示hҎ(gu)QRequest-URI是一个统一资源标识W;HTTP-Version表示h的HTTP协议版本Q?br /> CRLF表示回R和换行(除了作ؓl尾的CRLF外,不允许出现单独的CR或LF字符Q?br />

hҎ(gu)Q所有方法全为大写)有多U,各个Ҏ(gu)的解释如下:
GET     h获取Request-URI所标识的资?br /> POST    在Request-URI所标识的资源后附加新的数据
HEAD    h获取由Request-URI所标识的资源的响应消息报头
PUT     h服务器存储一个资源,q用Request-URI作ؓ其标?br /> DELETE  h服务器删除Request-URI所标识的资?br /> TRACE   h服务器回送收到的h信息Q主要用于测试或诊断
CONNECT 保留来使用
OPTIONS h查询服务器的性能Q或者查询与资源相关的选项和需?br /> 应用举例Q?br /> GETҎ(gu)Q在览器的地址栏中输入|址的方式访问网|Q浏览器采用GETҎ(gu)向服务器获取资源Q?br /> eg:GET /form.html HTTP/1.1 (CRLF)

POSTҎ(gu)要求被请求服务器接受附在h后面的数据,常用于提交表单?br /> egQPOST /reg.jsp HTTP/ (CRLF)
Accept:image/gif,image/x-xbit,... (CRLF)
...
HOST:www.guet.edu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF)         //该CRLF表示消息报头已经l束Q在此之前ؓ消息报头
user=jeffrey&pwd=1234  //此行以下为提交的数据

HEADҎ(gu)与GETҎ(gu)几乎是一LQ对于HEADh的回应部分来_它的HTTP头部中包含的信息与通过
GETh所得到的信息是相同的。利用这个方法,不必传输整个资源内容Q就可以得到Request-URI所标识的资
源的信息。该Ҏ(gu)常用于测试超链接的有效性,是否可以讉KQ以及最q是否更新?br /> 2、请求报头后q?br /> 3、请求正?? 

三、HTTP协议详解之响应篇

    在接收和解释h消息后,服务器返回一个HTTP响应消息?/font>

HTTP响应也是׃个部分组成,分别是:状态行、消息报头、响应正?br /> 1、状态行格式如下Q?br /> HTTP-Version Status-Code Reason-Phrase CRLF
其中QHTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase
表示状态代码的文本描述?br /> 状态代码有三位数字l成Q第一个数字定义了响应的类别,且有五种可能取|
1xxQ指CZ?-表示h已接Ӟl箋处理
2xxQ成?-表示h已被成功接收、理解、接?br /> 3xxQ重定向--要完成请求必进行更q一步的操作
4xxQ客L错误--h有语法错误或h无法实现
5xxQ服务器端错?-服务器未能实现合法的h
常见状态代码、状态描q、说明:
200 OK      //客户端请求成?br /> 400 Bad Request  //客户端请求有语法错误Q不能被服务器所理解
401 Unauthorized //h未经授权Q这个状态代码必dWWW-Authenticate?nbsp;                //头域一起?
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //h资源不存在,egQ输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客L的请求,一D|间后Q?nbsp;                        //可能恢复正常
egQHTTP/1.1 200 OK QCRLFQ?/font>

2、响应报头后q?/font>

3、响应正文就是服务器q回的资源的内容 

四、HTTP协议详解之消息报头篇

    HTTP消息由客L到服务器的请求和服务器到客户端的响应l成。请求消息和响应消息都是由开始行Q对
于请求消息,开始行是h行,对于响应消息Q开始行是状态行Q,消息报头Q可选)Q空行(只有
CRLF的行Q,消息正文Q可选)l成?/font>

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头?br /> 每一个报头域都是由名?“Q?#8221;+I格+?l成Q消息报头域的名字是大小写无关的?/font>

1、普通报?br /> 在普通报头中Q有数报头域用于所有的h和响应消息,但ƈ不用于被传输的实体,只用于传输的消息?br /> egQ?br /> Cache-Control   用于指定~存指oQ缓存指令是单向的(响应中出现的~存指o在请求中未必会出玎ͼQ且?br /> 独立的(一个消息的~存指o不会影响另一个消息处理的~存机制Q,HTTP1.0使用的类似的报头域ؓPragma?br /> h时的~存指o包括Qno-cacheQ用于指C求或响应消息不能~存Q、no-store、max-age、max-stale、min-
fresh、only-if-cached;
响应时的~存指o包括Qpublic、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate?br /> max-age、s-maxage.
egQؓ了指CIE览器(客户端)不要~存面Q服务器端的JSPE序可以~写如下Qresponse.sehHeader
("Cache-Control","no-cache");
//response.setHeader("Pragma","no-cache");作用相当于上qC码,通常两?/合用
q句代码在发送的响应消息中设|普通报头域QCache-Control:no-cache


Date普通报头域表示消息产生的日期和旉

Connection普通报头域允许发送指定连接的选项。例如指定连接是q箋Q或者指?#8220;close”选项Q通知服务
器,在响应完成后Q关闭连?br />

2、请求报?br /> h报头允许客户端向服务器端传递请求的附加信息以及客户端自w的信息?br /> 常用的请求报?br /> Accept
Accepth报头域用于指定客L接受哪些cd的信息。egQAcceptQimage/gifQ表明客L希望接受GIF图象
格式的资源;AcceptQtext/htmlQ表明客L希望接受html文本?br /> Accept-Charset
Accept-Charseth报头域用于指定客L接受的字W集。egQAccept-Charset:iso-8859-1,gb2312.如果在请求消
息中没有讄q个域,~省是Q何字W集都可以接受?br /> Accept-Encoding
Accept-Encodingh报头域类gAcceptQ但是它是用于指定可接受的内容编码。egQAccept-Encoding:gzip.deflate.如果h消息中没有设|这个域服务器假定客L对各U内容编码都可以接受?br /> Accept-Language
Accept-Languageh报头域类gAcceptQ但是它是用于指定一U自然语a。egQAccept-Language:zh-cn.如果?br /> 求消息中没有讄q个报头域,服务器假定客L对各U语a都可以接受?br /> Authorization
Authorizationh报头域主要用于证明客L有权查看某个资源。当览器访问一个页面时Q如果收到服务器
的响应代码ؓ401Q未授权Q,可以发送一个包含Authorizationh报头域的hQ要求服务器对其q行验证?br /> HostQ发送请求时Q该报头域是必需的)
Hosth报头域主要用于指定被h资源的InternetL和端口号Q它通常从HTTP URL中提取出来的QegQ?br /> 我们在浏览器中输入:
http://www.guet.edu.cn/index.html
览器发送的h消息中,׃包含Hosth报头域,如下Q?br /> HostQ?/font>www.guet.edu.cn
此处使用~省端口?0Q若指定了端口号Q则变成QHostQ?/font>www.guet.edu.cn:指定端口?br /> User-Agent
我们上网登陆论坛的时候,往往会看C些欢q信息,其中列出了你的操作系l的名称和版本,你所使用?br /> 览器的名称和版本,q往往让很多h感到很神奇,实际上,服务器应用程序就是从User-Agentq个h报头
域中获取到这些信息。User-Agenth报头域允许客L它的操作系l、浏览器和其它属性告诉服务器。不
q,q个报头域不是必需的,如果我们自己~写一个浏览器Q不使用User-Agenth报头域,那么服务器端?br /> 无法得知我们的信息了?br /> h报头举例Q?br /> GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-
powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)

3、响应报?br /> 响应报头允许服务器传递不能放在状态行中的附加响应信息Q以及关于服务器的信息和对Request-URI所标识
的资源进行下一步访问的信息?br /> 常用的响应报?br /> Location
Location响应报头域用于重定向接受者到一个新的位|。Location响应报头域常用在更换域名的时候?br /> Server
Server响应报头域包含了服务器用来处理请求的软g信息。与User-Agenth报头域是相对应的。下面是
Server响应报头域的一个例子:
ServerQApache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate响应报头域必被包含?01Q未授权的)响应消息中,客户端收?01响应消息时候,q发
送Authorization报头域请求服务器对其q行验证Ӟ服务端响应报头就包含该报头域?br /> egQWWW-Authenticate:Basic realm="Basic Auth Test!"  //可以看出服务器对h资源采用的是基本验证机制?/font>


4、实体报?br /> h和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文l成Q但q不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文QegQ有无实体正文)和请求所标识的资源的元信息?br /> 常用的实体报?br /> Content-Encoding
Content-Encoding实体报头域被用作媒体cd的修饰符Q它的值指CZ已经被应用到实体正文的附加内容的~?br /> 码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encodingq样?br /> 于记录文的压羃Ҏ(gu)QegQContent-EncodingQgzip
Content-Language
Content-Language实体报头域描qC资源所用的自然语言。没有设|该域则认ؓ实体内容提供给所有的语言
阅读
者。egQContent-Language:da
Content-Length
Content-Length实体报头域用于指明实体正文的长度Q以字节方式存储的十q制数字来表C?br /> Content-Type
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。egQ?br /> Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified
Last-Modified实体报头域用于指C源的最后修Ҏ(gu)期和旉?br /> Expires
Expires实体报头域给出响应过期的日期和时间。ؓ了让代理服务器或览器在一D|间以后更新缓存中(再次
讉K曾访问过的页面时Q直接从~存中加载,~短响应旉和降低服务器负蝲)的页面,我们可以使用Expires
实体报头域指定页面过期的旉。egQExpiresQThuQ?5 Sep 2006 16:23:12 GMT
HTTP1.1的客L和缓存必d其他非法的日期格式(包括0Q看作已l过期。egQؓ了让览器不要缓存页
面,我们也可以利用Expires实体报头域,讄?Qjsp中程序如下:response.setDateHeader("Expires","0");

五、利用telnet观察http协议的通讯q程

    实验目的及原理:
    利用MS的telnet工具Q通过手动输入httph信息的方式,向服务器发出hQ服务器接收、解释和接受h
后,会返回一个响应,该响应会在telnetH口上显C出来,从而从感性上加深对http协议的通讯q程的认识?/font>

    实验步骤Q?/font>

1、打开telnet
1.1 打开telnet
q行-->cmd-->telnet

1.2 打开telnet回显功能
set localecho

2、连接服务器q发送请?br /> 2.1 open www.guet.edu.cn 80  //注意端口号不能省?/font>

    HEAD /index.asp HTTP/1.0
    Host:www.guet.edu.cn
   
   /*我们可以变换hҎ(gu),h桂林?sh)子主页内?输入消息如下*/
    open
www.guet.edu.cn 80
  
    GET /index.asp HTTP/1.0  //h资源的内?br />     Host:www.guet.edu.cn  

2.2 open www.sina.com.cn 80  //在命令提C符号下直接输入telnet www.sina.com.cn 80
    HEAD /index.asp HTTP/1.0
    Host:www.sina.com.cn
 

3 实验l果Q?/font>

3.1 h信息2.1得到的响应是:

HTTP/1.1 200 OK                                              //h成功
Server: Microsoft-IIS/5.0                                    //web服务?br /> Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive                                
Content-Length: 23330
Content-Type: text/html
Expries: Thu,08 Mar 2007 07:16:51 GMT
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
Cache-control: private

//资源内容省略

3.2 h信息2.2得到的响应是:

HTTP/1.0 404 Not Found       //hp|
Date: Thu, 08 Mar 2007 07:50:50 GMT
Server: Apache/2.0.54 <Unix>
Last-Modified: Thu, 30 Nov 2006 11:35:41 GMT
ETag: "6277a-415-e7c76980"
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix
Vary: Accept-Encoding
Content-Type: text/html
X-Cache: MISS from zjm152-78.sina.com.cn
Via: 1.0 zjm152-78.sina.com.cn:80<squid/2.6.STABLES-20061207>
X-Cache: MISS from th-143.sina.com.cn
Connection: close


失去了跟L的连?/font>

按Q意键l箋...


4 .注意事项Q?、出现输入错误,则请求不会成功?br />           2、报头域不分大小写?br />           3、更׃步了解HTTP协议Q可以查看RFC2616Q在http://www.letf.org/rfc上找到该文g?br />           4、开发后台程序必L握http协议

 

六?/font>HTTP协议相关技术补?/strong>

    1、基Q?br />     高层协议有:文g传输协议FTP、电(sh)子邮件传输协议SMTP、域名系l服务DNS、网l新M输协议NNTP?br /> HTTP协议{?br /> 中介׃U:代理(Proxy)、网?Gateway)和通道(Tunnel)Q一个代理根据URI的绝Ҏ(gu)式来接受hQ重写全?br /> 或部分消息,通过 URI的标识把已格式化q的h发送到服务器。网x一个接收代理,作ؓ一些其它服?br /> 器的上层Qƈ且如果必ȝ话,可以把请求翻译给下层的服务器协议。一 个通道作ؓ不改变消息的两个q接
之间的中l点。当通讯需要通过一个中?例如Q防火墙{?或者是中介不能识别消息的内Ҏ(gu)Q通道l常被
用?br />      代理(Proxy)Q一个中间程序,它可以充当一个服务器Q也可以充当一个客hQؓ其它客户机徏立请求?br /> h是通过可能的翻译在内部或经q传递到其它?服务器中。一个代理在发送请求信息之前,必须解释q且
如果可能重写它。代理经怽为通过防火墙的客户机端的门P代理q可以作Z个帮助应用来通过协议?
理没有被用户代理完成的请求?br /> |关(Gateway)Q一个作为其它服务器中间媒介的服务器。与代理不同的是Q网x受请求就好象对被h?br /> 资源来说它就是源服务器;发出h的客hq没有意识到它在同网x交道?br />   |关l常作ؓ通过防火墙的服务器端的门P|关q可以作Z个协议翻译器以便存取那些存储在非
HTTPpȝ中的资源?br />     通道(Tunnel)Q是作ؓ两个q接中的中介程序。一旦激z,通道便被认ؓ不属于HTTP通讯Q尽通道可能
是被一个HTTPh初始化的。当被中l?的连接两端关闭时Q通道便消失。当一个门?Portal)必须存在或中?br /> (Intermediary)不能解释中的通讯旉道被经怋用?br />

2、协议分析的优势—HTTP分析器检网l攻?br /> 以模块化的方式对高层协议q行分析处理Q将是未来入侉|的方向?br /> HTTP及其代理的常用端?0?128?080在network部分用port标签q行了规?br />
3、HTTP协议Content Lenth限制漏洞D拒绝服务d
使用POSTҎ(gu)Ӟ可以讄ContentLenth来定义需要传送的数据长度Q例如ContentLenth:999999999Q在传送完
成前Q内 存不会释放,d者可以利用这个缺Pq箋向WEB服务器发送垃圾数据直至WEB服务器内存?br /> 。这U攻L法基本不会留下痕qV?br /> http://www.cnpaf.net/Class/HTTP/0532918532667330.html


4、利用HTTP协议的特性进行拒l服务攻ȝ一些构?br /> 服务器端忙于处理d者伪造的TCPq接h而无暇理睬客L正常hQ毕竟客L的正常请求比率非怹
)Q此时从正常客户的角度看来,服务器失d应,q种情况我们UCQ服务器端受CSYNFlooddQSYNz水dQ?br /> 而Smurf、TearDrop{是利用ICMP报文来Flood和IP片d的。本文用“正常q接”的方法来产生拒绝服务d?br /> 19端口在早期已l有人用来做Chargend了,即Chargen_Denial_of_ServiceQ但是!他们用的Ҏ(gu)是在两台
Chargen 服务器之间生UDPq接Q让服务器处理过多信息而DOWN掉,那么Q干掉一台WEB服务器的条g?br /> 必须?个:1.有Chargen服务2.有HTTP 服务
Ҏ(gu)Q攻击者伪造源IPlN台Chargen发送连接请求(ConnectQ,Chargen接收到连接后׃q回每秒72字节?br /> 字符(实际上根据网l实际情况,q个速度更快Q给服务器?br />

5、Http指纹识别技?br />    Http指纹识别的原理大致上也是相同的:记录不同服务器对Http协议执行中的微小差别q行识别.Http指纹?br /> 别比TCP/IP堆栈指纹识别复杂??理由是定制Http服务器的配置文g、增加插件或lg使得更改Http的响?br /> 信息变的很容?q样使得识别变的困难Q然而定制TCP/IP堆栈的行?需要对核心层进行修?所以就Ҏ(gu)?br /> ?
      要让服务器返回不同的Banner信息的设|是很简单的,象Apacheq样的开放源代码的Http服务?用户可以?br /> 源代码里修改Banner信息,?后重起Http服务q效了Q对于没有公开源代码的Http服务器比如微软的IIS或?br /> 是Netscape,可以在存放Banner信息的Dll文g中修 ?相关的文章有讨论?q里不再赘述,当然q样的修改的效果
q是不错?另外一U模pBanner信息的方法是使用插g?br /> 常用试hQ?br /> 1QHEAD/Http/1.0发送基本的Httph
2QDELETE/Http/1.0发送那些不被允许的h,比如Deleteh
3QGET/Http/3.0发送一个非法版本的Http协议h
4QGET/JUNK/1.0发送一个不正确规格的Http协议h
Http指纹识别工具Httprint,它通过q用l计学原?l合模糊的逻辑学技?能很有效的确定Http服务器的cd.?br /> 可以被用来收集和分析不同Http服务器生的{֐?br />

6、其他:Z提高用户使用览器时的性能Q现代浏览器q支持ƈ发的讉K方式Q浏览一个网|同时建立
多个q接Q以q速获得一个网上的多个图标,q样能更快速完成整个网늚传输?br /> HTTP1.1中提供了q种持箋q接的方式,而下一代HTTP协议QHTTP-NG更增加了有关会话控制、丰富的内容
协商{方式的支持Q来提供
更高效率的连接?/font>



]]>
վ֩ģ壺 Ƶ˻վƵ| Ӱۿ| ޾߹ۿ| Ƶһ߹ۿ| 67paoǿ67194ҹ| ޳AƬ߹ۿ| ɫɫwww˿| ޾Ʒa߹ۿ| þԭav| ޾Ʒھþ| ޾Ʒ岻| ޹һɾþþƷۺ | ŷ޴Ƭ| ֻ߿avƬ| 18ڵվ| ƷѸ| ѹۿAVƬ߲| ƷƵվ | һëƬ| ֻˬִƵ| Ƶ߹ۿ| hƵ߹ۿ| 69Ƶѹۿl| 18վڵ| | ҹɫƵվ| ѹʵj߹ۿ| ͵͵޸պ | ѹۿڵwwwСƵ| www.ɫվ| ձһձ| ޹徫Ʒ߾þ| avƬ߹ۿ16Ů| þþƷavպ| ޹av߹ۿ| ƷƬ߻| ƵƵ | þþþ޹AV鶹| ˳ɳƵ| 99Ʒ߹ۿƵ| һѹۿƵİ |