﻿<?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/lcs868/</link><description>李春生的博客</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:10:48 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:10:48 GMT</pubDate><ttl>60</ttl><item><title>mysql 中sql 语句查询今天、昨天、7天、近30天、本月、上一月 数据</title><link>http://www.blogjava.net/lcs868/articles/343319.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Fri, 21 Jan 2011 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/343319.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/343319.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/343319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/343319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/343319.html</trackback:ping><description><![CDATA[<div style="width: 100%; text-align: left"><font style="font-weight: normal; font-size: 14px; color: #5f5f5f; line-height: 24px">今天<br />
<br />
select * from 表名 where to_days(时间字段名) = to_days(now());<br />
<br />
昨天<br />
<br />
SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) &lt;= 1<br />
<br />
7天<br />
<br />
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(时间字段名)<br />
<br />
近30天<br />
<br />
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) &lt;= date(时间字段名)<br />
<br />
本月<br />
<br />
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )<br />
<br />
上一月<br />
<br />
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1<br />
</font></div>
<img src ="http://www.blogjava.net/lcs868/aggbug/343319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2011-01-21 13:40 <a href="http://www.blogjava.net/lcs868/articles/343319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql date_format　按不同时间单位进行分组统计　</title><link>http://www.blogjava.net/lcs868/articles/343320.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Fri, 21 Jan 2011 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/343320.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/343320.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/343320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/343320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/343320.html</trackback:ping><description><![CDATA[DATE_FORMAT(date,format)&nbsp;&nbsp;&nbsp; <br />
根据format字符串格式化date值。下列修饰符可以被用在format字符串中：&nbsp;&nbsp;&nbsp; <br />
%M&nbsp;&nbsp;&nbsp;&nbsp; 月名字(January&#8230;&#8230;December)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%W&nbsp;&nbsp;&nbsp;&nbsp; 星期名字(Sunday&#8230;&#8230;Saturday)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%D&nbsp;&nbsp;&nbsp;&nbsp; 有英语前缀的月份的日期(1st,&nbsp;&nbsp; 2nd,&nbsp;&nbsp; 3rd,&nbsp;&nbsp; 等等。）&nbsp;&nbsp;&nbsp; <br />
%Y&nbsp;&nbsp;&nbsp;&nbsp; 年,&nbsp;&nbsp; 数字,&nbsp;&nbsp; 4&nbsp;&nbsp; 位&nbsp;&nbsp;&nbsp; <br />
%y&nbsp;&nbsp;&nbsp;&nbsp; 年,&nbsp;&nbsp; 数字,&nbsp;&nbsp; 2&nbsp;&nbsp; 位&nbsp;&nbsp;&nbsp; <br />
%a&nbsp;&nbsp;&nbsp;&nbsp; 缩写的星期名字(Sun&#8230;&#8230;Sat)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%d&nbsp;&nbsp;&nbsp;&nbsp; 月份中的天数,&nbsp;&nbsp; 数字(00&#8230;&#8230;31)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%e&nbsp;&nbsp;&nbsp;&nbsp; 月份中的天数,&nbsp;&nbsp; 数字(0&#8230;&#8230;31)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%m&nbsp;&nbsp;&nbsp;&nbsp; 月,&nbsp;&nbsp; 数字(01&#8230;&#8230;12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%c&nbsp;&nbsp;&nbsp;&nbsp; 月,&nbsp;&nbsp; 数字(1&#8230;&#8230;12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%b&nbsp;&nbsp;&nbsp;&nbsp; 缩写的月份名字(Jan&#8230;&#8230;Dec)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%j&nbsp;&nbsp;&nbsp;&nbsp; 一年中的天数(001&#8230;&#8230;366)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%H&nbsp;&nbsp;&nbsp;&nbsp; 小时(00&#8230;&#8230;23)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%k&nbsp;&nbsp;&nbsp;&nbsp; 小时(0&#8230;&#8230;23)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%h&nbsp;&nbsp;&nbsp;&nbsp; 小时(01&#8230;&#8230;12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%I&nbsp;&nbsp;&nbsp;&nbsp; 小时(01&#8230;&#8230;12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%l&nbsp;&nbsp;&nbsp;&nbsp; 小时(1&#8230;&#8230;12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%i&nbsp;&nbsp;&nbsp;&nbsp; 分钟,&nbsp;&nbsp; 数字(00&#8230;&#8230;59)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%r&nbsp;&nbsp;&nbsp;&nbsp; 时间,12&nbsp;&nbsp; 小时(hh:mm:ss&nbsp;&nbsp; [AP]M)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%T&nbsp;&nbsp;&nbsp;&nbsp; 时间,24&nbsp;&nbsp; 小时(hh:mm:ss)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%S&nbsp;&nbsp;&nbsp;&nbsp; 秒(00&#8230;&#8230;59)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%s&nbsp;&nbsp;&nbsp;&nbsp; 秒(00&#8230;&#8230;59)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%p&nbsp;&nbsp;&nbsp;&nbsp; AM或PM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
%w&nbsp;&nbsp;&nbsp;&nbsp; 一个星期中的天数(0=Sunday&nbsp;&nbsp; &#8230;&#8230;6=Saturday&nbsp;&nbsp; ）&nbsp;&nbsp;&nbsp; <br />
%U&nbsp;&nbsp;&nbsp;&nbsp; 星期(0&#8230;&#8230;52),&nbsp;&nbsp; 这里星期天是星期的第一天&nbsp;&nbsp;&nbsp; <br />
%u&nbsp;&nbsp;&nbsp;&nbsp; 星期(0&#8230;&#8230;52),&nbsp;&nbsp; 这里星期一是星期的第一天&nbsp;&nbsp;&nbsp; <br />
%%&nbsp;&nbsp;&nbsp;&nbsp; 一个文字&#8220;%&#8221;。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
所有的其他字符不做解释被复制到结果中。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
mysql&gt;&nbsp;&nbsp; select&nbsp;&nbsp; DATE_FORMAT('1997-10-04&nbsp;&nbsp; 22:23:00',&nbsp;&nbsp; '%W&nbsp;&nbsp; %M&nbsp;&nbsp; %Y'); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp; 'Saturday&nbsp;&nbsp; October&nbsp;&nbsp; 1997' <br />
mysql&gt;&nbsp;&nbsp; select&nbsp;&nbsp; DATE_FORMAT('1997-10-04&nbsp;&nbsp; 22:23:00',&nbsp;&nbsp; '%H:%i:%s'); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp; '22:23:00' <br />
mysql&gt;&nbsp;&nbsp; select&nbsp;&nbsp; DATE_FORMAT('1997-10-04&nbsp;&nbsp; 22:23:00', <br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '%D&nbsp;&nbsp; %y&nbsp;&nbsp; %a&nbsp;&nbsp; %d&nbsp;&nbsp; %m&nbsp;&nbsp; %b&nbsp;&nbsp; %j'); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp; '4th&nbsp;&nbsp; 97&nbsp;&nbsp; Sat&nbsp;&nbsp; 04&nbsp;&nbsp; 10&nbsp;&nbsp; Oct&nbsp;&nbsp; 277' <br />
mysql&gt;&nbsp;&nbsp; select&nbsp;&nbsp; DATE_FORMAT('1997-10-04&nbsp;&nbsp; 22:23:00', <br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '%H&nbsp;&nbsp; %k&nbsp;&nbsp; %I&nbsp;&nbsp; %r&nbsp;&nbsp; %T&nbsp;&nbsp; %S&nbsp;&nbsp; %w'); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp; '22&nbsp;&nbsp; 22&nbsp;&nbsp; 10&nbsp;&nbsp; 10:23:00&nbsp;&nbsp; PM&nbsp;&nbsp; 22:23:00&nbsp;&nbsp; 00&nbsp;&nbsp; 6' <br />
<br />
<br />
, '%Y %m'<br />
<img src ="http://www.blogjava.net/lcs868/aggbug/343320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2011-01-21 13:40 <a href="http://www.blogjava.net/lcs868/articles/343320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FusionCharts 的XML标签属性</title><link>http://www.blogjava.net/lcs868/articles/343307.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Fri, 21 Jan 2011 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/343307.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/343307.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/343307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/343307.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/343307.html</trackback:ping><description><![CDATA[<p>FusionCharts 的XML标签属性 <br />
FusionCharts 的 XML标签属性有一下四种数据类型<br />
* Boolean - 布尔类型，只能为1或者0。例如：&lt;graph showNames=&#8217;1&#8242; &gt;<br />
* Number - 数字类型，只能为数字。例如：&lt;graph yAxisMaxValue=&#8217;200&#8242; &gt;<br />
* String - 字符串类型，只能为字符串。例如： &lt;graph caption=&#8217;My Chart&#8217; &gt;<br />
* Hex Color Code - 十六进制颜色代码，前边没有&#8217;#&#8217;.例如： &lt;graph bgColor=&#8217;FFFFDD&#8217; &gt;</p>
<p>XML中的标签和属性有：<br />
&lt;graph&gt; 所具有的属性<br />
flash背景参数：<br />
* bgColor=&#8221;HexColorCode&#8221; : 设置flash的背景颜色<br />
* bgAlpha=&#8221;NumericalValue(0-100)&#8221; : 设置背景的透明度<br />
* bgSWF=&#8221;Path of SWF File&#8221; : 设置一个外部的Flash 为flash的背景<br />
图表背景参数：<br />
* canvasBgColor=&#8221;HexColorCode&#8221; : 设置图表背景的颜色<br />
* canvasBaseColor=&#8221;HexColorCode&#8221; : 设置图表基部的颜色<br />
* canvasBaseDepth=&#8221;Numerical Value&#8221; : 设置图表基部的高度<br />
* canvasBgDepth=&#8221;Numerical Value&#8221; : 设置图表背景的深度<br />
* showCanvasBg=&#8221;1/0&#8243; : 设置是否显示图表背景<br />
* showCanvasBase=&#8221;1/0&#8243; : 设置是否显示图表基部<br />
图表和轴的标题<br />
* caption=&#8221;String&#8221; : 图表上方的标题<br />
* subCaption=&#8221;String&#8221; : 图表上方的副标题<br />
* xAxisName= &#8220;String&#8221; : X轴的名字<br />
* yAxisName= &#8220;String&#8221; : y轴的名字<br />
图表数量值的限制<br />
* yAxisMinValue=&#8221;value&#8221;: y轴最小值<br />
* yAxisMaxValue=&#8221;value&#8221;: y舟最大值<br />
通用参数<br />
* shownames=&#8221;1/0&#8243; : 设置是否在x轴下显示&lt;set&gt;里指定的name<br />
* showValues=&#8221;1/0&#8243; : 设置是否在柱型图或饼型图上显示数据的值<br />
* showLimits=&#8221;1/0&#8243; : 设置是否在图表的y轴坐标上显示最大最小的数据值<br />
* rotateNames=&#8221;1/0&#8243; : 设置x轴下的name 是水平显示还是垂直显示<br />
* animation=&#8221;1/0&#8243; : 设置柱型图的显示是否是动画显示<br />
字体属性<br />
* baseFont=&#8221;FontName&#8221; : 设置字体样式<br />
* baseFontSize=&#8221;FontSize&#8221; : 设置字体大小<br />
* baseFontColor=&#8221;HexColorCode&#8221; : 设置字体颜色<br />
* outCnvBaseFont = &#8220;FontName&#8221; : 设置图表外侧的字体样式<br />
* outCnvBaseFontSze=&#8221;FontSize&#8221; : 设置图表外侧的字体大小<br />
* outCnvBaseFontColor=&#8221;HexColorCode&#8221;: 设置图表外侧的字体颜色<br />
数字格式选项<br />
* numberPrefix=&#8221;$&#8221; : 设置数据值的前缀<br />
* numberSuffix=&#8221;p.a&#8221; : 设置数据值的后缀（如果是特殊字符，需要使用URL Encode重编码）<br />
* formatNumber=&#8221;1/0&#8243; : 设置是否格式化数据<br />
* formatNumberScale=&#8221;1/0&#8243; : 设置是否用&#8220;K&#8221;来代表千，&#8220;M&#8221;来代表百万<br />
* decimalSeparator=&#8221;.&#8221; : 用指定的字符来代替小数点<br />
* thousandSeparator=&#8221;,&#8221; : 用指定的字符来代替千位分隔符<br />
* decimalPrecision=&#8221;2&#8243; : 设置十进制的精度<br />
* divLineDecimalPrecision=&#8221;2&#8243;: 设置y轴数值的小数位数<br />
* limitsDecimalPrecision=&#8221;2&#8243; : 设置y轴的最大最小值的小数位数<br />
水平分隔线<br />
* numdivlines=&#8221;NumericalValue&#8221; : 设置水平分隔线的数量<br />
* divlinecolor=&#8221;HexColorCode&#8221; : 设置水平分隔线的颜色<br />
* divLineThickness=&#8221;NumericalValue&#8221; : 设置水平分隔线的宽度<br />
* divLineAlpha=&#8221;NumericalValue0-100&#8243; : 设置水平分隔线的透明度<br />
* showDivLineValue=&#8221;1/0&#8243; : 设置是否显示水平分隔线的数值<br />
鼠标旋停参数<br />
* showhovercap=&#8221;1/0&#8243; : 显示是否激活鼠标旋停效果<br />
* hoverCapBgColor=&#8221;HexColorCode&#8221; : 设置鼠标旋停效果的背景颜色<br />
* hoverCapBorderColor=&#8221;HexColorCode&#8221; : 设置鼠标旋停效果的边框颜色<br />
* hoverCapSepChar=&#8221;Char&#8221; : 设置鼠标旋停后显示的文本中的分隔符号<br />
图表边距的设置<br />
* chartLeftMargin=&#8221;Numerical Value (in pixels)&#8221; : 设置图表左边距<br />
* chartRightMargin=&#8221;Numerical Value (in pixels)&#8221; : 设置图表右边距<br />
* chartTopMargin=&#8221;Numerical Value (in pixels)&#8221; : 设置图表上边距<br />
* chartBottomMargin=&#8221;Numerical Value (in pixels)&#8221; : 设置图表下边距<br />
Zero Plane<br />
The zero plane is a 3D plane that signifies the 0 position on the chart. If there are no negative numbers on the chart, you won&#8217;t see a visible zero plane.<br />
* zeroPlaneShowBorder=&#8221;1/0&#8243; : Whether the border of a 3D zero plane would be plotted or not.<br />
* zeroPlaneBorderColor=&#8221;Hex Code&#8221; : If the border is to be plotted, this attribute sets the border color for the plane.<br />
* zeroPlaneColor=&#8221;Hex Code&#8221; : The intended color for the zero plane.<br />
* zeroPlaneAlpha=&#8221;Numerical Value 0-100&#8243; : The intended transparency for the zero plane. </p>
<p>&lt;set&gt; 所具有的属性<br />
* name=&#8221;string&#8221; : 设置在图表中体现出来的名字<br />
Example: &lt;set name=&#8217;Jan&#8217; &#8230;&gt;<br />
* value=&#8221;NumericalValue&#8221; : 设置在图表中各个名字想对应的值<br />
Example: &lt;set name=&#8217;Jan&#8217; value=&#8217;12345&#8242; &#8230;&gt;<br />
* color=&#8221;HexCode&#8221; : 设置在图表中相对应的柱行图的颜色<br />
Example: &lt;set name=&#8217;Jan&#8217; value=&#8217;12345&#8242; color=&#8217;636363&#8242; &#8230;&gt;<br />
* hoverText=&#8221;String value&#8221; : 设置鼠标旋停在相对应的柱行图 上出现的文本内容<br />
Example: &lt;set name=&#8217;Jan&#8217; value=&#8217;12345&#8242; color=&#8217;636363&#8242; hoverText=&#8217;January&#8217;&#8230;&gt;<br />
* link=&#8221;URL&#8221; : 设置该柱行图的链接地址（需要URL Encode重编码）<br />
Example: &lt;set &#8230; link=&#8217;ShowDetails.asp%3FMonth=Jan&#8217; &#8230;&gt;<br />
* alpha=&#8221;Numerical Value 0-100&#8243; : 设置在图表中相对应的柱行图的透明度<br />
Example: &lt;set &#8230; alpha=&#8217;100&#8242; &#8230;&gt;<br />
* showName=&#8221;1&#8243; : 设置在是否显示图表中相对应的柱行图的name<br />
Example : &lt;set &#8230; showName=&#8221;1&#8243; &#8230;&gt;</p>
<p>&nbsp;</p>
<p><br />
功能特性<br />
animation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否动画显示数据，默认为1(True)<br />
showNames&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否显示横向坐标轴(x轴)标签名称<br />
rotateNames&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否旋转显示标签，默认为0(False):横向显示<br />
showValues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否在图表显示对应的数据值，默认为1(True)<br />
yAxisMinValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定纵轴(y轴)最小值，数字<br />
yAxisMaxValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定纵轴(y轴)最小值，数字<br />
showLimits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否显示图表限值(y轴最大、最小值)，默认为1(True)</p>
<p>图表标题和轴名称 <br />
caption&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表主标题<br />
subCaption&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表副标题<br />
xAxisName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 横向坐标轴(x轴)名称<br />
yAxisName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 纵向坐标轴(y轴)名称</p>
<p>图表和画布的样式<br />
bgColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表背景色，6位16进制颜色值<br />
canvasBgColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 画布背景色，6位16进制颜色值<br />
canvasBgAlpha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 画布透明度，[0-100]<br />
canvasBorderColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 画布边框颜色，6位16进制颜色值<br />
canvasBorderThickness&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 画布边框厚度，[0-100]<br />
shadowAlpha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投影透明度，[0-100]<br />
showLegend&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否显示系列名，默认为1(True)</p>
<p>字体属性<br />
baseFont&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表字体样式<br />
baseFontSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表字体大小<br />
baseFontColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表字体颜色，6位16进制颜色值<br />
outCnvBaseFont&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表画布以外的字体样式<br />
outCnvBaseFontSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表画布以外的字体大小<br />
outCnvBaseFontColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图表画布以外的字体颜色，6位16进制颜色值</p>
<p>分区线和网格<br />
numDivLines&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 画布内部水平分区线条数，数字<br />
divLineColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 水平分区线颜色，6位16进制颜色值<br />
divLineThickness&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 水平分区线厚度，[1-5]<br />
divLineAlpha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 水平分区线透明度，[0-100]<br />
showAlternateHGridColor&nbsp;&nbsp;&nbsp; 是否在横向网格带交替的颜色，默认为0(False)<br />
alternateHGridColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 横向网格带交替的颜色，6位16进制颜色值<br />
alternateHGridAlpha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 横向网格带的透明度，[0-100]<br />
showDivLineValues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否显示Div行的值，默认？？<br />
numVDivLines&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 画布内部垂直分区线条数，数字<br />
vDivLineColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 垂直分区线颜色，6位16进制颜色值<br />
vDivLineThickness&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 垂直分区线厚度，[1-5]<br />
vDivLineAlpha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 垂直分区线透明度，[0-100]<br />
showAlternateVGridColor&nbsp;&nbsp;&nbsp; 是否在纵向网格带交替的颜色，默认为0(False)<br />
alternateVGridColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 纵向网格带交替的颜色，6位16进制颜色值<br />
alternateVGridAlpha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 纵向网格带的透明度，[0-100]</p>
<p>数字格式<br />
numberPrefix&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 增加数字前缀<br />
numberSuffix&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 增加数字后缀&nbsp;&nbsp;&nbsp; % 为 '%25'<br />
formatNumberScale&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否格式化数字,默认为1(True),自动的给你的数字加上K（千）或M（百万）；若取0,则不加K或M<br />
decimalPrecision&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定小数位的位数，[0-10]&nbsp;&nbsp;&nbsp; 例如：='0' 取整<br />
divLineDecimalPrecision&nbsp;&nbsp;&nbsp; 指定水平分区线的值小数位的位数，[0-10]<br />
limitsDecimalPrecision&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定y轴最大、最小值的小数位的位数，[0-10]<br />
formatNumber&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逗号来分隔数字(千位，百万位),默认为1(True)；若取0,则不加分隔符<br />
decimalSeparator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定小数分隔符,默认为'.'<br />
thousandSeparator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定千分位分隔符,默认为','</p>
<p>Tool-tip/Hover标题<br />
showhovercap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否显示悬停说明框，默认为1(True)<br />
hoverCapBgColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 悬停说明框背景色，6位16进制颜色值<br />
hoverCapBorderColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 悬停说明框边框颜色，6位16进制颜色值<br />
hoverCapSepChar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定悬停说明框内值与值之间分隔符,默认为','</p>
<p>折线图的参数<br />
lineThickness&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 折线的厚度<br />
anchorRadius&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 折线节点半径，数字<br />
anchorBgAlpha&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 折线节点透明度，[0-100]<br />
anchorBgColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 折线节点填充颜色，6位16进制颜色值<br />
anchorBorderColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 折线节点边框颜色，6位16进制颜色值</p>
<p>Set标签使用的参数<br />
value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据值<br />
color&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 颜色<br />
link&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 链接（本窗口打开[Url]，新窗口打开[n-Url]，调用JS函数[JavaScript:函数]）<br />
name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 横向坐标轴标签名称</p>
<img src ="http://www.blogjava.net/lcs868/aggbug/343307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2011-01-21 11:20 <a href="http://www.blogjava.net/lcs868/articles/343307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql常用命令</title><link>http://www.blogjava.net/lcs868/articles/343306.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Fri, 21 Jan 2011 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/343306.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/343306.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/343306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/343306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/343306.html</trackback:ping><description><![CDATA[<p>1.Linux系统下启动MySQL的命令：</p>
<p>mysqladmin start</p>
<p>/ect/init.d/mysql start (前面为mysql的安装路径)</p>
<p>2.linux下重启mysql的命令：</p>
<p>mysqladmin restart</p>
<p>/ect/init.d/mysql restart (前面为mysql的安装路径) </p>
<p>3.linux下关闭mysql的命令：</p>
<p>mysqladmin shutdown</p>
<p>/ect/init.d/mysql shutdown (前面为mysql的安装路径)</p>
<p>4.连接本机上的mysql：</p>
<p>进入目录mysql\bin，再键入命令mysql -uroot -p， 回车后提示输入密码。</p>
<p>退出mysql命令：exit（回车）</p>
<p>5.修改mysql密码：</p>
<p>mysqladmin -u用户名 -p旧密码 password 新密码</p>
<p>或进入mysql命令行SET PASSWORD FOR root=PASSWORD("root");</p>
<p>6.增加新用户。（注意：mysql环境中的命令后面都带一个分号作为命令结束符）</p>
<p>grant select on 数据库.* to 用户名@登录主机 identified by "密码"</p>
<p>如增加一个用户test密码为123，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql，然后键入以下命令：</p>
<p>grant select,insert,update,delete on *.* to " Identified by "123";</p>
<p>二、有关MySQL数据库方面的操作</p>
<p>必须首先登录到mysql中，有关操作都是在mysql的提示符下进行，而且每个命令以分号结束</p>
<p>1、显示数据库列表。</p>
<p>show databases;</p>
<p>2、显示库中的数据表：</p>
<p>use mysql； ／／打开库</p>
<p>show tables;</p>
<p>3、显示数据表的结构：</p>
<p>describe 表名;</p>
<p>4、建库：</p>
<p>create database 库名;</p>
<p>5、建表：</p>
<p>use 库名；</p>
<p>create table 表名(字段设定列表)；</p>
<p>6、删库和删表:</p>
<p>drop database 库名;</p>
<p>drop table 表名；</p>
<p>7、将表中记录清空：</p>
<p>delete from 表名;</p>
<p>8、显示表中的记录：</p>
<p>select * from 表名;</p>
<p>9、编码的修改</p>
<p>如果要改变整个mysql的编码格式：</p>
<p>启动mysql的时候，mysqld_safe命令行加入</p>
<p>--default-character-set=gbk</p>
<p>如果要改变某个库的编码格式：在mysql提示符后输入命令</p>
<p>alter database db_name default character set gbk; </p>
<p>三、数据的导入导出</p>
<p>1、文本数据转到数据库中</p>
<p>文本数据应符合的格式：字段数据之间用tab键隔开，null值用来代替。例：</p>
<p>1 name duty 2006-11-23</p>
<p>数据传入命令 load data local infile "文件名" into table 表名;</p>
<p>2、导出数据库和表 </p>
<p>mysqldump --opt news &gt; news.sql（将数据库news中的所有表备份到news.sql文件，news.sql是一个文本文件，文件名任取。）</p>
<p>mysqldump --opt news author article &gt; author.article.sql（将数据库news中的author表和article表备份到author.article.sql文件， author.article.sql是一个文本文件，文件名任取。）</p>
<p>mysqldump --databases db1 db2 &gt; news.sql（将数据库dbl和db2备份到news.sql文件，news.sql是一个文本文件，文件名任取。）</p>
<p>mysqldump -h host -u user -p pass --databases dbname &gt; file.dump</p>
<p>就是把host上的以名字user，口令pass的数据库dbname导入到文件file.dump中</p>
<p>mysqldump --all-databases &gt; all-databases.sql（将所有数据库备份到all-databases.sql文件，all-databases.sql是一个文本文件，文件名任取。）</p>
<p>3、导入数据</p>
<p>mysql &lt; all-databases.sql（导入数据库）</p>
<p>mysql&gt;source news.sql;（在mysql命令下执行，可导入表）</p>
<p>一、连接MySQL</p>
<p>格式： mysql -h主机地址 -u用户名 －p用户密码</p>
<p>1、例1：连接到本机上的MYSQL。</p>
<p>首先在打开DOS窗口，然后进入目录 mysqlbin，再键入命令mysql -uroot -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是： mysql&gt;。</p>
<p>2、例2：连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为abcd123。则键入以下命令：</p>
<p>mysql -h110.110.110.110 -uroot -pabcd123</p>
<p>（注:u与root可以不用加空格，其它也一样）</p>
<p>3、退出MYSQL命令： exit （回车）。</p>
<p>二、修改密码</p>
<p>格式：mysqladmin -u用户名 -p旧密码 password 新密码</p>
<p>1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令：</p>
<p>mysqladmin -uroot -password ab12</p>
<p>注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。</p>
<p>2、例2：再将root的密码改为djg345。</p>
<p>mysqladmin -uroot -pab12 password djg345</p>
<p>三、增加新用户。（注意：和上面不同，下面的因为是MySQL环境中的命令，所以后面都带一个分号作为命令结束符）</p>
<p>格式：grant select on 数据库.* to 用户名@登录主机 identified by \"密码\"</p>
<p>例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MySQL，然后键入以下命令：</p>
<p>grant select,insert,update,</p>
<p>delete on *.* to test1@\"%\" Identified by \"abc\";</p>
<p>但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的MySQL数据库并对你的数据可以为所欲为了，解决办法见例2。</p>
<p>例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MySQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MySQL主机上的web页来访问。</p>
<p>grant select,insert,update,</p>
<p>delete on mydb.* to test2@localhost identified by \"abc\"; </p>
<p>如果你不想test2有密码，可以再打一个命令将密码消掉。</p>
<p>grant select,insert,update,delete on mydb</p>
<p>.* to test2@localhost identified by \"\";</p>
<p>在上面讲了登录、增加用户、密码更改等问题。下面我们来看看MySQL中有关数据库方面的操作。注意：你必须首先登录到MySQL中，以下操作都是在MySQL的提示符下进行的，而且每个命令以分号结束。</p>
<p>一、操作技巧</p>
<p>1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就完成。</p>
<p>2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MySQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。</p>
<p>二、显示命令</p>
<p>1、显示数据库列表：</p>
<p>show databases;</p>
<p>刚开始时才两个数据库：mysql和test。MySQL库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。</p>
<p>2、显示库中的数据表：</p>
<p>use mysql； ／／打开库，学过FOXBASE的一定不会陌生吧</p>
<p>show tables;</p>
<p>3、显示数据表的结构：</p>
<p>describe 表名;</p>
<p>4、建库：</p>
<p>create database 库名;</p>
<p>5、建表：</p>
<p>use 库名；</p>
<p>create table 表名 (字段设定列表)；</p>
<p>6、删库和删表:</p>
<p>drop database 库名;</p>
<p>drop table 表名；</p>
<p>7、将表中记录清空：</p>
<p>delete from 表名;</p>
<p>8、显示表中的记录：</p>
<p>select * from 表名;</p>
<p>三、一个建库和建表以及插入数据的实例</p>
<p>drop database if exists school; //如果存在SCHOOL则删除</p>
<p>create database school; //建立库SCHOOL</p>
<p>use school; //打开库SCHOOL</p>
<p>create table teacher //建立表TEACHER</p>
<p>(</p>
<p>id int(3) auto_increment not null primary key,</p>
<p>name char(10) not null,</p>
<p>address varchar(50) default &#8217;深圳&#8217;,</p>
<p>year date</p>
<p>); //建表结束</p>
<p>//以下为插入字段</p>
<p>insert into teacher values(&#8217;&#8217;,&#8217;glchengang&#8217;,&#8217;深圳一中&#8217;,&#8217;1976-10-10&#8217;);</p>
<p>insert into teacher values(&#8217;&#8217;,&#8217;jack&#8217;,&#8217;深圳一中&#8217;,&#8217;1975-12-23&#8217;);</p>
<p>注：在建表中（1）将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key（2）将NAME设为长度为10的字符字段（3）将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别呢，只有等以后的文章再说了。（4）将YEAR设为日期字段。</p>
<p>如果你在MySQL提示符键入上面的命令也可以，但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql，然后复制到c:\\下，并在DOS状态进入目录\\mysql\\bin，然后键入以下命令：</p>
<p>mysql -uroot -p密码 &lt; c:\\school.sql</p>
<p>如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。</p>
<p>四、将文本数据转到数据库中</p>
<p>1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用\\n来代替。</p>
<p>例：</p>
<p>3 rose 深圳二中 1976-10-10</p>
<p>4 mike 深圳一中 1975-12-23</p>
<p>2、数据传入命令 load data local infile \"文件名\" into table 表名。</p>
<p>注意：你最好将文件复制到\\mysql\\bin目录下，并且要先用use命令打表所在的库。</p>
<p>五、备份数据库：</p>
<p>1、mysqldump --opt school&gt;school.bbb</p>
<p>mysqldump --opt school&gt;school.bbb</p>
<p>（命令在DOS的\\mysql\\bin目录下执行）</p>
<p>注释:将数据库school备份到school.bbb文件，school.bbb是一个文本文件，文件名任取，打开看看你会有新发现。</p>
<p>后记：其实MySQL的对数据库的操作与其它的SQL类数据库大同小异，您最好找本将SQL的书看看。我在这里只介绍一些基本的，其实我也就只懂这些了，呵呵。最好的MYSQL教程还是&#8220;晏子&#8220;译的&#8220;MYSQL中文参考手册&#8220;不仅免费每个相关网站都有下载，而且它是最权威的。可惜不是象\"PHP4中文手册\"那样是chm的格式，在查找函数命令的时候不太方便。</p>
<p>2、修改登录密码</p>
<p>1) mysqladmin -u用户名 -p旧密码 password 新密码:</p>
<p>例：mysqladmin -u root password 21century</p>
<p>注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。</p>
<p>2)直接修改user表的root用户口令：</p>
<p>mysql&gt; user mysql;</p>
<p>mysql&gt; update user set pasword=password('21century') where user='root';</p>
<p>mysql&gt; flush privileges;</p>
<p>注：flush privileges的意思是强制刷新内存授权表，否则用的还是缓冲中的口令。</p>
<p>3、测试密码是否修改成功:</p>
<p>1）不用密码登录:</p>
<p>[root@test1 local]# mysql</p>
<p>ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)</p>
<p>显示错误，说明密码已经修改。</p>
<p>2）用修改后的密码登录:</p>
<p>[root@test1 local]# mysql -u root -p</p>
<p>Enter password: (输入修改后的密码21century)</p>
<p>Welcome to the MySQL monitor. Commands end with ; or \g.</p>
<p>Your MySQL connection id is 177 to server version: 3.23.48</p>
<p>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.</p>
<p>mysql&gt;</p>
<p>成功！</p>
<p>这是通过mysqladmin命令修改口令，也可通过修改库来更改口令。</p>
<p>4、启动和停止:</p>
<p>启动：Mysql从3.23.15版本开始作了改动，默认安装后服务要用MySQL用户来启动，不允许root用户启动。</p>
<p>如果非要用root用户来启动，必须加上--user=root参数(./safe_mysqld --user=root &amp;)停止：mysqladmin -u root -p shutdown。</p>
<p>5、导出meeting数据库：</p>
<p>mysqldump -uroot -p21century meeting &gt; db_meeting.sql</p>
<p>导人dbname数据库: </p>
<p>mysqldump -uroot -p21century dbname &lt; xxx.sql</p>
<p>导入数据库还可用类似于oracle中@my_script.sql的方式一次执行大量sql语句，这在使用mysqldump不起作用时非常有用。</p>
<p>例：#./mysql -uroot -p &lt; /home/xuys/db_meeting_2003.sql</p>
<p>(注：create database、use databasename、create table和insert into语句都可写在上面的脚步文件中)</p>
<p>6、给表改名:</p>
<p>RENAME TABLE ztemp TO zteMP4;</p>
<p>7、修改字段属性：</p>
<p>ALTER TABLE bbabase CHANGE news_id id VARCHAR(5) NOT NULL;</p>
<p>8、在表中的content后增加一字段：</p>
<p>ALTER TABLE bbabase ADD leave_time DATETIME NOT NULL AFTER </p>
<img src ="http://www.blogjava.net/lcs868/aggbug/343306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2011-01-21 11:17 <a href="http://www.blogjava.net/lcs868/articles/343306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql安装</title><link>http://www.blogjava.net/lcs868/articles/343305.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Fri, 21 Jan 2011 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/343305.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/343305.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/343305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/343305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/343305.html</trackback:ping><description><![CDATA[shell&gt; groupadd mysql<br />
shell&gt; useradd -g mysql mysql<br />
shell&gt; gunzip &lt; mysql-VERSION.tar.gz | tar -xvf -<br />
shell&gt; cd mysql-VERSION<br />
shell&gt; ./configure --prefix=/usr/local/mysql<br />
shell&gt; make<br />
shell&gt; make install<br />
shell&gt; cp support-files/my-medium.cnf /etc/my.cnf<br />
shell&gt; cd /usr/local/mysql<br />
shell&gt; bin/mysql_install_db --user=mysql<br />
shell&gt; chown -R root&nbsp; .<br />
shell&gt; chown -R mysql var<br />
shell&gt; chgrp -R mysql .<br />
shell&gt; bin/mysqld_safe --user=mysql &amp;
<img src ="http://www.blogjava.net/lcs868/aggbug/343305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2011-01-21 11:16 <a href="http://www.blogjava.net/lcs868/articles/343305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux系统下jdk1.6安装</title><link>http://www.blogjava.net/lcs868/articles/343304.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Fri, 21 Jan 2011 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/343304.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/343304.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/343304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/343304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/343304.html</trackback:ping><description><![CDATA[<p>1. 从网站上下载jdk1.6包(jdk-6u10-linux-i586-rpm.bin ),通过leapFTP上传到linux系统的/var/ftp/pub目录下</p>
<p>&nbsp;</p>
<p>&nbsp; 2.在linux中切换到 /var/ftp/pub目录下，修改jdk1.6的使用权限：#chmod&nbsp; u+x&nbsp; jdk-6u10-linux-i586-rpm.bin</p>
<p>&nbsp;</p>
<p>&nbsp; 3.解压并安装：#./ jdk-6u10-linux-i586-rpm.bin (默认安装在/usr/java中)</p>
<p>&nbsp;</p>
<p>&nbsp; 4.环境变量配置：</p>
<p>&nbsp;&nbsp;&nbsp; #vi&nbsp; /etc/profile</p>
<p>&nbsp;&nbsp;&nbsp; 在该profile文件中添加：</p>
<p>&nbsp;&nbsp;&nbsp; JAVA_HOME=/usr/java/jdk1.6.0_10</p>
<p>&nbsp;&nbsp;&nbsp; JRE_HOME=/usr/java/jdk1.6.0_10/jre</p>
<p>&nbsp;&nbsp;&nbsp; PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin</p>
<p>&nbsp;&nbsp;&nbsp; CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib</p>
<p>&nbsp;&nbsp;&nbsp; export JAVA_HOME JRE_HOME PATH CLASSPATH</p>
<p>&nbsp;&nbsp;&nbsp; 添加完毕保存退出</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; #source /etc/profile</p>
<p>&nbsp;&nbsp;&nbsp; #java -version</p>
<p>&nbsp;&nbsp;&nbsp; 显示 java version "1.6.0_10" (jdk1.6安装成功)</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 卸载rpm版的jdk：</p>
<p>&nbsp;&nbsp; #rpm -qa|grep jdk</p>
<p>&nbsp;&nbsp; 显示：jdk-1.6.0_10-fcs<br />
&nbsp;&nbsp; 卸载：#rpm -e&nbsp; --nodeps&nbsp; jdk-1.6.0_10-fcs</p>
 <img src ="http://www.blogjava.net/lcs868/aggbug/343304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2011-01-21 11:14 <a href="http://www.blogjava.net/lcs868/articles/343304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql slave,master配置</title><link>http://www.blogjava.net/lcs868/articles/343303.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Fri, 21 Jan 2011 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/343303.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/343303.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/343303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/343303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/343303.html</trackback:ping><description><![CDATA[<p>一个完整的mysql读写分离环境包括以下几个部分：</p>
<p>应用程序client <br />
database proxy <br />
database集群 <br />
在本次实战中，应用程序client基于c3p0连接后端的database proxy。database proxy负责管理client实际访问database的路由策略，采用开源框架amoeba。database集群采用mysql的master-slave的replication方案。整个环境的结构图如下所示：</p>
<p>&nbsp;</p>
<p>实战步骤与详解</p>
<p>一.搭建mysql的master-slave环境 </p>
<p>1）分别在host1（10.20.147.110）和host2（10.20.147.111）上安装mysql（5.0.45），具体安装方法可见官方文档</p>
<p>2）配置master</p>
<p>首先编辑/etc/my.cnf，添加以下配置：</p>
<p>log-bin=mysql-bin #slave会基于此log-bin来做replication<br />
server-id=1 #master的标示<br />
binlog-do-db = amoeba_study #用于master-slave的具体数据库</p>
<p>然后添加专门用于replication的用户：</p>
<p>mysql&gt; GRANT REPLICATION SLAVE ON *.* TO repl@10.20.147.111 IDENTIFIED BY '111111';</p>
<p>重启mysql，使得配置生效：</p>
<p>/etc/init.d/mysqld restart</p>
<p>最后查看master状态：</p>
<p>&nbsp;</p>
<p>3）配置slave</p>
<p>首先编辑/etc/my.cnf，添加以下配置：</p>
<p>server-id=2 #slave的标示</p>
<p>配置生效后，配置与master的连接：</p>
<p>mysql&gt; CHANGE MASTER TO<br />
&nbsp;&nbsp;&nbsp; -&gt; MASTER_HOST='10.20.147.110',<br />
&nbsp;&nbsp;&nbsp; -&gt; MASTER_USER='repl',<br />
&nbsp;&nbsp;&nbsp; -&gt; MASTER_PASSWORD='111111',<br />
&nbsp;&nbsp;&nbsp; -&gt; MASTER_LOG_FILE='mysql-bin.000003',<br />
&nbsp;&nbsp;&nbsp; -&gt; MASTER_LOG_POS=161261;</p>
<p>其中MASTER_HOST是master机的ip，MASTER_USER和MASTER_PASSWORD就是我们刚才在master上添加的用户，MASTER_LOG_FILE和MASTER_LOG_POS对应与master status里的信息</p>
<p>最后启动slave：</p>
<p>mysql&gt; start slave;</p>
<p>4）验证master-slave搭建生效</p>
<p>通过查看slave机的log（/var/log/mysqld.log）：</p>
<p>100703 10:51:42 [Note] Slave I/O thread: connected to master 'repl@10.20.147.110:3306',&nbsp; replication started in log 'mysql-bin.000003' at position 161261</p>
<p>如看到以上信息则证明搭建成功，如果有问题也可通过此log找原因</p>
<p>二.搭建database proxy </p>
<p>此次实战中database proxy采用amoeba ，它的相关信息可以查阅官方文档，不在此详述</p>
<p>1）安装amoeba</p>
<p>下载amoeba（1.2.0-GA）后解压到本地（D:\openSource\amoeba-mysql-1.2.0-GA），即完成安装</p>
<p>2）配置amoeba</p>
<p>先配置proxy连接和与各后端mysql服务器连接信息（D:\openSource\amoeba-mysql-1.2.0-GA\conf\amoeba.xml）：</p>
<p>&lt;server&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- proxy server绑定的端口 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="port"&gt;8066&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- proxy server绑定的IP --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!--&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="ipAddress"&gt;127.0.0.1&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- proxy server net IO Read thread size --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="readThreadPoolSize"&gt;20&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- proxy server client process thread size --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="clientSideThreadPoolSize"&gt;30&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- mysql server data packet process thread size --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="serverSideThreadPoolSize"&gt;30&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- socket Send and receive BufferSize(unit:K)&nbsp; --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="netBufferSize"&gt;128&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="tcpNoDelay"&gt;true&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- 对外验证的用户名 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="user"&gt;root&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- 对外验证的密码 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;root&lt;/property&gt;&nbsp; <br />
&lt;/server&gt;&nbsp; <br />
&lt;server&gt;<br />
&nbsp;&lt;!-- proxy server绑定的端口 --&gt;<br />
&nbsp;&lt;property name="port"&gt;8066&lt;/property&gt;<br />
&nbsp;<br />
&nbsp;&lt;!-- proxy server绑定的IP --&gt;<br />
&nbsp;&lt;!-- <br />
&nbsp;&lt;property name="ipAddress"&gt;127.0.0.1&lt;/property&gt;<br />
&nbsp; --&gt;<br />
&nbsp;&lt;!-- proxy server net IO Read thread size --&gt;<br />
&nbsp;&lt;property name="readThreadPoolSize"&gt;20&lt;/property&gt;<br />
&nbsp;<br />
&nbsp;&lt;!-- proxy server client process thread size --&gt;<br />
&nbsp;&lt;property name="clientSideThreadPoolSize"&gt;30&lt;/property&gt;<br />
&nbsp;<br />
&nbsp;&lt;!-- mysql server data packet process thread size --&gt;<br />
&nbsp;&lt;property name="serverSideThreadPoolSize"&gt;30&lt;/property&gt;<br />
&nbsp;<br />
&nbsp;&lt;!-- socket Send and receive BufferSize(unit:K)&nbsp; --&gt;<br />
&nbsp;&lt;property name="netBufferSize"&gt;128&lt;/property&gt;<br />
&nbsp;<br />
&nbsp;&lt;!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). --&gt;<br />
&nbsp;&lt;property name="tcpNoDelay"&gt;true&lt;/property&gt;<br />
&nbsp;<br />
&nbsp;&lt;!-- 对外验证的用户名 --&gt;<br />
&nbsp;&lt;property name="user"&gt;root&lt;/property&gt;<br />
&nbsp;<br />
&nbsp;&lt;!-- 对外验证的密码 --&gt;<br />
&nbsp;&lt;property name="password"&gt;root&lt;/property&gt;<br />
&lt;/server&gt; </p>
<p>以上是proxy提供给client的连接配置</p>
<p>&lt;dbServerList&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;dbServer name="server1"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- PoolableObjectFactory实现类 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="manager"&gt;defaultManager&lt;/property&gt;&nbsp; <br />
&nbsp;&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; &lt;!-- 真实mysql数据库端口 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="port"&gt;3306&lt;/property&gt;&nbsp; <br />
&nbsp;&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; &lt;!-- 真实mysql数据库IP --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="ipAddress"&gt;10.20.147.110&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="schema"&gt;amoeba_study&lt;/property&gt;&nbsp; <br />
&nbsp;&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; &lt;!-- 用于登陆mysql的用户名 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="user"&gt;root&lt;/property&gt;&nbsp; <br />
&nbsp;&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; &lt;!-- 用于登陆mysql的密码 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/factoryConfig&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- ObjectPool实现类 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxActive"&gt;200&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxIdle"&gt;200&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="minIdle"&gt;10&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="minEvictableIdleTimeMillis"&gt;600000&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="timeBetweenEvictionRunsMillis"&gt;600000&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="testOnBorrow"&gt;true&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="testWhileIdle"&gt;true&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/poolConfig&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/dbServer&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;dbServer name="server2"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- PoolableObjectFactory实现类 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="manager"&gt;defaultManager&lt;/property&gt;&nbsp; <br />
&nbsp;&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; &lt;!-- 真实mysql数据库端口 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="port"&gt;3306&lt;/property&gt;&nbsp; <br />
&nbsp;&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; &lt;!-- 真实mysql数据库IP --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="ipAddress"&gt;10.20.147.111&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="schema"&gt;amoeba_study&lt;/property&gt;&nbsp; <br />
&nbsp;&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; &lt;!-- 用于登陆mysql的用户名 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="user"&gt;root&lt;/property&gt;&nbsp; <br />
&nbsp;&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; &lt;!-- 用于登陆mysql的密码 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/factoryConfig&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- ObjectPool实现类 --&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxActive"&gt;200&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxIdle"&gt;200&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="minIdle"&gt;10&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="minEvictableIdleTimeMillis"&gt;600000&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="timeBetweenEvictionRunsMillis"&gt;600000&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="testOnBorrow"&gt;true&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="testWhileIdle"&gt;true&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/poolConfig&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/dbServer&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&lt;/dbServerList&gt;&nbsp; <br />
&lt;dbServerList&gt;<br />
&nbsp;&lt;dbServer name="server1"&gt;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;!-- PoolableObjectFactory实现类 --&gt;<br />
&nbsp;&nbsp;&lt;factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="manager"&gt;defaultManager&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 真实mysql数据库端口 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="port"&gt;3306&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 真实mysql数据库IP --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="ipAddress"&gt;10.20.147.110&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="schema"&gt;amoeba_study&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 用于登陆mysql的用户名 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="user"&gt;root&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 用于登陆mysql的密码 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="password"&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;/factoryConfig&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;!-- ObjectPool实现类 --&gt;<br />
&nbsp;&nbsp;&lt;poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="maxActive"&gt;200&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="maxIdle"&gt;200&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="minIdle"&gt;10&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="minEvictableIdleTimeMillis"&gt;600000&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="timeBetweenEvictionRunsMillis"&gt;600000&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="testOnBorrow"&gt;true&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="testWhileIdle"&gt;true&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;/poolConfig&gt;<br />
&nbsp;&lt;/dbServer&gt;<br />
&nbsp;&lt;dbServer name="server2"&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;!-- PoolableObjectFactory实现类 --&gt;<br />
&nbsp;&nbsp;&lt;factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="manager"&gt;defaultManager&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 真实mysql数据库端口 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="port"&gt;3306&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 真实mysql数据库IP --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="ipAddress"&gt;10.20.147.111&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="schema"&gt;amoeba_study&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 用于登陆mysql的用户名 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="user"&gt;root&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 用于登陆mysql的密码 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="password"&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;/factoryConfig&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;!-- ObjectPool实现类 --&gt;<br />
&nbsp;&nbsp;&lt;poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="maxActive"&gt;200&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="maxIdle"&gt;200&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="minIdle"&gt;10&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="minEvictableIdleTimeMillis"&gt;600000&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="timeBetweenEvictionRunsMillis"&gt;600000&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="testOnBorrow"&gt;true&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="testWhileIdle"&gt;true&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;/poolConfig&gt;<br />
&nbsp;&lt;/dbServer&gt;&nbsp;&nbsp;<br />
&lt;/dbServerList&gt; </p>
<p>以上是proxy与后端各mysql数据库服务器配置信息，具体配置见注释很明白了</p>
<p>最后配置读写分离策略：</p>
<p>&lt;queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="LRUMapSize"&gt;1500&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="defaultPool"&gt;server1&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="writePool"&gt;server1&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="readPool"&gt;server2&lt;/property&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="needParse"&gt;true&lt;/property&gt;&nbsp; <br />
&lt;/queryRouter&gt;&nbsp; <br />
&lt;queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"&gt;<br />
&nbsp;&lt;property name="LRUMapSize"&gt;1500&lt;/property&gt;<br />
&nbsp;&lt;property name="defaultPool"&gt;server1&lt;/property&gt;<br />
&nbsp;&lt;property name="writePool"&gt;server1&lt;/property&gt;<br />
&nbsp;&lt;property name="readPool"&gt;server2&lt;/property&gt;<br />
&nbsp;&lt;property name="needParse"&gt;true&lt;/property&gt;<br />
&lt;/queryRouter&gt; </p>
<p>从以上配置不然发现，写操作路由到server1（master），读操作路由到server2（slave）</p>
<p>3）启动amoeba</p>
<p>在命令行里运行D:\openSource\amoeba-mysql-1.2.0-GA\amoeba.bat即可：</p>
<p>log4j:WARN log4j config load completed from file:D:\openSource\amoeba-mysql-1.2.0-GA\conf\log4j.xml<br />
log4j:WARN ip access config load completed from file:D:\openSource\amoeba-mysql-1.2.0-GA/conf/access_list.conf<br />
2010-07-03 09:55:33,821 INFO&nbsp; net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.<br />
三.client端调用与测试 </p>
<p>1）编写client调用程序</p>
<p>具体程序细节就不详述了，只是一个最普通的基于mysql driver的jdbc的数据库操作程序</p>
<p>2）配置数据库连接</p>
<p>本client基于c3p0，具体数据源配置如下：</p>
<p>&lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"&nbsp; <br />
&nbsp;&nbsp;&nbsp; destroy-method="close"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="driverClass" value="com.mysql.jdbc.Driver" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="user" value="root" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="password" value="root" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="minPoolSize" value="1" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="maxPoolSize" value="1" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="maxIdleTime" value="1800" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="acquireIncrement" value="1" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="maxStatements" value="0" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="initialPoolSize" value="1" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="idleConnectionTestPeriod" value="1800" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="acquireRetryAttempts" value="6" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="acquireRetryDelay" value="1000" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="breakAfterAcquireFailure" value="false" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="testConnectionOnCheckout" value="true" /&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;property name="testConnectionOnCheckin" value="false" /&gt;&nbsp; <br />
&lt;/bean&gt;&nbsp; <br />
&lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"<br />
&nbsp;destroy-method="close"&gt;<br />
&nbsp;&lt;property name="driverClass" value="com.mysql.jdbc.Driver" /&gt;<br />
&nbsp;&lt;property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" /&gt;<br />
&nbsp;&lt;property name="user" value="root" /&gt;<br />
&nbsp;&lt;property name="password" value="root" /&gt;<br />
&nbsp;&lt;property name="minPoolSize" value="1" /&gt;<br />
&nbsp;&lt;property name="maxPoolSize" value="1" /&gt;<br />
&nbsp;&lt;property name="maxIdleTime" value="1800" /&gt;<br />
&nbsp;&lt;property name="acquireIncrement" value="1" /&gt;<br />
&nbsp;&lt;property name="maxStatements" value="0" /&gt;<br />
&nbsp;&lt;property name="initialPoolSize" value="1" /&gt;<br />
&nbsp;&lt;property name="idleConnectionTestPeriod" value="1800" /&gt;<br />
&nbsp;&lt;property name="acquireRetryAttempts" value="6" /&gt;<br />
&nbsp;&lt;property name="acquireRetryDelay" value="1000" /&gt;<br />
&nbsp;&lt;property name="breakAfterAcquireFailure" value="false" /&gt;<br />
&nbsp;&lt;property name="testConnectionOnCheckout" value="true" /&gt;<br />
&nbsp;&lt;property name="testConnectionOnCheckin" value="false" /&gt;<br />
&lt;/bean&gt; </p>
<p>值得注意是，client端只需连到proxy，与实际的数据库没有任何关系，因此jdbcUrl、user、password配置都对应于amoeba暴露出来的配置信息</p>
<p>3）调用与测试</p>
<p>首先插入一条数据：insert into zone_by_id(id,name) values(20003,'name_20003')</p>
<p>通过查看master机上的日志/var/lib/mysql/mysql_log.log：</p>
<p>100703 11:58:42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set names latin1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET NAMES latin1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET character_set_results = NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHOW VARIABLES<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHOW COLLATION<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET autocommit=1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET sql_mode='STRICT_TRANS_TABLES'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHOW VARIABLES LIKE 'tx_isolation'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHOW FULL TABLES FROM `amoeba_study` LIKE 'PROBABLYNOT'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Prepare&nbsp;&nbsp;&nbsp;&nbsp; [1] insert into zone_by_id(id,name) values(?,?)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Prepare&nbsp;&nbsp;&nbsp;&nbsp; [2] insert into zone_by_id(id,name) values(?,?)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Execute&nbsp;&nbsp;&nbsp;&nbsp; [2] insert into zone_by_id(id,name) values(20003,'name_20003') </p>
<p>得知写操作发生在master机上</p>
<p>通过查看slave机上的日志/var/lib/mysql/mysql_log.log：</p>
<p>100703 11:58:42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into zone_by_id(id,name) values(20003,'name_20003') </p>
<p>得知slave同步执行了这条语句</p>
<p>然后查一条数据：select t.name from zone_by_id t where t.id = 20003</p>
<p>通过查看slave机上的日志/var/lib/mysql/mysql_log.log：</p>
<p>100703 12:02:00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33 Query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set names latin1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33 Prepare&nbsp;&nbsp;&nbsp;&nbsp; [1] select t.name from zone_by_id t where t.id = ?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33 Prepare&nbsp;&nbsp;&nbsp;&nbsp; [2] select t.name from zone_by_id t where t.id = ?&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33 Execute&nbsp;&nbsp;&nbsp;&nbsp; [2] select t.name from zone_by_id t where t.id = 20003&nbsp; </p>
<p>得知读操作发生在slave机上</p>
<p>并且通过查看slave机上的日志/var/lib/mysql/mysql_log.log发现这条语句没在master上执行</p>
<p>通过以上验证得知简单的master-slave搭建和实战得以生效</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/cutesource/archive/2010/07/03/5710645.aspx</p>
 <img src ="http://www.blogjava.net/lcs868/aggbug/343303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2011-01-21 11:09 <a href="http://www.blogjava.net/lcs868/articles/343303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现验证码</title><link>http://www.blogjava.net/lcs868/archive/2008/12/16/246654.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Tue, 16 Dec 2008 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/archive/2008/12/16/246654.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/246654.html</wfw:comment><comments>http://www.blogjava.net/lcs868/archive/2008/12/16/246654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/246654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/246654.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">以下类产生4位验证码<br />
</span>
<p><span style="font-size: 10pt">public class ImageTool{</span></p>
<p><span style="font-size: 10pt">&nbsp; private static Random random = new Random();</span></p>
<p><span style="font-size: 10pt">&nbsp; public ImageTool() {<br />
&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp; public static Color getRandColor(int fc,int bc){//给定范围获得随机颜色<br />
&nbsp;&nbsp;&nbsp; if(fc&gt;255) fc=255;<br />
&nbsp;&nbsp;&nbsp; if(bc&gt;255) bc=255;<br />
&nbsp;&nbsp;&nbsp; int r=fc+random.nextInt(bc-fc);<br />
&nbsp;&nbsp;&nbsp; int g=fc+random.nextInt(bc-fc);<br />
&nbsp;&nbsp;&nbsp; int b=fc+random.nextInt(bc-fc);<br />
&nbsp;&nbsp;&nbsp; return new Color(r,g,b);<br />
&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp; public static void outputImage(HttpSession session, HttpServletResponse response) throws IOException{</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);<br />
&nbsp;&nbsp;&nbsp; Graphics g = image.getGraphics();</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setColor(getRandColor(200, 250));<br />
&nbsp;&nbsp;&nbsp; g.fillRect(0, 0, 60, 20);</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setFont(new Font("Times New Roman",Font.PLAIN,18));</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setColor(getRandColor(160, 200));<br />
&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;155;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = random.nextInt(60);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y = random.nextInt(20);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int xl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int yl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawLine(x,y,x+xl,y+yl);<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; StringBuffer randCode = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;4;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String temp = String.valueOf(random.nextInt(10));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; randCode.append(temp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawString(temp,13*i+6,16);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; session.setAttribute("randCode", randCode.toString());</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.dispose();<br />
&nbsp;&nbsp;&nbsp; OutputStream out=response.getOutputStream();</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; response.reset();<br />
&nbsp;&nbsp;&nbsp; ImageIO.write(image, "jpg", out);<br />
&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp; public static void imagePut(HttpSession session,OutputStream out,int pWidth,int pHeight,int pSize) throws IOException{</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; BufferedImage image = new BufferedImage(pWidth, pHeight, BufferedImage.TYPE_INT_RGB);<br />
&nbsp;&nbsp;&nbsp; Graphics g = image.getGraphics();</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setColor(getRandColor(200, 250));<br />
&nbsp;&nbsp;&nbsp; g.fillRect(0, 0, pWidth, pHeight);</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setFont(new Font("Times New Roman",Font.PLAIN,pSize));</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setColor(getRandColor(160, 200));<br />
&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;18;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = random.nextInt(60);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y = random.nextInt(20);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int xl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int yl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawLine(x,y,x+xl,y+yl);<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; StringBuffer randCode = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;4;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String temp = String.valueOf(random.nextInt(10));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; randCode.append(temp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawString(temp,13*i+6,16);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; g.dispose();<br />
&nbsp;&nbsp;&nbsp; ImageIO.write(image, "jpg", out);<br />
&nbsp;&nbsp;&nbsp; session.setAttribute("randCode", randCode.toString());<br />
//&nbsp;&nbsp;&nbsp; System.out.println("sessionID："+session.toString()+"； 产生的验证码："+session.getAttribute("randCode"));</span></p>
<p><span style="font-size: 10pt">&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp; public static void imagePutOneColor(HttpSession session,OutputStream out,int pWidth,int pHeight,int pSize) throws IOException{</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; BufferedImage image = new BufferedImage(pWidth, pHeight, BufferedImage.TYPE_INT_RGB);<br />
&nbsp;&nbsp;&nbsp; Graphics g = image.getGraphics();</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setColor(new Color(255,255,255));<br />
&nbsp;&nbsp;&nbsp; g.fillRect(0, 0, 60, 20);</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setFont(new Font("Times New Roman",Font.TRUETYPE_FONT,pSize));</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setColor(getRandColor(200, 250));<br />
&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;18;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = random.nextInt(60);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y = random.nextInt(20);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int xl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int yl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawLine(x,y,x+xl,y+yl);<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; StringBuffer randCode = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;4;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String temp = String.valueOf(random.nextInt(10));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; randCode.append(temp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setColor(new Color(0,0,0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawString(temp,13*i+6,16);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; session.setAttribute("randCode", randCode.toString());</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.dispose();<br />
&nbsp;&nbsp;&nbsp; ImageIO.write(image, "jpg", out);<br />
&nbsp; }</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp; public static void outputImage(String sessionName, HttpSession session, HttpServletResponse response) throws IOException{</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);<br />
&nbsp;&nbsp;&nbsp; Graphics g = image.getGraphics();</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setColor(getRandColor(200, 250));<br />
&nbsp;&nbsp;&nbsp; g.fillRect(0, 0, 60, 20);</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setFont(new Font("Times New Roman",Font.PLAIN,18));</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; g.setColor(getRandColor(160, 200));<br />
&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;155;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = random.nextInt(60);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y = random.nextInt(20);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int xl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int yl = random.nextInt(12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawLine(x,y,x+xl,y+yl);<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; StringBuffer randCode = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;4;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String temp = String.valueOf(random.nextInt(10));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; randCode.append(temp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawString(temp,13*i+6,16);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; session.setAttribute(sessionName, randCode.toString());<br />
&nbsp;&nbsp;&nbsp; g.dispose();<br />
&nbsp;&nbsp;&nbsp; response.reset();<br />
&nbsp;&nbsp;&nbsp; OutputStream out=response.getOutputStream();<br />
&nbsp;&nbsp;&nbsp; ImageIO.write(image, "JPEG", out);</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; out.flush();<br />
&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp; }<br />
}</span></p>
<img src ="http://www.blogjava.net/lcs868/aggbug/246654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2008-12-16 16:17 <a href="http://www.blogjava.net/lcs868/archive/2008/12/16/246654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring cron表达式</title><link>http://www.blogjava.net/lcs868/articles/246649.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Tue, 16 Dec 2008 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/246649.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/246649.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/246649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/246649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/246649.html</trackback:ping><description><![CDATA[<br />
<p><span style="font-size: 10pt">Cron表达式是一个字符串，字符串以5或6个空格隔开，分开工6或7个域，每一个域代表一个含义,Cron有如下两种语法 <br />
格式： <br />
Seconds Minutes Hours DayofMonth Month DayofWeek Year 或 <br />
Seconds Minutes Hours DayofMonth Month DayofWeek <br />
每一个域可出现的字符如下： </span></p>
<p><br />
<span style="font-size: 10pt">代码<br />
Seconds:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为0-59的整数&nbsp;&nbsp;&nbsp; <br />
Minutes:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为0-59的整数&nbsp;&nbsp;&nbsp; <br />
Hours:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为0-23的整数&nbsp;&nbsp;&nbsp; <br />
DayofMonth:可出现,-&nbsp; *&nbsp; / ? L W C八个字符，有效范围为0-31的整数&nbsp;&nbsp;&nbsp;&nbsp; <br />
Month:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为1-12的整数或JAN-DEc&nbsp;&nbsp;&nbsp; <br />
DayofWeek:可出现,-&nbsp; *&nbsp; / ? L C #四个字符，有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天，2表示星期一， 依次类推&nbsp;&nbsp;&nbsp; <br />
Year:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为1970-2099年&nbsp;&nbsp; <br />
&nbsp;</span></p>
<p><span style="font-size: 10pt">每一个域都使用数字，但还可以出现如下特殊字符，它们的含义是： </span></p>
<p><br />
<span style="font-size: 10pt">代码<br />
(1)*：表示匹配该域的任意值，假如在Minutes域使用*,即表示每分钟都会触发事件。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值，但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度，不管20日到底是星期几，则只能使用如下写法： 13&nbsp; 13 15 20 * ?,其中最后一位只能用？，而不能使用*，如果使用*表示不管星期几都会触发，实际上并不是这样。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(3)-:表示范围，例如在Minutes域使用5-20，表示从5分到20分钟每分钟触发一次&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(4)/：表示起始时间开始触发，然后每隔固定时间触发一次，例如在Minutes域使用5/20,则意味着5分钟触发一次，而25，45等分别触发一次.&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(5),:表示列出枚举值值。例如：在Minutes域使用5,20，则意味着在5和20分每分钟触发一次。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(6)L:表示最后，只能出现在DayofWeek和DayofMonth域，如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域，系统将在离指定日期的最近的有效工作日触发事件。例如：在DayofMonth使用5W，如果5日是星期六，则将在最近的工作日：星期五，即4日触发。如果5日是星期天，则在6日触发；如果5日在星期一到星期五中的一天，则就在5日触发。另外一点，W的最近寻找不会跨过月份&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(8)LW:这两个字符可以连用，表示在某个月最后一个工作日，即最后一个星期五。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(9)#:用于确定每个月第几个星期几，只能出现在DayofMonth域。例如在4#2，表示某月的第二个星期三。&nbsp;&nbsp;&nbsp; <br />
举几个例子: </span></p>
<p><br />
<span style="font-size: 10pt">代码<br />
0 0&nbsp; 2&nbsp; 1 *&nbsp; ? *&nbsp; 表示在每月的1日的凌晨2点调度任务&nbsp;&nbsp;&nbsp;&nbsp; <br />
0 15 10 ? *&nbsp; MON-FRI 表示周一到周五每天上午10：15执行作业&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
0 15 10 ? 6L 2002-2006 表示200-2006年的每个月的最后一个星期五上午10:15执行作业&nbsp;&nbsp; <br />
91linux </span></p>
<p><br />
<span style="font-size: 10pt">一个cron表达式有至少6个（也可能7个）有空格分隔的时间元素。</span></p>
<p><span style="font-size: 10pt">按顺序依次为 <br />
秒（0~59） <br />
分钟（0~59） </span></p>
<p><span style="font-size: 10pt">小时（0~23） </span></p>
<p><span style="font-size: 10pt">天（月）（0~31，但是你需要考虑你月的天数） </span></p>
<p><span style="font-size: 10pt">月（0~11） </span></p>
<p><span style="font-size: 10pt">天（星期）（1~7 1=SUN 或 SUN，MON，TUE，WED，THU，FRI，SAT） </span></p>
<p><span style="font-size: 10pt">7.年份（1970－2099）</span></p>
<p><span style="font-size: 10pt">其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. </span></p>
<p><span style="font-size: 10pt">0 0 10,14,16 * * ? 每天上午10点，下午2点，4点<br />
0 0/30 9-17 * * ?&nbsp;&nbsp; 朝九晚五工作时间内每半小时<br />
0 0 12 ? * WED 表示每个星期三中午12点 <br />
"0 0 12 * * ?" 每天中午12点触发 <br />
"0 15 10 ? * *" 每天上午10:15触发 <br />
"0 15 10 * * ?" 每天上午10:15触发 <br />
"0 15 10 * * ? *" 每天上午10:15触发 <br />
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 <br />
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 <br />
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 <br />
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 <br />
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 <br />
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 <br />
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 <br />
"0 15 10 15 * ?" 每月15日上午10:15触发 <br />
"0 15 10 L * ?" 每月最后一日的上午10:15触发 <br />
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 <br />
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 <br />
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 </span></p>
<p><br />
<span style="font-size: 10pt">有些子表达式能包含一些范围或列表 </span></p>
<p><span style="font-size: 10pt">例如：子表达式（天（星期））可以为 &#8220;MON-FRI&#8221;，&#8220;MON，WED，FRI&#8221;，&#8220;MON-WED,SAT&#8221; </span></p>
<p><span style="font-size: 10pt">&#8220;*&#8221;字符代表所有可能的值 </span></p>
<p><span style="font-size: 10pt">因此，&#8220;*&#8221;在子表达式（月）里表示每个月的含义，&#8220;*&#8221;在子表达式（天（星期））表示星期的每一天 </span></p>
<p><span style="font-size: 10pt">&nbsp;</span></p>
<p><span style="font-size: 10pt">&#8220;/&#8221;字符用来指定数值的增量 </span></p>
<p><span style="font-size: 10pt">例如：在子表达式（分钟）里的&#8220;0/15&#8221;表示从第0分钟开始，每15分钟 </span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在子表达式（分钟）里的&#8220;3/20&#8221;表示从第3分钟开始，每20分钟（它和&#8220;3，23，43&#8221;）的含义一样 </span></p>
<p><br />
<span style="font-size: 10pt">&#8220;？&#8221;字符仅被用于天（月）和天（星期）两个子表达式，表示不指定值 </span></p>
<p><span style="font-size: 10pt">当2个子表达式其中之一被指定了值以后，为了避免冲突，需要将另一个子表达式的值设为&#8220;？&#8221; </span></p>
<p><span style="font-size: 10pt">&nbsp;</span></p>
<p><span style="font-size: 10pt">&#8220;L&#8221; 字符仅被用于天（月）和天（星期）两个子表达式，它是单词&#8220;last&#8221;的缩写 </span></p>
<p><span style="font-size: 10pt">但是它在两个子表达式里的含义是不同的。 </span></p>
<p><span style="font-size: 10pt">在天（月）子表达式中，&#8220;L&#8221;表示一个月的最后一天 </span></p>
<p><span style="font-size: 10pt">在天（星期）自表达式中，&#8220;L&#8221;表示一个星期的最后一天，也就是SAT </span></p>
<p><span style="font-size: 10pt">如果在&#8220;L&#8221;前有具体的内容，它就具有其他的含义了 </span></p>
<p><span style="font-size: 10pt">例如：&#8220;6L&#8221;表示这个月的倒数第６天，&#8220;ＦＲＩＬ&#8221;表示这个月的最一个星期五 </span></p>
<p><span style="font-size: 10pt">注意：在使用&#8220;L&#8221;参数时，不要指定列表或范围，因为这会导致问题 </span></p>
<p><span style="font-size: 10pt">&nbsp;</span></p>
<p><span style="font-size: 10pt">字段&nbsp;&nbsp; 允许值&nbsp;&nbsp; 允许的特殊字符 <br />
秒&nbsp;&nbsp;&nbsp; 0-59&nbsp;&nbsp;&nbsp; , - * / <br />
分&nbsp;&nbsp;&nbsp; 0-59&nbsp;&nbsp;&nbsp; , - * / <br />
小时&nbsp;&nbsp;&nbsp; 0-23&nbsp;&nbsp;&nbsp; , - * / <br />
日期&nbsp;&nbsp;&nbsp; 1-31&nbsp;&nbsp;&nbsp; , - * ? / L W C <br />
月份&nbsp;&nbsp;&nbsp; 1-12 或者 JAN-DEC&nbsp;&nbsp;&nbsp; , - * / <br />
星期&nbsp;&nbsp;&nbsp; 1-7 或者 SUN-SAT&nbsp;&nbsp;&nbsp; , - * ? / L C # <br />
年（可选）&nbsp;&nbsp;&nbsp; 留空, 1970-2099&nbsp;&nbsp;&nbsp; , - * / </span></p>
<img src ="http://www.blogjava.net/lcs868/aggbug/246649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2008-12-16 16:06 <a href="http://www.blogjava.net/lcs868/articles/246649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现ip查询</title><link>http://www.blogjava.net/lcs868/archive/2008/12/16/246644.html</link><dc:creator>李春生</dc:creator><author>李春生</author><pubDate>Tue, 16 Dec 2008 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/archive/2008/12/16/246644.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/246644.html</wfw:comment><comments>http://www.blogjava.net/lcs868/archive/2008/12/16/246644.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/246644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/246644.html</trackback:ping><description><![CDATA[<br />
<span style="font-size: 10pt">用java实现对纯真IP数据库的查询，首先到网上下载QQwry.da文件，读取代码如下：<br />
1.IP记录实体类<br />
</span>
<p><span style="font-size: 10pt">package com.guess.tools;</span></p>
<p><span style="font-size: 10pt">/** *<br />
* 一条IP范围记录，不仅包括国家和区域，也包括起始IP和结束IP * </span></p>
<p><span style="font-size: 10pt">&nbsp;* <br />
&nbsp;* @author swallow */<br />
public class IPEntry {<br />
&nbsp;&nbsp;&nbsp; public String beginIp;<br />
&nbsp;&nbsp;&nbsp; public String endIp;<br />
&nbsp;&nbsp;&nbsp; public String country;<br />
&nbsp;&nbsp;&nbsp; public String area;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 构造函数<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp; <br />
&nbsp;</span></p>
<p><span style="font-size: 10pt">&nbsp;public IPEntry() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beginIp = endIp = country = area = "";<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String toString(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.area+"&nbsp; "+this.country+"IP范围:"+this.beginIp+"-"+this.endIp;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; } <br />
2.读取QQwry.dat文件类</span></p>
<p><span style="font-size: 10pt">package com.guess.tools;</span></p>
<p><span style="font-size: 10pt">import java.io.FileNotFoundException;<br />
import java.io.IOException;<br />
import java.io.RandomAccessFile;<br />
import java.nio.ByteOrder;<br />
import java.nio.MappedByteBuffer;<br />
import java.nio.channels.FileChannel;<br />
import java.util.ArrayList;<br />
import java.util.Hashtable;<br />
import java.util.List;</span></p>
<p><span style="font-size: 10pt">&nbsp;</span></p>
<p><br />
<span style="font-size: 10pt">/** *//**<br />
&nbsp;*&nbsp; * 用来读取QQwry.dat文件，以根据ip获得好友位置，QQwry.dat的格式是<br />
&nbsp;* 一. 文件头，共8字节<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 第一个起始IP的绝对偏移， 4字节<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; 2. 最后一个起始IP的绝对偏移， 4字节<br />
&nbsp;* 二. "结束地址/国家/区域"记录区<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; 四字节ip地址后跟的每一条记录分成两个部分<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; 1. 国家记录<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; 2. 地区记录<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; 但是地区记录是不一定有的。而且国家记录和地区记录都有两种形式<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; 1. 以0结束的字符串<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; 2. 4个字节，一个字节可能为0x1或0x2<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. 为0x1时，表示在绝对偏移后还跟着一个区域的记录，注意是绝对偏移之后，而不是这四个字节之后<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. 为0x2时，表示在绝对偏移后没有区域记录<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不管为0x1还是0x2，后三个字节都是实际国家名的文件内绝对偏移<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是地区记录，0x1和0x2的含义不明，但是如果出现这两个字节，也肯定是跟着3个字节偏移，如果不是<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 则为0结尾字符串<br />
&nbsp;* 三. "起始地址/结束地址偏移"记录区<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; 1. 每条记录7字节，按照起始地址从小到大排列<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. 起始IP地址，4字节<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. 结束ip地址的绝对偏移，3字节<br />
&nbsp;*<br />
&nbsp;* 注意，这个文件里的ip地址和所有的偏移量均采用little-endian格式，而java是采用<br />
&nbsp;* big-endian格式的，要注意转换<br />
&nbsp;* <br />
&nbsp;*<br />
&nbsp;* @author 马若劼<br />
&nbsp;*/<br />
public class IPSeeker {<br />
&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 用来封装ip相关信息，目前只有两个字段，ip所在的国家和地区<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @author swallow&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private class IPLocation {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String area;</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public IPLocation() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; country = area = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public IPLocation getCopy() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPLocation ret = new IPLocation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret.country = country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret.area = area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ret;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; private static final String IP_FILE = IPSeeker.class.getResource("/QQWry.DAT").toString().substring(5);</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; // 一些固定常量，比如记录长度等等<br />
&nbsp;&nbsp;&nbsp; private static final int IP_RECORD_LENGTH = 7;<br />
&nbsp;&nbsp;&nbsp; private static final byte AREA_FOLLOWED = 0x01;<br />
&nbsp;&nbsp;&nbsp; private static final byte NO_AREA = 0x2;</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; // 用来做为cache，查询一个ip时首先查看cache，以减少不必要的重复查找<br />
&nbsp;&nbsp;&nbsp; private Hashtable ipCache;<br />
&nbsp;&nbsp;&nbsp; // 随机文件访问类<br />
&nbsp;&nbsp;&nbsp; private RandomAccessFile ipFile;<br />
&nbsp;&nbsp;&nbsp; // 内存映射文件<br />
&nbsp;&nbsp;&nbsp; private MappedByteBuffer mbb;<br />
&nbsp;&nbsp;&nbsp; // 单一模式实例<br />
&nbsp;&nbsp;&nbsp; private static IPSeeker instance = new IPSeeker();<br />
&nbsp;&nbsp;&nbsp; // 起始地区的开始和结束的绝对偏移<br />
&nbsp;&nbsp;&nbsp; private long ipBegin, ipEnd;<br />
&nbsp;&nbsp;&nbsp; // 为提高效率而采用的临时变量<br />
&nbsp;&nbsp;&nbsp; private IPLocation loc;<br />
&nbsp;&nbsp;&nbsp; private byte[] buf;<br />
&nbsp;&nbsp;&nbsp; private byte[] b4;<br />
&nbsp;&nbsp;&nbsp; private byte[] b3;</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 私有构造函数<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private IPSeeker()&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipCache = new Hashtable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc = new IPLocation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buf = new byte[100];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b4 = new byte[4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b3 = new byte[3];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile = new RandomAccessFile(IP_FILE, "r");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileNotFoundException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(IPSeeker.class.getResource("/QQWry.DAT").toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(IP_FILE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("IP地址信息文件没有找到，IP显示功能将无法使用");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile = null;</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果打开文件成功，读取文件头信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ipFile != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipBegin = readLong4(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipEnd = readLong4(4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ipBegin == -1 || ipEnd == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile = null;<br />
&nbsp;&nbsp;&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; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("IP地址信息文件格式有错误，IP显示功能将无法使用");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 单一实例<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static IPSeeker getInstance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return instance;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 给定一个地点的不完全名字，得到一系列包含s子串的IP范围记录<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param s 地点子串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 包含IPEntry类型的List<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public List getIPEntriesDebug(String s) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List ret = new ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long endOffset = ipEnd + 4;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(long offset = ipBegin + 4; offset &lt;= endOffset; offset += IP_RECORD_LENGTH) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取结束IP偏移<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long temp = readLong3(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果temp不等于-1，读取IP的地点信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPLocation loc = getIPLocation(temp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断是否这个地点里面包含了s子串，如果包含了，添加这个记录到List中，如果没有，继续<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPEntry entry = new IPEntry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.country = loc.country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.area = loc.area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 得到起始IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readIP(offset - 4, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.beginIp = Utils.getIpStringFromBytes(b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 得到结束IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readIP(temp, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.endIp = Utils.getIpStringFromBytes(b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret.add(entry);<br />
&nbsp;&nbsp;&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; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ret;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 给定一个地点的不完全名字，得到一系列包含s子串的IP范围记录<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param s 地点子串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 包含IPEntry类型的List<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public List getIPEntries(String s) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List ret = new ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 映射IP信息文件到内存中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mbb == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileChannel fc = ipFile.getChannel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, ipFile.length());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.order(ByteOrder.LITTLE_ENDIAN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int endOffset = (int)ipEnd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int offset = (int)ipBegin + 4; offset &lt;= endOffset; offset += IP_RECORD_LENGTH) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp = readInt3(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPLocation loc = getIPLocation(temp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断是否这个地点里面包含了s子串，如果包含了，添加这个记录到List中，如果没有，继续<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPEntry entry = new IPEntry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.country = loc.country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.area = loc.area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 得到起始IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readIP(offset - 4, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.beginIp = Utils.getIpStringFromBytes(b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 得到结束IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readIP(temp, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.endIp = Utils.getIpStringFromBytes(b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret.add(entry);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ret;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从内存映射文件的offset位置开始的3个字节读取一个int<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private int readInt3(int offset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.position(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mbb.getInt() &amp; 0x00FFFFFF;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从内存映射文件的当前位置开始的3个字节读取一个int<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private int readInt3() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mbb.getInt() &amp; 0x00FFFFFF;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 根据IP得到国家名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip ip的字节数组形式<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 国家名字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getCountry(byte[] ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 检查ip地址文件是否正常<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ipFile == null) return "错误的IP数据库文件";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 保存ip，转换ip字节数组为字符串形式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ipStr = Utils.getIpStringFromBytes(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 先检查cache中是否已经包含有这个ip的结果，没有再搜索文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ipCache.containsKey(ipStr)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPLocation loc = (IPLocation)ipCache.get(ipStr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return loc.country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPLocation loc = getIPLocation(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipCache.put(ipStr, loc.getCopy());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return loc.country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 根据IP得到国家名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip IP的字符串形式<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 国家名字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getCountry(String ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getCountry(Utils.getIpByteArrayFromString(ip));<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 根据IP得到地区名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip ip的字节数组形式<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 地区名字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getArea(byte[] ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 检查ip地址文件是否正常<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ipFile == null) return "错误的IP数据库文件";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 保存ip，转换ip字节数组为字符串形式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ipStr = Utils.getIpStringFromBytes(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 先检查cache中是否已经包含有这个ip的结果，没有再搜索文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ipCache.containsKey(ipStr)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPLocation loc = (IPLocation)ipCache.get(ipStr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return loc.area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPLocation loc = getIPLocation(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipCache.put(ipStr, loc.getCopy());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return loc.area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 根据IP得到地区名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip IP的字符串形式<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 地区名字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String getArea(String ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getArea(Utils.getIpByteArrayFromString(ip));<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 根据ip搜索ip信息文件，得到IPLocation结构，所搜索的ip参数从类成员ip中得到<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip 要查询的IP<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return IPLocation结构<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private IPLocation getIPLocation(byte[] ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPLocation info = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long offset = locateIP(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(offset != -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info = getIPLocation(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(info == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info = new IPLocation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info.country = "未知国家";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info.area = "未知地区";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return info;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从offset位置读取4个字节为一个long，因为java为big-endian格式，所以没办法<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 用了这么一个函数来做转换<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 读取的long值，返回-1表示读取文件失败<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private long readLong4(long offset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long ret = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.seek(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= (ipFile.readByte() &amp; 0xFF);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= ((ipFile.readByte() &lt;&lt; 8) &amp; 0xFF00);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= ((ipFile.readByte() &lt;&lt; 16) &amp; 0xFF0000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= ((ipFile.readByte() &lt;&lt; 24) &amp; 0xFF000000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ret;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<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; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从offset位置读取3个字节为一个long，因为java为big-endian格式，所以没办法<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 用了这么一个函数来做转换<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 读取的long值，返回-1表示读取文件失败<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private long readLong3(long offset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long ret = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.seek(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.readFully(b3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= (b3[0] &amp; 0xFF);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= ((b3[1] &lt;&lt; 8) &amp; 0xFF00);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= ((b3[2] &lt;&lt; 16) &amp; 0xFF0000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ret;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<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; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从当前位置读取3个字节转换成long<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private long readLong3() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long ret = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.readFully(b3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= (b3[0] &amp; 0xFF);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= ((b3[1] &lt;&lt; 8) &amp; 0xFF00);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret |= ((b3[2] &lt;&lt; 16) &amp; 0xFF0000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ret;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<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; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从offset位置读取四个字节的ip地址放入ip数组中，读取后的ip为big-endian格式，但是<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 文件中是little-endian形式，将会进行转换<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void readIP(long offset, byte[] ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.seek(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.readFully(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte temp = ip[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip[0] = ip[3];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip[3] = temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = ip[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip[1] = ip[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip[2] = temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从offset位置读取四个字节的ip地址放入ip数组中，读取后的ip为big-endian格式，但是<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 文件中是little-endian形式，将会进行转换<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void readIP(int offset, byte[] ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.position(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.get(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte temp = ip[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip[0] = ip[3];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip[3] = temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = ip[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip[1] = ip[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip[2] = temp;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 把类成员ip和beginIp比较，注意这个beginIp是big-endian的<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip 要查询的IP<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param beginIp 和被查询IP相比较的IP<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 相等返回0，ip大于beginIp则返回1，小于返回-1。<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private int compareIP(byte[] ip, byte[] beginIp) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; 4; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int r = compareByte(ip[i], beginIp[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(r != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return r;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 把两个byte当作无符号数进行比较<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param b1<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param b2<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 若b1大于b2则返回1，相等返回0，小于返回-1<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private int compareByte(byte b1, byte b2) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((b1 &amp; 0xFF) &gt; (b2 &amp; 0xFF)) // 比较是否大于<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if((b1 ^ b2) == 0)// 判断是否相等<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 这个方法将根据ip的内容，定位到包含这个ip国家地区的记录处，返回一个绝对偏移<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 方法使用二分法查找。<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param ip 要查询的IP<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 如果找到了，返回结束IP的偏移，如果没有找到，返回-1<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private long locateIP(byte[] ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long m = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int r;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 比较第一个ip项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readIP(ipBegin, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r = compareIP(ip, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(r == 0) return ipBegin;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(r &lt; 0) return -1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 开始二分搜索<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(long i = ipBegin, j = ipEnd; i &lt; j; ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = getMiddleOffset(i, j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readIP(m, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r = compareIP(ip, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // log.debug(Utils.getIpStringFromBytes(b));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(r &gt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = m;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(r &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m == j) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j -= IP_RECORD_LENGTH;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = m;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return readLong3(m + 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果循环结束了，那么i和j必定是相等的，这个记录为最可能的记录，但是并非<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 肯定就是，还要检查一下，如果是，就返回结束地址区的绝对偏移<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = readLong3(m + 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readIP(m, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r = compareIP(ip, b4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(r &lt;= 0) return m;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else return -1;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 得到begin偏移和end偏移中间位置记录的偏移<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param begin<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param end<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private long getMiddleOffset(long begin, long end) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long records = (end - begin) / IP_RECORD_LENGTH;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; records &gt;&gt;= 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(records == 0) records = 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return begin + records * IP_RECORD_LENGTH;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 给定一个ip国家地区记录的偏移，返回一个IPLocation结构<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private IPLocation getIPLocation(long offset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 跳过4字节ip<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.seek(offset + 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取第一个字节判断是否标志字节<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte b = ipFile.readByte();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b == AREA_FOLLOWED) {<br />
&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; long countryOffset = readLong3();<br />
&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; ipFile.seek(countryOffset);<br />
&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; b = ipFile.readByte();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b == NO_AREA) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.country = readString(readLong3());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.seek(countryOffset + 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.country = readString(countryOffset);<br />
&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; loc.area = readArea(ipFile.getFilePointer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if(b == NO_AREA) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.country = readString(readLong3());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.area = readArea(offset + 8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.country = readString(ipFile.getFilePointer() - 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.area = readArea(ipFile.getFilePointer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return loc;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private IPLocation getIPLocation(int offset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 跳过4字节ip<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.position(offset + 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取第一个字节判断是否标志字节<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte b = mbb.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b == AREA_FOLLOWED) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取国家偏移<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int countryOffset = readInt3();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 跳转至偏移处<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.position(countryOffset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 再检查一次标志字节，因为这个时候这个地方仍然可能是个重定向<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = mbb.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b == NO_AREA) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.country = readString(readInt3());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.position(countryOffset + 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.country = readString(countryOffset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取地区标志<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.area = readArea(mbb.position());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if(b == NO_AREA) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.country = readString(readInt3());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.area = readArea(offset + 8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.country = readString(mbb.position() - 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc.area = readArea(mbb.position());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return loc;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从offset偏移开始解析后面的字节，读出一个地区名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 地区名字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private String readArea(long offset) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.seek(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte b = ipFile.readByte();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b == 0x01 || b == 0x02) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long areaOffset = readLong3(offset + 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(areaOffset == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "未知地区";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return readString(areaOffset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return readString(offset);<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private String readArea(int offset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.position(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte b = mbb.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b == 0x01 || b == 0x02) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int areaOffset = readInt3();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(areaOffset == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "未知地区";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return readString(areaOffset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return readString(offset);<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从offset偏移处读取一个以0结束的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 读取的字符串，出错返回空字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private String readString(long offset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipFile.seek(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i = 0, buf[i] = ipFile.readByte(); buf[i] != 0; buf[++i] = ipFile.readByte());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Utils.getString(buf, 0, i, "GBK");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /** *//**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 从内存映射文件的offset位置得到一个0结尾字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param offset<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private String readString(int offset) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mbb.position(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i = 0, buf[i] = mbb.get(); buf[i] != 0; buf[++i] = mbb.get());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Utils.getString(buf, 0, i, "GBK");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IllegalArgumentException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; public String getAddress(String ip){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String country = getCountry(ip).equals(" CZ88.NET")?"":getCountry(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String area = getArea(ip).equals(" CZ88.NET")?"":getArea(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String address = country+" "+area;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return address.trim();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;List list=IPSeeker.getInstance().getIPEntriesDebug("浙江省杭州市");<br />
&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; }<br />
} </span></p>
<p><span style="font-size: 10pt">&nbsp;</span></p>
<img src ="http://www.blogjava.net/lcs868/aggbug/246644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">李春生</a> 2008-12-16 15:56 <a href="http://www.blogjava.net/lcs868/archive/2008/12/16/246644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>