﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-一字一句, 亦足以畅叙幽情</title><link>http://www.blogjava.net/boyanxiu/</link><description>仰观宇宙之大 俯察JAVA之盛</description><language>zh-cn</language><lastBuildDate>Tue, 05 May 2026 21:58:09 GMT</lastBuildDate><pubDate>Tue, 05 May 2026 21:58:09 GMT</pubDate><ttl>60</ttl><item><title>更好的利用数据库原生内置函数，提升sql函数的效率！</title><link>http://www.blogjava.net/boyanxiu/archive/2010/03/11/315159.html</link><dc:creator>Brin</dc:creator><author>Brin</author><pubDate>Thu, 11 Mar 2010 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/boyanxiu/archive/2010/03/11/315159.html</guid><wfw:comment>http://www.blogjava.net/boyanxiu/comments/315159.html</wfw:comment><comments>http://www.blogjava.net/boyanxiu/archive/2010/03/11/315159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boyanxiu/comments/commentRss/315159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boyanxiu/services/trackbacks/315159.html</trackback:ping><description><![CDATA[<p><span style="color: #993300; font-family: 黑体"><span style="color: #333399"><span style="font-family: 黑体">案例：在字符串类型字段中 求目标子串出现的次数（在oracle 9i下测试）</span></span><br style="font-family: " />
</span><span style="color: red"><strong>1.建测试数据。建表test_tbl(含字符串类型的字段content),插入10W条记录。</strong></span><br />
&nbsp;&nbsp; <span style="color: red">--建表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;<br />
&nbsp;&nbsp; create table <span style="color: #0000ff">test_tbl </span>(id number,content varchar2(1000))；<br />
&nbsp;&nbsp; <span style="color: red">--插入10W条测试记录</span><br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_random.seed(12345678);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in 1 .. 100000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into <span style="color: #0000ff">test_tbl </span>values(i, dbms_random.string('L',dbms_random.value(10,1000)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end loop;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commit;<br />
&nbsp;&nbsp; &nbsp;end;&nbsp;<br />
<span style="color: #ff0000"><strong>2.创建自定义函数一（采用循环截子串的方式实现，如果截到的子串等于目标子串则出现次数加1。）</strong></span><br />
&nbsp;&nbsp; create or replace function <span style="color: #0000ff">f1</span>(str_pattern in varchar2,str_mother in varchar2)<br />
&nbsp;&nbsp; return number<br />
&nbsp;&nbsp;&nbsp;is<br />
&nbsp;&nbsp;&nbsp; i number := 1;<br />
&nbsp;&nbsp;&nbsp; cnt number := 0;<br />
&nbsp;&nbsp;&nbsp; len_pattern number := length(str_pattern);<br />
&nbsp;&nbsp;&nbsp; len_mother number := length(str_mother);<br />
&nbsp;&nbsp;&nbsp;begin<br />
&nbsp;&nbsp;&nbsp; while(i &lt;= len_mother)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(substr(str_mother, i ,len_pattern) = str_pattern) then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cnt := cnt + 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i := i+ len_pattern;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i := i+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cnt;<br />
&nbsp;&nbsp;&nbsp; end;<br />
<strong><span style="color: #ff0000">3</span><span style="color: #ff0000">.</span></strong><span style="color: #ff0000"><strong>创建自定义函数二(循环使用Instr函数利用occurrence参数实现，循环一次Intr函数得到一个位置pos值，并让occurrence加1。如果pos值不为零，表示目标子串第occurrence次在母串中存在；反之表示再也不存在了，于是退出循环。最后occurrence-1即为所得)</strong><br />
&nbsp;&nbsp;<span style="color: #ffcc99">&nbsp; <span style="color: #808080">Intr函数说明：Instr(string, substring, position, occurrence) 其中&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string：代表源字符串；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substring：代表想聪源字符串中查找的子串；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position：代表查找的开始位置，该参数可选的，默认为 1；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; occurrence：代表想从源字符中查找出第几次出现的substring，该参数也是可选的，默认为1；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回值为：查找到的字符串的位置。</span></span></span><span> <br />
create or replace function <span style="color: #0000ff">f2</span>(str_pattern in varchar2,str_mother in varchar2)<br />
&nbsp; return number<br />
&nbsp; is<br />
&nbsp;&nbsp;&nbsp; pos number;<br />
&nbsp;&nbsp;&nbsp; occurrence number := 1;<br />
&nbsp;&nbsp; begin <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos := instr(str_mother,str_pattern,1, occurrence);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit when pos = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; occurrence := occurrence + 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end loop;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return occurrence - 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #ff0000"><strong>3.测试效率&nbsp;&nbsp;&nbsp;&nbsp;</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
&nbsp;select count(*) from test_tbl&nbsp; where <span style="color: #0000ff">f1</span>('abc',content) &gt; 1<br />
--<span style="color: #ff0000">用时59.223 S</span><br />
select count(*) from test_tbl&nbsp; where f2('abc',content) &gt; 1<br />
--<span style="color: #ff0000">用时2.016 S</span><br />
select count(*) from test_tbl&nbsp; where <span style="color: #0000ff">f1</span>('a',content) &gt; 10<br />
--<span style="color: #ff0000">用时59.453 S<br />
</span>select count(*) from test_tbl&nbsp; where f2('a',content) &gt; 10<br />
--<span style="color: #ff0000">用时8.36 S<br />
<span style="color: #ff0000"><strong>4.总结：很好的利用内置函数，科学的把内置函数放到合理的位置能很好的提高效率<br />
</strong><br />
5.后记<br />
&nbsp;<span style="color: #808080">&nbsp; 对于该案例，如果目标子串含有多个字符用<span style="color: #0000ff">f2</span>效率较高，如果目标子串所含字符很少比如就一个字符,建议用简便办法：1.在母字符串中把木目标字串替换为空('')得到新字符串。2.利用 (母串长度-新串长度)/目标子串长度 得到的就是子串的出现次数。</span></span></span> 
<img src ="http://www.blogjava.net/boyanxiu/aggbug/315159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boyanxiu/" target="_blank">Brin</a> 2010-03-11 11:41 <a href="http://www.blogjava.net/boyanxiu/archive/2010/03/11/315159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nginx+tomcat架构下获取真实IP的办法 </title><link>http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html</link><dc:creator>Brin</dc:creator><author>Brin</author><pubDate>Tue, 09 Feb 2010 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html</guid><wfw:comment>http://www.blogjava.net/boyanxiu/comments/312411.html</wfw:comment><comments>http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/boyanxiu/comments/commentRss/312411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boyanxiu/services/trackbacks/312411.html</trackback:ping><description><![CDATA[<p>第一步：在nginx.conf中配置反向代理时把真实IP带上，例如：</p>
<p>server { <br />
&nbsp;&nbsp;&nbsp; listen 80; <br />
&nbsp;&nbsp;&nbsp; server_name&nbsp; boyan.com; <br />
&nbsp;&nbsp;&nbsp; location ~ ^/(WEB-INF)/ { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deny all; <br />
&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; location / { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_pass http://localhost:8888;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red"><strong>proxy_set_header&nbsp; X-Real-IP&nbsp; $remote_addr;</strong></span><br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }</p>
<p>第二步：应用程序中用<span style="color: red"><strong>&nbsp;String ip = request.getHeader("X-Real-IP");</strong></span>替代String ip = request.getRemoteAddr();即可<br />
&nbsp; <br />
</p>
<img src ="http://www.blogjava.net/boyanxiu/aggbug/312411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boyanxiu/" target="_blank">Brin</a> 2010-02-09 13:54 <a href="http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>