??xml version="1.0" encoding="utf-8" standalone="yes"?>
select * from 表名 where to_days(旉字段? = to_days(now());
昨天
SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 旉字段? <= 1
7?br />
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(旉字段?
q?0?br />
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(旉字段?
本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 旉字段? '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )
上一?br />
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 旉字段? '%Y%m' ) ) =1
]]>
%M 月名?January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前~的月份的日期(1st, 2nd, 3rd, {等。)
%Y q? 数字, 4 ?nbsp;
%y q? 数字, 2 ?nbsp;
%a ~写的星期名?Sun……Sat)
%d 月䆾中的天数, 数字(00……31)
%e 月䆾中的天数, 数字(0……31)
%m ? 数字(01……12)
%c ? 数字(1……12)
%b ~写的月份名?Jan……Dec)
%j 一q中的天?001……366)
%H 时(00……23)
%k 时(0……23)
%h 时(01……12)
%I 时(01……12)
%l 时(1……12)
%i 分钟, 数字(00……59)
%r 旉,12 时(hh:mm:ss [AP]M)
%T 旉,24 时(hh:mm:ss)
%S U?00……59)
%s U?00……59)
%p AM或PM
%w 一个星期中的天?0=Sunday ……6=Saturday Q?nbsp;
%U 星期(0……52), q里星期天是星期的第一?nbsp;
%u 星期(0……52), q里星期一是星期的W一?nbsp;
%% 一个文?#8220;%”?nbsp;
所有的其他字符不做解释被复制到l果中?nbsp;
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
, '%Y %m'
]]>
FusionCharts ?XML标签属性有一下四U数据类?br />
* Boolean - 布尔cdQ只能ؓ(f)1或?。例如:(x)<graph showNames=’1′ >
* Number - 数字cdQ只能ؓ(f)数字。例如:(x)<graph yAxisMaxValue=’200′ >
* String - 字符串类型,只能为字W串。例如:(x) <graph caption=’My Chart’ >
* Hex Color Code - 十六q制颜色代码Q前Ҏ(gu)?#8217;#’.例如Q?<graph bgColor=’FFFFDD’ >
XML中的标签和属性有Q?br />
<graph> 所h的属?br />
flash背景参数Q?br />
* bgColor=”HexColorCode” : 讄flash的背景颜?br />
* bgAlpha=”NumericalValue(0-100)” : 讄背景的透明?br />
* bgSWF=”Path of SWF File” : 讄一个外部的Flash 为flash的背?br />
图表背景参数Q?br />
* canvasBgColor=”HexColorCode” : 讄图表背景的颜?br />
* canvasBaseColor=”HexColorCode” : 讄图表基部的颜?br />
* canvasBaseDepth=”Numerical Value” : 讄图表基部的高?br />
* canvasBgDepth=”Numerical Value” : 讄图表背景的深?br />
* showCanvasBg=”1/0″ : 讄是否昄图表背景
* showCanvasBase=”1/0″ : 讄是否昄图表基部
图表和u的标?br />
* caption=”String” : 图表上方的标?br />
* subCaption=”String” : 图表上方的副标题
* xAxisName= “String” : X轴的名字
* yAxisName= “String” : y轴的名字
图表数量值的限制
* yAxisMinValue=”value”: y轴最?br />
* yAxisMaxValue=”value”: y舟最大?br />
通用参数
* shownames=”1/0″ : 讄是否在x轴下昄<set>里指定的name
* showValues=”1/0″ : 讄是否在柱型图或饼型图上显C数据的?br />
* showLimits=”1/0″ : 讄是否在图表的y轴坐标上昄最大最的数据?br />
* rotateNames=”1/0″ : 讄x轴下的name 是水qxC是垂直显C?br />
* animation=”1/0″ : 讄柱型囄昄是否是动LC?br />
字体属?br />
* baseFont=”FontName” : 讄字体样式
* baseFontSize=”FontSize” : 讄字体大小
* baseFontColor=”HexColorCode” : 讄字体颜色
* outCnvBaseFont = “FontName” : 讄图表外侧的字体样?br />
* outCnvBaseFontSze=”FontSize” : 讄图表外侧的字体大?br />
* outCnvBaseFontColor=”HexColorCode”: 讄图表外侧的字体颜?br />
数字格式选项
* numberPrefix=”$” : 讄数据值的前缀
* numberSuffix=”p.a” : 讄数据值的后缀Q如果是Ҏ(gu)字符Q需要用URL Encode重编码)
* formatNumber=”1/0″ : 讄是否格式化数?br />
* formatNumberScale=”1/0″ : 讄是否?#8220;K”来代表千Q?#8220;M”来代表百?br />
* decimalSeparator=”.” : 用指定的字符来代替小数点
* thousandSeparator=”,” : 用指定的字符来代替千位分隔符
* decimalPrecision=”2″ : 讄十进制的_ֺ
* divLineDecimalPrecision=”2″: 讄y轴数值的数位数
* limitsDecimalPrecision=”2″ : 讄y轴的最大最值的数位数
水^分隔U?br />
* numdivlines=”NumericalValue” : 讄水^分隔U的数量
* divlinecolor=”HexColorCode” : 讄水^分隔U的颜色
* divLineThickness=”NumericalValue” : 讄水^分隔U的宽度
* divLineAlpha=”NumericalValue0-100″ : 讄水^分隔U的透明?br />
* showDivLineValue=”1/0″ : 讄是否昄水^分隔U的数?br />
鼠标旋停参数
* showhovercap=”1/0″ : 昄是否Ȁz鼠标旋停效?br />
* hoverCapBgColor=”HexColorCode” : 讄鼠标旋停效果的背景颜?br />
* hoverCapBorderColor=”HexColorCode” : 讄鼠标旋停效果的边框颜?br />
* hoverCapSepChar=”Char” : 讄鼠标旋停后显C的文本中的分隔W号
图表边距的设|?br />
* chartLeftMargin=”Numerical Value (in pixels)” : 讄图表左边?br />
* chartRightMargin=”Numerical Value (in pixels)” : 讄图表双?br />
* chartTopMargin=”Numerical Value (in pixels)” : 讄图表上边?br />
* chartBottomMargin=”Numerical Value (in pixels)” : 讄图表下边?br />
Zero Plane
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’t see a visible zero plane.
* zeroPlaneShowBorder=”1/0″ : Whether the border of a 3D zero plane would be plotted or not.
* zeroPlaneBorderColor=”Hex Code” : If the border is to be plotted, this attribute sets the border color for the plane.
* zeroPlaneColor=”Hex Code” : The intended color for the zero plane.
* zeroPlaneAlpha=”Numerical Value 0-100″ : The intended transparency for the zero plane.
<set> 所h的属?br />
* name=”string” : 讄在图表中体现出来的名?br />
Example: <set name=’Jan’ …>
* value=”NumericalValue” : 讄在图表中各个名字惛_应的?br />
Example: <set name=’Jan’ value=’12345′ …>
* color=”HexCode” : 讄在图表中相对应的p囄颜色
Example: <set name=’Jan’ value=’12345′ color=’636363′ …>
* hoverText=”String value” : 讄鼠标旋停在相对应的柱行图 上出现的文本内容
Example: <set name=’Jan’ value=’12345′ color=’636363′ hoverText=’January’…>
* link=”URL” : 讄该柱行图的链接地址Q需要URL Encode重编码)
Example: <set … link=’ShowDetails.asp%3FMonth=Jan’ …>
* alpha=”Numerical Value 0-100″ : 讄在图表中相对应的p囄透明?br />
Example: <set … alpha=’100′ …>
* showName=”1″ : 讄在是否显C图表中相对应的p囄name
Example : <set … showName=”1″ …>
功能Ҏ(gu)?br />
animation 是否动画昄数据Q默认ؓ(f)1(True)
showNames 是否昄横向坐标?x?标签名称
rotateNames 是否旋{昄标签Q默认ؓ(f)0(False):横向昄
showValues 是否在图表显C对应的数据|默认?(True)
yAxisMinValue 指定Uu(y?最|数字
yAxisMaxValue 指定Uu(y?最|数字
showLimits 是否昄图表限?y轴最大、最?Q默认ؓ(f)1(True)
图表标题和u名称
caption 图表L?br />
subCaption 图表副标?br />
xAxisName 横向坐标?x?名称
yAxisName U向坐标?y?名称
图表和画布的样式
bgColor 图表背景Ԍ6?6q制颜色?br />
canvasBgColor d背景Ԍ6?6q制颜色?br />
canvasBgAlpha d透明度,[0-100]
canvasBorderColor dҎ(gu)颜色Q??6q制颜色?br />
canvasBorderThickness dҎ(gu)厚度Q[0-100]
shadowAlpha 投媄透明度,[0-100]
showLegend 是否昄pd名,默认?(True)
字体属?br />
baseFont 图表字体样式
baseFontSize 图表字体大小
baseFontColor 图表字体颜色Q??6q制颜色?br />
outCnvBaseFont 图表d以外的字体样?br />
outCnvBaseFontSize 图表d以外的字体大?br />
outCnvBaseFontColor 图表d以外的字体颜Ԍ6?6q制颜色?/p>
分区U和|格
numDivLines d内部水^分区U条敎ͼ数字
divLineColor 水^分区UKԌ6?6q制颜色?br />
divLineThickness 水^分区U厚度,[1-5]
divLineAlpha 水^分区UK明度,[0-100]
showAlternateHGridColor 是否在横向网格带交替的颜Ԍ默认?(False)
alternateHGridColor 横向|格带交替的颜色Q??6q制颜色?br />
alternateHGridAlpha 横向|格带的透明度,[0-100]
showDivLineValues 是否昄Div行的|默认Q?
numVDivLines d内部垂直分区U条敎ͼ数字
vDivLineColor 垂直分区UKԌ6?6q制颜色?br />
vDivLineThickness 垂直分区U厚度,[1-5]
vDivLineAlpha 垂直分区UK明度,[0-100]
showAlternateVGridColor 是否在纵向网格带交替的颜Ԍ默认?(False)
alternateVGridColor U向|格带交替的颜色Q??6q制颜色?br />
alternateVGridAlpha U向|格带的透明度,[0-100]
数字格式
numberPrefix 增加数字前缀
numberSuffix 增加数字后缀 % ?'%25'
formatNumberScale 是否格式化数?默认?(True),自动的给你的数字加上KQ千Q或MQ百万)Q若?,则不加K或M
decimalPrecision 指定数位的位数Q[0-10] 例如Q?'0' 取整
divLineDecimalPrecision 指定水^分区U的值小C的位敎ͼ[0-10]
limitsDecimalPrecision 指定y轴最大、最值的数位的位数Q[0-10]
formatNumber 逗号来分隔数?千位Q百万位),默认?(True)Q若?,则不加分隔符
decimalSeparator 指定数分隔W?默认?.'
thousandSeparator 指定千分位分隔符,默认?,'
Tool-tip/Hover标题
showhovercap 是否昄(zhn)停说明框,默认?(True)
hoverCapBgColor (zhn)停说明框背景色Q??6q制颜色?br />
hoverCapBorderColor (zhn)停说明框边框颜Ԍ6?6q制颜色?br />
hoverCapSepChar 指定(zhn)停说明框内gg间分隔符,默认?,'
折线囄参数
lineThickness 折线的厚?br />
anchorRadius 折线节点半径Q数?br />
anchorBgAlpha 折线节点透明度,[0-100]
anchorBgColor 折线节点填充颜色Q??6q制颜色?br />
anchorBorderColor 折线节点Ҏ(gu)颜色Q??6q制颜色?/p>
Set标签使用的参?br />
value 数据?br />
color 颜色
link 链接Q本H口打开[Url]Q新H口打开[n-Url]Q调用JS函数[JavaScript:函数]Q?br />
name 横向坐标轴标{U?/p>
mysqladmin start
/ect/init.d/mysql start (前面为mysql的安装\?
2.linux下重启mysql的命令:(x)
mysqladmin restart
/ect/init.d/mysql restart (前面为mysql的安装\?
3.linux下关闭mysql的命令:(x)
mysqladmin shutdown
/ect/init.d/mysql shutdown (前面为mysql的安装\?
4.q接本机上的mysqlQ?/p>
q入目录mysql\binQ再键入命omysql -uroot -pQ?回R后提C入密码?/p>
退出mysql命oQexitQ回车)
5.修改mysql密码Q?/p>
mysqladmin -u用户?-p旧密?password 新密?/p>
或进入mysql命o行SET PASSWORD FOR root=PASSWORD("root");
6.增加新用戗(注意Qmysql环境中的命o后面都带一个分号作为命令结束符Q?/p>
grant select on 数据?* to 用户名@dL identified by "密码"
如增加一个用户test密码?23Q让他可以在ML上登录,q对所有数据库有查询、插入、修攏V删除的权限。首先用以root用户q入mysqlQ然后键入以下命令:(x)
grant select,insert,update,delete on *.* to " Identified by "123";
二、有关MySQL数据库方面的操作
必须首先d到mysql中,有关操作都是在mysql的提C符下进行,而且每个命o以分L(fng)?/p>
1、显C数据库列表?/p>
show databases;
2、显C库中的数据表:(x)
use mysqlQ?Q/打开?/p>
show tables;
3、显C数据表的结构:(x)
describe 表名;
4、徏库:(x)
create database 库名;
5、徏表:(x)
use 库名Q?/p>
create table 表名(字段讑֮列表)Q?/p>
6、删库和删表:
drop database 库名;
drop table 表名Q?/p>
7、将表中记录清空Q?/p>
delete from 表名;
8、显C中的记录Q?/p>
select * from 表名;
9、编码的修改
如果要改变整个mysql的编码格式:(x)
启动mysql的时候,mysqld_safe命o行加?/p>
--default-character-set=gbk
如果要改变某个库的编码格式:(x)在mysql提示W后输入命o
alter database db_name default character set gbk;
三、数据的导入导出
1、文本数据{到数据库?/p>
文本数据应符合的格式Q字D|据之间用tab键隔开Qnull值用来代ѝ例Q?/p>
1 name duty 2006-11-23
数据传入命o load data local infile "文g? into table 表名;
2、导出数据库和表
mysqldump --opt news > news.sqlQ将数据库news中的所有表备䆾到news.sql文gQnews.sql是一个文本文Ӟ文g名Q取。)
mysqldump --opt news author article > author.article.sqlQ将数据库news中的author表和article表备份到author.article.sql文gQ?author.article.sql是一个文本文Ӟ文g名Q取。)
mysqldump --databases db1 db2 > news.sqlQ将数据库dbl和db2备䆾到news.sql文gQnews.sql是一个文本文Ӟ文g名Q取。)
mysqldump -h host -u user -p pass --databases dbname > file.dump
是把host上的以名字userQ口令pass的数据库dbname导入到文件file.dump?/p>
mysqldump --all-databases > all-databases.sqlQ将所有数据库备䆾到all-databases.sql文gQall-databases.sql是一个文本文Ӟ文g名Q取。)
3、导入数?/p>
mysql < all-databases.sqlQ导入数据库Q?/p>
mysql>source news.sql;Q在mysql命o下执行,可导入表Q?/p>
一、连接MySQL
格式Q?mysql -hL地址 -u用户?Qp用户密码
1、例1Q连接到本机上的MYSQL?/p>
首先在打开DOSH口Q然后进入目?mysqlbinQ再键入命omysql -uroot -pQ回车后提示你输密码Q如果刚安装好MYSQLQ超U用户root是没有密码的Q故直接回R卛_q入到MYSQL中了QMYSQL的提C符是:(x) mysql>?/p>
2、例2Q连接到q程L上的MYSQL。假设远E主机的IP为:(x)110.110.110.110Q用户名为root,密码为abcd123。则键入以下命oQ?/p>
mysql -h110.110.110.110 -uroot -pabcd123
Q注:u与root可以不用加空|其它也一P
3、退出MYSQL命oQ?exit Q回车)?/p>
二、修改密?/p>
格式Qmysqladmin -u用户?-p旧密?password 新密?/p>
1、例1Q给root加个密码ab12。首先在DOS下进入目录mysqlbinQ然后键入以下命令:(x)
mysqladmin -uroot -password ab12
注:(x)因ؓ(f)开始时root没有密码Q所?p旧密码一就可以省略了?/p>
2、例2Q再root的密码改为djg345?/p>
mysqladmin -uroot -pab12 password djg345
三、增加新用户。(注意Q和上面不同Q下面的因ؓ(f)是MySQL环境中的命oQ所以后面都带一个分号作为命令结束符Q?/p>
格式Qgrant select on 数据?* to 用户名@dL identified by \"密码\"
?、增加一个用户test1密码为abcQ让他可以在ML上登录,q对所有数据库有查询、插入、修攏V删除的权限。首先用以root用户q入MySQLQ然后键入以下命令:(x)
grant select,insert,update,
delete on *.* to test1@\"%\" Identified by \"abc\";
但例1增加的用h十分危险的,你想如某个h知道test1的密码,那么他就可以在internet上的M一台电(sh)脑上d你的MySQL数据库ƈ对你的数据可以ؓ(f)所Ʋؓ(f)了,解决办法见例2?/p>
?、增加一个用户test2密码为abc,让他只可以在localhost上登录,q可以对数据库mydbq行查询、插入、修攏V删除的操作Qlocalhost指本C机,即MySQL数据库所在的那台LQ,q样用户即用知道test2的密码,他也无法从internet上直接访问数据库Q只能通过MySQLL上的web|讉K?/p>
grant select,insert,update,
delete on mydb.* to test2@localhost identified by \"abc\";
如果你不想test2有密码,可以再打一个命令将密码消掉?/p>
grant select,insert,update,delete on mydb
.* to test2@localhost identified by \"\";
在上面讲了登录、增加用戗密码更改等问题。下面我们来看看MySQL中有x据库斚w的操作。注意:(x)你必首先登录到MySQL中,以下操作都是在MySQL的提C符下进行的Q而且每个命o以分L(fng)束?/p>
一、操作技?/p>
1、如果你打命令时Q回车后发现忘记加分P你无重打一遍命令,只要打个分号回R可以了。也是说你可以把一个完整的命o分成几行来打Q完后用分号作结束标志就完成?/p>
2、你可以使用光标上下键调Z前的命o。但以前我用q的一个MySQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win?/p>
二、显C命?/p>
1、显C数据库列表Q?/p>
show databases;
刚开始时才两个数据库Qmysql和test。MySQL库很重要它里面有MYSQL的系l信息,我们改密码和新增用户Q实际上是用这个库q行操作?/p>
2、显C库中的数据表:(x)
use mysqlQ?Q/打开库,学过FOXBASE的一定不?x)陌生?/p>
show tables;
3、显C数据表的结构:(x)
describe 表名;
4、徏库:(x)
create database 库名;
5、徏表:(x)
use 库名Q?/p>
create table 表名 (字段讑֮列表)Q?/p>
6、删库和删表:
drop database 库名;
drop table 表名Q?/p>
7、将表中记录清空Q?/p>
delete from 表名;
8、显C中的记录Q?/p>
select * from 表名;
三、一个徏库和以及插入数据的实?/p>
drop database if exists school; //如果存在SCHOOL则删?/p>
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default ’深圳’,
year date
); //l束
//以下为插入字D?/p>
insert into teacher values(’’,’glchengang’,’深圳一?#8217;,’1976-10-10’);
insert into teacher values(’’,’jack’,’深圳一?#8217;,’1975-12-23’);
注:(x)在徏表中Q?Q将ID设ؓ(f)长度?的数字字D?int(3)q让它每个记录自动加一:auto_incrementq不能ؓ(f)I?not null而且让他成ؓ(f)dDprimary keyQ?Q将NAME设ؓ(f)长度?0的字W字D(3Q将ADDRESS设ؓ(f)长度50的字W字D,而且~省gؓ(f)深圳。varchar和char有什么区别呢Q只有等以后的文章再说了。(4Q将YEAR设ؓ(f)日期字段?/p>
如果你在MySQL提示W键入上面的命o也可以,但不方便调试。你可以以上命令原样写入一个文本文件中假设为school.sqlQ然后复制到c:\\下,q在DOS状态进入目录\\mysql\\binQ然后键入以下命令:(x)
mysql -uroot -p密码 < c:\\school.sql
如果成功Q空Z行无M昄Q如有错误,?x)有提示。(以上命o已经调试Q你只要?/的注释去掉即可用)?/p>
四、将文本数据转到数据库中
1、文本数据应W合的格式:(x)字段数据之间用tab键隔开Qnull值用\\n来代ѝ?/p>
例:(x)
3 rose 深圳二中 1976-10-10
4 mike 深圳一?1975-12-23
2、数据传入命?load data local infile \"文g名\" into table 表名?/p>
注意Q你最好将文g复制到\\mysql\\bin目录下,q且要先用use命o打表所在的库?/p>
五、备份数据库Q?/p>
1、mysqldump --opt school>school.bbb
mysqldump --opt school>school.bbb
Q命令在DOS的\\mysql\\bin目录下执行)
注释:数据库school备䆾到school.bbb文gQschool.bbb是一个文本文Ӟ文g名Q取,打开看看你会(x)有新发现?/p>
后记Q其实MySQL的对数据库的操作与其它的SQLcL据库大同异Q?zhn)最好找本将SQL的书看看。我在这里只介绍一些基本的Q其实我也就只懂q些了,呵呵。最好的MYSQL教程q是“晏子“译的“MYSQL中文参考手?#8220;不仅免费每个相关|站都有下蝲Q而且它是最权威的。可惜不是象\"PHP4中文手册\"那样是chm的格式,在查扑և数命令的时候不太方ѝ?/p>
2、修改登录密?/p>
1) mysqladmin -u用户?-p旧密?password 新密?
例:(x)mysqladmin -u root password 21century
注:(x)因ؓ(f)开始时root没有密码Q所?p旧密码一就可以省略了?/p>
2)直接修改user表的root用户口oQ?/p>
mysql> user mysql;
mysql> update user set pasword=password('21century') where user='root';
mysql> flush privileges;
注:(x)flush privileges的意思是强制h内存授权表,否则用的q是~冲中的口o?/p>
3、测试密码是否修Ҏ(gu)?
1Q不用密码登?
[root@test1 local]# mysql
ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)
昄错误Q说明密码已l修攏V?/p>
2Q用修改后的密码d:
[root@test1 local]# mysql -u root -p
Enter password: (输入修改后的密码21century)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 177 to server version: 3.23.48
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
成功Q?/p>
q是通过mysqladmin命o修改口oQ也可通过修改库来更改口o?/p>
4、启动和停止:
启动QMysql?.23.15版本开始作了改动,默认安装后服务要用MySQL用户来启动,不允许root用户启动?/p>
如果非要用root用户来启动,必须加上--user=root参数(./safe_mysqld --user=root &)停止Qmysqladmin -u root -p shutdown?/p>
5、导出meeting数据库:(x)
mysqldump -uroot -p21century meeting > db_meeting.sql
ghdbname数据?
mysqldump -uroot -p21century dbname < xxx.sql
导入数据库还可用cM于oracle中@my_script.sql的方式一ơ执行大量sql语句Q这在用mysqldump不v作用旉常有用?/p>
例:(x)#./mysql -uroot -p < /home/xuys/db_meeting_2003.sql
(注:(x)create database、use databasename、create table和insert into语句都可写在上面的脚步文件中)
6、给表改?
RENAME TABLE ztemp TO zteMP4;
7、修改字D属性:(x)
ALTER TABLE bbabase CHANGE news_id id VARCHAR(5) NOT NULL;
8、在表中的content后增加一字段Q?/p>
ALTER TABLE bbabase ADD leave_time DATETIME NOT NULL AFTER
2.在linux中切换到 /var/ftp/pub目录下,修改jdk1.6的用权限:(x)#chmod u+x jdk-6u10-linux-i586-rpm.bin
3.解压q安装:(x)#./ jdk-6u10-linux-i586-rpm.bin (默认安装?usr/java?
4.环境变量配置Q?/p>
#vi /etc/profile
在该profile文g中添加:(x)
JAVA_HOME=/usr/java/jdk1.6.0_10
JRE_HOME=/usr/java/jdk1.6.0_10/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
d完毕保存退?/p>
#source /etc/profile
#java -version
昄 java version "1.6.0_10" (jdk1.6安装成功)
卸蝲rpm版的jdkQ?/p>
#rpm -qa|grep jdk
昄Qjdk-1.6.0_10-fcs
卸蝲Q?rpm -e --nodeps jdk-1.6.0_10-fcs
应用E序client
database proxy
database集群
在本ơ实战中Q应用程序clientZc3p0q接后端的database proxy。database proxy负责理client实际讉Kdatabase的\q略,采用开源框架amoeba。database集群采用mysql的master-slave的replicationҎ(gu)。整个环境的l构囑֦下所C:(x)
实战步骤与详?/p>
一.搭徏mysql的master-slave环境
1Q分别在host1Q?0.20.147.110Q和host2Q?0.20.147.111Q上安装mysqlQ?.0.45Q,具体安装Ҏ(gu)可见官方文
2Q配|master
首先~辑/etc/my.cnfQ添加以下配|:(x)
log-bin=mysql-bin #slave?x)基于此log-bin来做replication
server-id=1 #master的标C?br />
binlog-do-db = amoeba_study #用于master-slave的具体数据库
然后d专门用于replication的用P(x)
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.20.147.111 IDENTIFIED BY '111111';
重启mysqlQ得配|生效:(x)
/etc/init.d/mysqld restart
最后查看master状态:(x)
3Q配|slave
首先~辑/etc/my.cnfQ添加以下配|:(x)
server-id=2 #slave的标C?/p>
配置生效后,配置与master的连接:(x)
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.20.147.110',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='111111',
-> MASTER_LOG_FILE='mysql-bin.000003',
-> MASTER_LOG_POS=161261;
其中MASTER_HOST是master机的ipQMASTER_USER和MASTER_PASSWORD是我们刚才在master上添加的用户QMASTER_LOG_FILE和MASTER_LOG_POS对应与master status里的信息
最后启动slaveQ?/p>
mysql> start slave;
4Q验证master-slave搭徏生效
通过查看slave机的logQ?var/log/mysqld.logQ:(x)
100703 10:51:42 [Note] Slave I/O thread: connected to master 'repl@10.20.147.110:3306', replication started in log 'mysql-bin.000003' at position 161261
如看C上信息则证明搭徏成功Q如果有问题也可通过此log扑֎?/p>
?搭徏database proxy
此次实战中database proxy采用amoeba Q它的相关信息可以查阅官Ҏ(gu),不在此详q?/p>
1Q安装amoeba
下蝲amoebaQ?.2.0-GAQ后解压到本圎ͼD:\openSource\amoeba-mysql-1.2.0-GAQ,卛_成安?/p>
2Q配|a(chn)moeba
先配|proxyq接和与各后端mysql服务器连接信息(D:\openSource\amoeba-mysql-1.2.0-GA\conf\amoeba.xmlQ:(x)
<server>
<!-- proxy serverl定的端?-->
<property name="port">8066</property>
<!-- proxy serverl定的IP -->
<!--
<property name="ipAddress">127.0.0.1</property>
-->
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">20</property>
<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">30</property>
<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">30</property>
<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property>
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
<property name="tcpNoDelay">true</property>
<!-- 对外验证的用户名 -->
<property name="user">root</property>
<!-- 对外验证的密?-->
<property name="password">root</property>
</server>
<server>
<!-- proxy serverl定的端?-->
<property name="port">8066</property>
<!-- proxy serverl定的IP -->
<!--
<property name="ipAddress">127.0.0.1</property>
-->
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">20</property>
<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">30</property>
<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">30</property>
<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property>
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
<property name="tcpNoDelay">true</property>
<!-- 对外验证的用户名 -->
<property name="user">root</property>
<!-- 对外验证的密?-->
<property name="password">root</property>
</server>
以上是proxy提供lclient的连接配|?/p>
<dbServerList>
<dbServer name="server1">
<!-- PoolableObjectFactory实现c?-->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端?-->
<property name="port">3306</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">10.20.147.110</property>
<property name="schema">amoeba_study</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">root</property>
<!-- 用于登陆mysql的密?-->
<property name="password"></property>
</factoryConfig>
<!-- ObjectPool实现c?-->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="server2">
<!-- PoolableObjectFactory实现c?-->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端?-->
<property name="port">3306</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">10.20.147.111</property>
<property name="schema">amoeba_study</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">root</property>
<!-- 用于登陆mysql的密?-->
<property name="password"></property>
</factoryConfig>
<!-- ObjectPool实现c?-->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
</dbServerList>
<dbServerList>
<dbServer name="server1">
<!-- PoolableObjectFactory实现c?-->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端?-->
<property name="port">3306</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">10.20.147.110</property>
<property name="schema">amoeba_study</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">root</property>
<!-- 用于登陆mysql的密?-->
<property name="password"></property>
</factoryConfig>
<!-- ObjectPool实现c?-->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="server2">
<!-- PoolableObjectFactory实现c?-->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端?-->
<property name="port">3306</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">10.20.147.111</property>
<property name="schema">amoeba_study</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">root</property>
<!-- 用于登陆mysql的密?-->
<property name="password"></property>
</factoryConfig>
<!-- ObjectPool实现c?-->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
</dbServerList>
以上是proxy与后端各mysql数据库服务器配置信息Q具体配|见注释很明白了
最后配|读写分ȝ略:(x)
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>
<property name="writePool">server1</property>
<property name="readPool">server2</property>
<property name="needParse">true</property>
</queryRouter>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>
<property name="writePool">server1</property>
<property name="readPool">server2</property>
<property name="needParse">true</property>
</queryRouter>
从以上配|不然发玎ͼ写操作\由到server1QmasterQ,L作\由到server2QslaveQ?/p>
3Q启动amoeba
在命令行里运行D:\openSource\amoeba-mysql-1.2.0-GA\amoeba.bat卛_Q?/p>
log4j:WARN log4j config load completed from file:D:\openSource\amoeba-mysql-1.2.0-GA\conf\log4j.xml
log4j:WARN ip access config load completed from file:D:\openSource\amoeba-mysql-1.2.0-GA/conf/access_list.conf
2010-07-03 09:55:33,821 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.
?client端调用与试
1Q编写client调用E序
具体E序l节׃详述了,只是一个最普通的Zmysql driver的jdbc的数据库操作E序
2Q配|数据库q接
本clientZc3p0Q具体数据源配置如下Q?/p>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" />
<property name="user" value="root" />
<property name="password" value="root" />
<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="1" />
<property name="maxIdleTime" value="1800" />
<property name="acquireIncrement" value="1" />
<property name="maxStatements" value="0" />
<property name="initialPoolSize" value="1" />
<property name="idleConnectionTestPeriod" value="1800" />
<property name="acquireRetryAttempts" value="6" />
<property name="acquireRetryDelay" value="1000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="testConnectionOnCheckout" value="true" />
<property name="testConnectionOnCheckin" value="false" />
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" />
<property name="user" value="root" />
<property name="password" value="root" />
<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="1" />
<property name="maxIdleTime" value="1800" />
<property name="acquireIncrement" value="1" />
<property name="maxStatements" value="0" />
<property name="initialPoolSize" value="1" />
<property name="idleConnectionTestPeriod" value="1800" />
<property name="acquireRetryAttempts" value="6" />
<property name="acquireRetryDelay" value="1000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="testConnectionOnCheckout" value="true" />
<property name="testConnectionOnCheckin" value="false" />
</bean>
值得注意是,client端只需q到proxyQ与实际的数据库没有M关系Q因此jdbcUrl、user、password配置都对应于amoeba暴露出来的配|信?/p>
3Q调用与试
首先插入一条数据:(x)insert into zone_by_id(id,name) values(20003,'name_20003')
通过查看masterZ的日?var/lib/mysql/mysql_log.logQ?/p>
100703 11:58:42 1 Query set names latin1
1 Query SET NAMES latin1
1 Query SET character_set_results = NULL
1 Query SHOW VARIABLES
1 Query SHOW COLLATION
1 Query SET autocommit=1
1 Query SET sql_mode='STRICT_TRANS_TABLES'
1 Query SHOW VARIABLES LIKE 'tx_isolation'
1 Query SHOW FULL TABLES FROM `amoeba_study` LIKE 'PROBABLYNOT'
1 Prepare [1] insert into zone_by_id(id,name) values(?,?)
1 Prepare [2] insert into zone_by_id(id,name) values(?,?)
1 Execute [2] insert into zone_by_id(id,name) values(20003,'name_20003')
得知写操作发生在masterZ
通过查看slaveZ的日?var/lib/mysql/mysql_log.logQ?/p>
100703 11:58:42 2 Query insert into zone_by_id(id,name) values(20003,'name_20003')
得知slave同步执行了这条语?/p>
然后查一条数据:(x)select t.name from zone_by_id t where t.id = 20003
通过查看slaveZ的日?var/lib/mysql/mysql_log.logQ?/p>
100703 12:02:00 33 Query set names latin1
33 Prepare [1] select t.name from zone_by_id t where t.id = ?
33 Prepare [2] select t.name from zone_by_id t where t.id = ?
33 Execute [2] select t.name from zone_by_id t where t.id = 20003
得知L作发生在slaveZ
q且通过查看slaveZ的日?var/lib/mysql/mysql_log.log发现q条语句没在master上执?/p>
通过以上验证得知单的master-slave搭徏和实战得以生?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/cutesource/archive/2010/07/03/5710645.aspx
public class ImageTool{
private static Random random = new Random();
public ImageTool() {
}
public static Color getRandColor(int fc,int bc){//l定范围获得随机颜色
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
public static void outputImage(HttpSession session, HttpServletResponse response) throws IOException{
BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, 60, 20);
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.setColor(getRandColor(160, 200));
for (int i=0;i<155;i++) {
int x = random.nextInt(60);
int y = random.nextInt(20);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
StringBuffer randCode = new StringBuffer();
for (int i=0;i<4;i++){
String temp = String.valueOf(random.nextInt(10));
randCode.append(temp);
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(temp,13*i+6,16);
}
session.setAttribute("randCode", randCode.toString());
g.dispose();
OutputStream out=response.getOutputStream();
response.reset();
ImageIO.write(image, "jpg", out);
out.close();
}
public static void imagePut(HttpSession session,OutputStream out,int pWidth,int pHeight,int pSize) throws IOException{
BufferedImage image = new BufferedImage(pWidth, pHeight, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, pWidth, pHeight);
g.setFont(new Font("Times New Roman",Font.PLAIN,pSize));
g.setColor(getRandColor(160, 200));
for (int i=0;i<18;i++) {
int x = random.nextInt(60);
int y = random.nextInt(20);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
StringBuffer randCode = new StringBuffer();
for (int i=0;i<4;i++){
String temp = String.valueOf(random.nextInt(10));
randCode.append(temp);
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(temp,13*i+6,16);
}
g.dispose();
ImageIO.write(image, "jpg", out);
session.setAttribute("randCode", randCode.toString());
// System.out.println("sessionIDQ?+session.toString()+"Q?产生的验证码Q?+session.getAttribute("randCode"));
}
public static void imagePutOneColor(HttpSession session,OutputStream out,int pWidth,int pHeight,int pSize) throws IOException{
BufferedImage image = new BufferedImage(pWidth, pHeight, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(new Color(255,255,255));
g.fillRect(0, 0, 60, 20);
g.setFont(new Font("Times New Roman",Font.TRUETYPE_FONT,pSize));
g.setColor(getRandColor(200, 250));
for (int i=0;i<18;i++) {
int x = random.nextInt(60);
int y = random.nextInt(20);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
StringBuffer randCode = new StringBuffer();
for (int i=0;i<4;i++){
String temp = String.valueOf(random.nextInt(10));
randCode.append(temp);
g.setColor(new Color(0,0,0));
g.drawString(temp,13*i+6,16);
}
session.setAttribute("randCode", randCode.toString());
g.dispose();
ImageIO.write(image, "jpg", out);
}
public static void outputImage(String sessionName, HttpSession session, HttpServletResponse response) throws IOException{
BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, 60, 20);
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.setColor(getRandColor(160, 200));
for (int i=0;i<155;i++) {
int x = random.nextInt(60);
int y = random.nextInt(20);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
StringBuffer randCode = new StringBuffer();
for (int i=0;i<4;i++){
String temp = String.valueOf(random.nextInt(10));
randCode.append(temp);
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(temp,13*i+6,16);
}
session.setAttribute(sessionName, randCode.toString());
g.dispose();
response.reset();
OutputStream out=response.getOutputStream();
ImageIO.write(image, "JPEG", out);
out.flush();
out.close();
}
}
Cron表达式是一个字W串Q字W串??个空格隔开Q分开??个域Q每一个域代表一个含?Cron有如下两U语?
格式Q?
Seconds Minutes Hours DayofMonth Month DayofWeek Year ?
Seconds Minutes Hours DayofMonth Month DayofWeek
每一个域可出现的字符如下Q?
代码
Seconds:可出?- * / 四个字符Q有效范围ؓ(f)0-59的整?nbsp;
Minutes:可出?- * / 四个字符Q有效范围ؓ(f)0-59的整?nbsp;
Hours:可出?- * / 四个字符Q有效范围ؓ(f)0-23的整?nbsp;
DayofMonth:可出?- * / ? L W C八个字符Q有效范围ؓ(f)0-31的整?nbsp;
Month:可出?- * / 四个字符Q有效范围ؓ(f)1-12的整数或JAN-DEc
DayofWeek:可出?- * / ? L C #四个字符Q有效范围ؓ(f)1-7的整数或SUN-SAT两个范围?表示星期天,2表示星期一Q?依次cL
Year:可出?- * / 四个字符Q有效范围ؓ(f)1970-2099q?nbsp;
每一个域都用数字,但还可以出现如下Ҏ(gu)字符Q它们的含义是:(x)
代码
(1)*Q表C匹配该域的L|假如在Minutes域?,卌C每分钟都会(x)触发事g?nbsp;
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的Q意|但实际不?x)。因为DayofMonth和DayofWeek?x)相互媄响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能用如下写法:(x) 13 13 15 20 * ?,其中最后一位只能用Q,而不能?Q如果?表示不管星期几都?x)触发,实际上ƈ不是q样?nbsp;
(3)-:表示范围Q例如在Minutes域?-20Q表CZ5分到20分钟每分钟触发一?nbsp;
(4)/Q表Cv始时间开始触发,然后每隔固定旉触发一ơ,例如在Minutes域?/20,则意味着5分钟触发一ơ,?5Q?5{分别触发一?
(5),:表示列出枚D值倹{例如:(x)在Minutes域?,20Q则意味着??0分每分钟触发一ơ?nbsp;
(6)L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域?L,意味着在最后的一个星期四触发?nbsp;
(7)W:表示有效工作?周一到周?,只能出现在DayofMonth域,pȝ在L定日期的最q的有效工作日触发事件。例如:(x)在DayofMonth使用5WQ如?日是星期六,则将在最q的工作日:(x)星期五,?日触发。如?日是星期天,则在6日触发;如果5日在星期一到星期五中的一天,则就?日触发。另外一点,W(xu)的最q寻找不?x)跨q月?nbsp;
(8)LW:q两个字W可以连用,表示在某个月最后一个工作日Q即最后一个星期五?nbsp;
(9)#:用于定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2Q表C某月的W二个星期三?nbsp;
丑և个例?
代码
0 0 2 1 * ? * 表示在每月的1日的凌晨2点调度Q?nbsp;
0 15 10 ? * MON-FRI 表示周一到周五每天上?0Q?5执行作业
0 15 10 ? 6L 2002-2006 表示200-2006q的每个月的最后一个星期五上午10:15执行作业
91linux
一个cron表达式有臛_6个(也可?个)有空格分隔的旉元素?/span>
按顺序依ơؓ(f)
U(0~59Q?
分钟Q?~59Q?
时Q?~23Q?
天(月)Q?~31Q但是你需要考虑你月的天敎ͼ
月(0~11Q?
天(星期Q(1~7 1=SUN ?SUNQMONQTUEQW(xu)EDQTHUQFRIQSATQ?
7.q䆾Q?970Q?099Q?/span>
其中每个元素可以是一个??),一个连l区?9-12),一个间隔时?8-18/4)(/表示每隔4时),一个列?1,3,5),通配W。由?月䆾中的日期"?星期中的日期"q两个元素互斥的,必须要对其中一个设|?.
0 0 10,14,16 * * ? 每天上午10点,下午2点,4?br />
0 0/30 9-17 * * ? 朝九(ji)晚五工作旉内每半小?br />
0 0 12 ? * WED 表示每个星期三中?2?
"0 0 12 * * ?" 每天中午12点触?
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005q的每天上午10:15触发
"0 * 14 * * ?" 在每天下?点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下?点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下?点到2:55期间和下?点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下?点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下?:10?:44触发
"0 15 10 ? * MON-FRI" 周一臛_五的上午10:15触发
"0 15 10 15 * ?" 每月15日上?0:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002q至2005q的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上?0:15触发
有些子表辑ּ能包含一些范围或列表
例如Q子表达式(天(星期Q)可以?“MON-FRI”Q?#8220;MONQW(xu)EDQFRI”Q?#8220;MON-WED,SAT”
“*”字符代表所有可能的?
因此Q?#8220;*”在子表达式(月)里表C每个月的含义,“*”在子表达式(天(星期Q)表示星期的每一?
“/”字符用来指定数值的增量
例如Q在子表辑ּQ分钟)里的“0/15”表示从第0分钟开始,?5分钟
在子表达式(分钟Q里?#8220;3/20”表示从第3分钟开始,?0分钟Q它?#8220;3Q?3Q?3”Q的含义一?
“Q?#8221;字符仅被用于天(月)和天Q星期)两个子表辑ּQ表CZ指定?
?个子表达式其中之一被指定了g后,Z避免冲突Q需要将另一个子表达式的D?#8220;Q?#8221;
“L” 字符仅被用于天(月)和天Q星期)两个子表辑ּQ它是单?#8220;last”的羃?
但是它在两个子表辑ּ里的含义是不同的?
在天Q月Q子表达式中Q?#8220;L”表示一个月的最后一?
在天Q星期)自表辑ּ中,“L”表示一个星期的最后一天,也就是SAT
如果?#8220;L”前有具体的内容,它就h其他的含义了
例如Q?#8220;6L”表示q个月的倒数W6天,“QRQL”表示q个月的最一个星期五
注意Q在使用“L”参数Ӟ不要指定列表或范_(d)因ؓ(f)q会(x)D问题
字段 允许?nbsp; 允许的特D字W?
U?nbsp; 0-59 , - * /
?nbsp; 0-59 , - * /
时 0-23 , - * /
日期 1-31 , - * ? / L W C
月䆾 1-12 或?JAN-DEC , - * /
星期 1-7 或?SUN-SAT , - * ? / L C #
q_(d)可选) 留空, 1970-2099 , - * /
package com.guess.tools;
/** *
* 一条IP范围记录Q不仅包括国家和区域Q也包括起始IP和结束IP *
*
* @author swallow */
public class IPEntry {
public String beginIp;
public String endIp;
public String country;
public String area;
/** *//**
* 构造函?br />
*/
public IPEntry() {
beginIp = endIp = country = area = "";
}
public String toString(){
return this.area+" "+this.country+"IP范围:"+this.beginIp+"-"+this.endIp;
}
}
2.dQQwry.dat文gc?/span>
package com.guess.tools;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
/** *//**
* * 用来dQQwry.dat文gQ以Ҏ(gu)ip获得好友位置QQQwry.dat的格式是
* 一. 文g_(d)?字节
* 1. W一个v始IP的绝对偏U, 4字节
* 2. 最后一个v始IP的绝对偏U, 4字节
* ? "l束地址/国家/区域"记录?br />
* 四字节ip地址后跟的每一条记录分成两个部?br />
* 1. 国家记录
* 2. 地区记录
* 但是地区记录是不一定有的。而且国家记录和地录都有两UŞ?br />
* 1. ?l束的字W串
* 2. 4个字节,一个字节可能ؓ(f)0x1?x2
* a. ?x1Ӟ表示在绝对偏Udq跟着一个区域的记录Q注意是l对偏移之后Q而不是这四个字节之后
* b. ?x2Ӟ表示在绝对偏Ud没有区域记录
* 不管?x1q是0x2Q后三个字节都是实际国家名的文g内绝对偏U?br />
* 如果是地录,0x1?x2的含义不明,但是如果出现q两个字节,也肯定是跟着3个字节偏U,如果不是
* 则ؓ(f)0l尾字符?br />
* ? "起始地址/l束地址偏移"记录?br />
* 1. 每条记录7字节Q按照v始地址从小到大排列
* a. 起始IP地址Q?字节
* b. l束ip地址的绝对偏U,3字节
*
* 注意Q这个文仉的ip地址和所有的偏移量均采用little-endian格式Q而java是采?br />
* big-endian格式的,要注意{?br />
*
*
* @author 马若?br />
*/
public class IPSeeker {
/** *//**
* * 用来装ip相关信息Q目前只有两个字D,ip所在的国家和地?br />
*
*
* @author swallow */
private class IPLocation {
public String country;
public String area;
public IPLocation() {
country = area = "";
}
public IPLocation getCopy() {
IPLocation ret = new IPLocation();
ret.country = country;
ret.area = area;
return ret;
}
}
private static final String IP_FILE = IPSeeker.class.getResource("/QQWry.DAT").toString().substring(5);
// 一些固定常量,比如记录长度{等
private static final int IP_RECORD_LENGTH = 7;
private static final byte AREA_FOLLOWED = 0x01;
private static final byte NO_AREA = 0x2;
// 用来做ؓ(f)cacheQ查询一个ip旉先查看cacheQ以减少不必要的重复查找
private Hashtable ipCache;
// 随机文g讉Kc?br />
private RandomAccessFile ipFile;
// 内存映射文g
private MappedByteBuffer mbb;
// 单一模式实例
private static IPSeeker instance = new IPSeeker();
// 起始地区的开始和l束的绝对偏U?br />
private long ipBegin, ipEnd;
// 为提高效率而采用的临时变量
private IPLocation loc;
private byte[] buf;
private byte[] b4;
private byte[] b3;
/** *//**
* U有构造函?br />
*/
private IPSeeker() {
ipCache = new Hashtable();
loc = new IPLocation();
buf = new byte[100];
b4 = new byte[4];
b3 = new byte[3];
try {
ipFile = new RandomAccessFile(IP_FILE, "r");
} catch (FileNotFoundException e) {
System.out.println(IPSeeker.class.getResource("/QQWry.DAT").toString());
System.out.println(IP_FILE);
System.out.println("IP地址信息文g没有扑ֈQIP昄功能无法?);
ipFile = null;
}
// 如果打开文g成功Q读取文件头信息
if(ipFile != null) {
try {
ipBegin = readLong4(0);
ipEnd = readLong4(4);
if(ipBegin == -1 || ipEnd == -1) {
ipFile.close();
ipFile = null;
}
} catch (IOException e) {
System.out.println("IP地址信息文g格式有错误,IP昄功能无法?);
ipFile = null;
}
}
}
/** *//**
* @return 单一实例
*/
public static IPSeeker getInstance() {
return instance;
}
/** *//**
* l定一个地点的不完全名字,得到一pd包含s子串的IP范围记录
* @param s 地点子串
* @return 包含I(xin)PEntrycd的List
*/
public List getIPEntriesDebug(String s) {
List ret = new ArrayList();
long endOffset = ipEnd + 4;
for(long offset = ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) {
// dl束IP偏移
long temp = readLong3(offset);
// 如果temp不等?1Q读取IP的地点信?br />
if(temp != -1) {
IPLocation loc = getIPLocation(temp);
// 判断是否q个地点里面包含了s子串Q如果包含了Q添加这个记录到List中,如果没有Ql?br />
if(loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) {
IPEntry entry = new IPEntry();
entry.country = loc.country;
entry.area = loc.area;
// 得到起始IP
readIP(offset - 4, b4);
entry.beginIp = Utils.getIpStringFromBytes(b4);
// 得到l束IP
readIP(temp, b4);
entry.endIp = Utils.getIpStringFromBytes(b4);
// d该记?br />
ret.add(entry);
}
}
}
return ret;
}
/** *//**
* l定一个地点的不完全名字,得到一pd包含s子串的IP范围记录
* @param s 地点子串
* @return 包含I(xin)PEntrycd的List
*/
public List getIPEntries(String s) {
List ret = new ArrayList();
try {
// 映射IP信息文g到内存中
if(mbb == null) {
FileChannel fc = ipFile.getChannel();
mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, ipFile.length());
mbb.order(ByteOrder.LITTLE_ENDIAN);
}
int endOffset = (int)ipEnd;
for(int offset = (int)ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) {
int temp = readInt3(offset);
if(temp != -1) {
IPLocation loc = getIPLocation(temp);
// 判断是否q个地点里面包含了s子串Q如果包含了Q添加这个记录到List中,如果没有Ql?br />
if(loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) {
IPEntry entry = new IPEntry();
entry.country = loc.country;
entry.area = loc.area;
// 得到起始IP
readIP(offset - 4, b4);
entry.beginIp = Utils.getIpStringFromBytes(b4);
// 得到l束IP
readIP(temp, b4);
entry.endIp = Utils.getIpStringFromBytes(b4);
// d该记?br />
ret.add(entry);
}
}
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
return ret;
}
/** *//**
* 从内存映文件的offset位置开始的3个字节读取一个int
* @param offset
* @return
*/
private int readInt3(int offset) {
mbb.position(offset);
return mbb.getInt() & 0x00FFFFFF;
}
/** *//**
* 从内存映文件的当前位置开始的3个字节读取一个int
* @return
*/
private int readInt3() {
return mbb.getInt() & 0x00FFFFFF;
}
/** *//**
* Ҏ(gu)IP得到国家?br />
* @param ip ip的字节数lŞ?br />
* @return 国家名字W串
*/
public String getCountry(byte[] ip) {
// 查ip地址文g是否正常
if(ipFile == null) return "错误的IP数据库文?;
// 保存ipQ{换ip字节数组为字W串形式
String ipStr = Utils.getIpStringFromBytes(ip);
// 先检查cache中是否已l包含有q个ip的结果,没有再搜索文?br />
if(ipCache.containsKey(ipStr)) {
IPLocation loc = (IPLocation)ipCache.get(ipStr);
return loc.country;
} else {
IPLocation loc = getIPLocation(ip);
ipCache.put(ipStr, loc.getCopy());
return loc.country;
}
}
/** *//**
* Ҏ(gu)IP得到国家?br />
* @param ip IP的字W串形式
* @return 国家名字W串
*/
public String getCountry(String ip) {
return getCountry(Utils.getIpByteArrayFromString(ip));
}
/** *//**
* Ҏ(gu)IP得到地区?br />
* @param ip ip的字节数lŞ?br />
* @return 地区名字W串
*/
public String getArea(byte[] ip) {
// 查ip地址文g是否正常
if(ipFile == null) return "错误的IP数据库文?;
// 保存ipQ{换ip字节数组为字W串形式
String ipStr = Utils.getIpStringFromBytes(ip);
// 先检查cache中是否已l包含有q个ip的结果,没有再搜索文?br />
if(ipCache.containsKey(ipStr)) {
IPLocation loc = (IPLocation)ipCache.get(ipStr);
return loc.area;
} else {
IPLocation loc = getIPLocation(ip);
ipCache.put(ipStr, loc.getCopy());
return loc.area;
}
}
/** *//**
* Ҏ(gu)IP得到地区?br />
* @param ip IP的字W串形式
* @return 地区名字W串
*/
public String getArea(String ip) {
return getArea(Utils.getIpByteArrayFromString(ip));
}
/** *//**
* Ҏ(gu)ip搜烦ip信息文gQ得到IPLocationl构Q所搜烦的ip参数从类成员ip中得?br />
* @param ip 要查询的IP
* @return IPLocationl构
*/
private IPLocation getIPLocation(byte[] ip) {
IPLocation info = null;
long offset = locateIP(ip);
if(offset != -1)
info = getIPLocation(offset);
if(info == null) {
info = new IPLocation();
info.country = "未知国家";
info.area = "未知地区";
}
return info;
}
/** *//**
* 从offset位置d4个字节ؓ(f)一个longQ因为java为big-endian格式Q所以没办法
* 用了q么一个函数来做{?br />
* @param offset
* @return d的long|q回-1表示d文gp|
*/
private long readLong4(long offset) {
long ret = 0;
try {
ipFile.seek(offset);
ret |= (ipFile.readByte() & 0xFF);
ret |= ((ipFile.readByte() << 8) & 0xFF00);
ret |= ((ipFile.readByte() << 16) & 0xFF0000);
ret |= ((ipFile.readByte() << 24) & 0xFF000000);
return ret;
} catch (IOException e) {
return -1;
}
}
/** *//**
* 从offset位置d3个字节ؓ(f)一个longQ因为java为big-endian格式Q所以没办法
* 用了q么一个函数来做{?br />
* @param offset
* @return d的long|q回-1表示d文gp|
*/
private long readLong3(long offset) {
long ret = 0;
try {
ipFile.seek(offset);
ipFile.readFully(b3);
ret |= (b3[0] & 0xFF);
ret |= ((b3[1] << 8) & 0xFF00);
ret |= ((b3[2] << 16) & 0xFF0000);
return ret;
} catch (IOException e) {
return -1;
}
}
/** *//**
* 从当前位|读?个字节{换成long
* @return
*/
private long readLong3() {
long ret = 0;
try {
ipFile.readFully(b3);
ret |= (b3[0] & 0xFF);
ret |= ((b3[1] << 8) & 0xFF00);
ret |= ((b3[2] << 16) & 0xFF0000);
return ret;
} catch (IOException e) {
return -1;
}
}
/** *//**
* 从offset位置d四个字节的ip地址攑օip数组中,d后的ip为big-endian格式Q但?br />
* 文g中是little-endian形式Q将?x)进行{?br />
* @param offset
* @param ip
*/
private void readIP(long offset, byte[] ip) {
try {
ipFile.seek(offset);
ipFile.readFully(ip);
byte temp = ip[0];
ip[0] = ip[3];
ip[3] = temp;
temp = ip[1];
ip[1] = ip[2];
ip[2] = temp;
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
/** *//**
* 从offset位置d四个字节的ip地址攑օip数组中,d后的ip为big-endian格式Q但?br />
* 文g中是little-endian形式Q将?x)进行{?br />
* @param offset
* @param ip
*/
private void readIP(int offset, byte[] ip) {
mbb.position(offset);
mbb.get(ip);
byte temp = ip[0];
ip[0] = ip[3];
ip[3] = temp;
temp = ip[1];
ip[1] = ip[2];
ip[2] = temp;
}
/** *//**
* 把类成员ip和beginIp比较Q注意这个beginIp是big-endian?br />
* @param ip 要查询的IP
* @param beginIp 和被查询IP相比较的IP
* @return 相等q回0Qip大于beginIp则返?Q小于返?1?br />
*/
private int compareIP(byte[] ip, byte[] beginIp) {
for(int i = 0; i < 4; i++) {
int r = compareByte(ip[i], beginIp[i]);
if(r != 0)
return r;
}
return 0;
}
/** *//**
* 把两个byte当作无符hq行比较
* @param b1
* @param b2
* @return 若b1大于b2则返?Q相{返?Q小于返?1
*/
private int compareByte(byte b1, byte b2) {
if((b1 & 0xFF) > (b2 & 0xFF)) // 比较是否大于
return 1;
else if((b1 ^ b2) == 0)// 判断是否相等
return 0;
else
return -1;
}
/** *//**
* q个Ҏ(gu)根据ip的内容,定位到包含这个ip国家地区的记录处Q返回一个绝对偏U?br />
* Ҏ(gu)使用二分法查找?br />
* @param ip 要查询的IP
* @return 如果扑ֈ了,q回l束IP的偏U,如果没有扑ֈQ返?1
*/
private long locateIP(byte[] ip) {
long m = 0;
int r;
// 比较W一个ip?br />
readIP(ipBegin, b4);
r = compareIP(ip, b4);
if(r == 0) return ipBegin;
else if(r < 0) return -1;
// 开始二分搜?br />
for(long i = ipBegin, j = ipEnd; i < j; ) {
m = getMiddleOffset(i, j);
readIP(m, b4);
r = compareIP(ip, b4);
// log.debug(Utils.getIpStringFromBytes(b));
if(r > 0)
i = m;
else if(r < 0) {
if(m == j) {
j -= IP_RECORD_LENGTH;
m = j;
} else
j = m;
} else
return readLong3(m + 4);
}
// 如果循环l束了,那么i和j必定是相{的Q这个记录ؓ(f)最可能的记录,但是q
// 肯定是Q还要检查一下,如果是,p回结束地址区的l对偏移
m = readLong3(m + 4);
readIP(m, b4);
r = compareIP(ip, b4);
if(r <= 0) return m;
else return -1;
}
/** *//**
* 得到begin偏移和end偏移中间位置记录的偏U?br />
* @param begin
* @param end
* @return
*/
private long getMiddleOffset(long begin, long end) {
long records = (end - begin) / IP_RECORD_LENGTH;
records >>= 1;
if(records == 0) records = 1;
return begin + records * IP_RECORD_LENGTH;
}
/** *//**
* l定一个ip国家地区记录的偏U,q回一个IPLocationl构
* @param offset
* @return
*/
private IPLocation getIPLocation(long offset) {
try {
// 跌4字节ip
ipFile.seek(offset + 4);
// dW一个字节判断是否标志字?br />
byte b = ipFile.readByte();
if(b == AREA_FOLLOWED) {
// d国家偏移
long countryOffset = readLong3();
// 跌{臛_Ud
ipFile.seek(countryOffset);
// 再检查一ơ标志字节,因ؓ(f)q个时候这个地方仍然可能是个重定向
b = ipFile.readByte();
if(b == NO_AREA) {
loc.country = readString(readLong3());
ipFile.seek(countryOffset + 4);
} else
loc.country = readString(countryOffset);
// d地区标志
loc.area = readArea(ipFile.getFilePointer());
} else if(b == NO_AREA) {
loc.country = readString(readLong3());
loc.area = readArea(offset + 8);
} else {
loc.country = readString(ipFile.getFilePointer() - 1);
loc.area = readArea(ipFile.getFilePointer());
}
return loc;
} catch (IOException e) {
return null;
}
}
/** *//**
* @param offset
* @return
*/
private IPLocation getIPLocation(int offset) {
// 跌4字节ip
mbb.position(offset + 4);
// dW一个字节判断是否标志字?br />
byte b = mbb.get();
if(b == AREA_FOLLOWED) {
// d国家偏移
int countryOffset = readInt3();
// 跌{臛_Ud
mbb.position(countryOffset);
// 再检查一ơ标志字节,因ؓ(f)q个时候这个地方仍然可能是个重定向
b = mbb.get();
if(b == NO_AREA) {
loc.country = readString(readInt3());
mbb.position(countryOffset + 4);
} else
loc.country = readString(countryOffset);
// d地区标志
loc.area = readArea(mbb.position());
} else if(b == NO_AREA) {
loc.country = readString(readInt3());
loc.area = readArea(offset + 8);
} else {
loc.country = readString(mbb.position() - 1);
loc.area = readArea(mbb.position());
}
return loc;
}
/** *//**
* 从offset偏移开始解析后面的字节Q读Z个地区名
* @param offset
* @return 地区名字W串
* @throws IOException
*/
private String readArea(long offset) throws IOException {
ipFile.seek(offset);
byte b = ipFile.readByte();
if(b == 0x01 || b == 0x02) {
long areaOffset = readLong3(offset + 1);
if(areaOffset == 0)
return "未知地区";
else
return readString(areaOffset);
} else
return readString(offset);
}
/** *//**
* @param offset
* @return
*/
private String readArea(int offset) {
mbb.position(offset);
byte b = mbb.get();
if(b == 0x01 || b == 0x02) {
int areaOffset = readInt3();
if(areaOffset == 0)
return "未知地区";
else
return readString(areaOffset);
} else
return readString(offset);
}
/** *//**
* 从offset偏移处读取一个以0l束的字W串
* @param offset
* @return d的字W串Q出错返回空字符?br />
*/
private String readString(long offset) {
try {
ipFile.seek(offset);
int i;
for(i = 0, buf[i] = ipFile.readByte(); buf[i] != 0; buf[++i] = ipFile.readByte());
if(i != 0)
return Utils.getString(buf, 0, i, "GBK");
} catch (IOException e) {
System.out.println(e.getMessage());
}
return "";
}
/** *//**
* 从内存映文件的offset位置得到一?l尾字符?br />
* @param offset
* @return
*/
private String readString(int offset) {
try {
mbb.position(offset);
int i;
for(i = 0, buf[i] = mbb.get(); buf[i] != 0; buf[++i] = mbb.get());
if(i != 0)
return Utils.getString(buf, 0, i, "GBK");
} catch (IllegalArgumentException e){
System.out.println(e.getMessage());
}
return "";
}
public String getAddress(String ip){
String country = getCountry(ip).equals(" CZ88.NET")?"":getCountry(ip);
String area = getArea(ip).equals(" CZ88.NET")?"":getArea(ip);
String address = country+" "+area;
return address.trim();
}
public static void main(String args[]) {
List list=IPSeeker.getInstance().getIPEntriesDebug("江省杭州市");
}
}