MySQL时间戳与日期格式的相互转换
1、UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 输出:2006-08-22 12:11:10 2、日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Select UNIX_TIMESTAMP('2006-11-04 12:23:00'); 例:mysql查询当天的记录数: $sql=”select * from message Where DATE_FORMAT(FROM_UNIXTIME(chattime),’%Y-%m-%d’) = DATE_FORMAT(NOW(),’%Y-%m-%d’) order by id desc”; PHP方式转换: UNIX时间戳转换为日期用函数: date() date('Y-m-d H:i:s', 1156219870); 日期转换为UNIX时间戳用函数:strtotime() strtotime('2010-03-24 08:15:42'); from:http://blog.csdn.net/u013372487/article/details/48131589
View DetailsCentOS7下安装GUI图形界面
1、如何在centOS7下安装GUI图形界面 当你安装centOS7服务器版本的时候,系统默认是不会安装GUI的图形界面程序,这个需要手动安装CentOS7 Gnome GUI包。 2、在系统下使用命令安装gnome图形界面程序 在安装Gnome包之前,需要检查一下安装源(yum)是否正常,因为需要在yum命令来安装gnome包。 第一步:先检查yum 是否安装了,以及网络是否有网络。如果这两者都没有,先解决网络,在解决yum的安装。 (配置步骤可以查看我的博客文章-centOS-配置网络地址-的步骤来实现 ) 第二步:在命令行下 输入下面的命令来安装Gnome包。
|
1 |
# yum groupinstall "GNOME Desktop" "Graphical Administration Tools" |
第三步:更新系统的运行级别。
|
1 |
# ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target |
第四步:重启机器。启动默认进入图形界面。
|
1 |
# reboot |
3、系统启动后直接进入图形界面 from:https://www.cnblogs.com/c-xiaohai/p/6509641.html
View DetailsCSS实现单行、多行文本溢出显示省略号
如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览。 实现方法:
|
1 2 3 |
overflow: hidden; text-overflow:ellipsis; white-space: nowrap; |
效果如图: 但是这个属性只支持单行文本的溢出显示省略号,如果我们要实现多行文本溢出显示省略号呢。 接下来重点说一说多行文本溢出显示省略号,如下。 实现方法:
|
1 2 3 4 |
display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; |
效果如图: 适用范围: 因使用了WebKit的CSS扩展属性,该方法适用于WebKit浏览器及移动端; 注: -webkit-line-clamp用来限制在一个块元素显示的文本的行数。 为了实现该效果,它需要组合其他的WebKit属性。常见结合属性: display: -webkit-box; 必须结合的属性 ,将对象作为弹性伸缩盒子模型显示 。 -webkit-box-orient 必须结合的属性 ,设置或检索伸缩盒对象的子元素的排列方式 。 实现方法:
|
1 2 3 4 5 6 7 |
p{position: relative; line-height: 20px; max-height: 40px;overflow: hidden;} p::after{content: "..."; position: absolute; bottom: 0; right: 0; padding-left: 40px; background: -webkit-linear-gradient(left, transparent, #fff 55%); background: -o-linear-gradient(right, transparent, #fff 55%); background: -moz-linear-gradient(right, transparent, #fff 55%); background: linear-gradient(to right, transparent, #fff 55%); } |
效果如图: 适用范围: 该方法适用范围广,但文字未超出行的情况下也会出现省略号,可结合js优化该方法。 注: 将height设置为line-height的整数倍,防止超出的文字露出。 给p::after添加渐变背景可避免文字只显示一半。 由于ie6-7不显示content内容,所以要添加标签兼容ie6-7(如:<span>…<span/>);兼容ie8需要将::after替换成:after。 from:http://www.daqianduan.com/6179.html
View Details[原创]关于CMS中图片、视频、音频等媒体文件自管理的实现思路
背景 入行也13年有余了,找我做些小网站的朋友也挺多的;上传图片肯定是必备的功能,随着网速的提升,想上传些视频、音频的也挺多的。一直以来的做法也就是直接做个上传功能,最多做个图片管理的功能;有些在线编辑器也带有这些功能,如CKEditor(原FCKEditor)、Kindeditor等。但这种图片或文件管理也以用为主,对于文章已经删除,图片还留在服务器情况也得选择不去理会。这段终于闲了些,于是把多媒体文件的自动删除功能做上,也算圆满。 概述 大概思路就是记录每一个上传的文件,然后在任何引用些文件的地方也记录一下,当删除文章时就更新一下引用总数,如果发现引用数为0时则删除媒体文件。 实现思路 首先建议两个表,分别用来记录媒体文件和引用关系。 在添加文章时,记录上传的文件和引用关系。 在修改文章时,先查询出现有的引用关系备用;然后用正则从将要更新的文章信息、其他字段取出所有媒体文件(包括新增的和原有的),最后遍历一下媒体文件列表,把新的媒体文件入库并增加引用关系;再遍历刚才已经查询出的现有引用关系列表,检查出哪些媒体文件不再引用,先删除引用关系,如果发现某个媒体文件的引用次数是0,则删除媒体文件。 在删除文章时,删除文章所有引用媒体文件的记录,检查每一个媒体文件的引用次数,引用次数为0时则删除媒体文件。 以上就是我对上传到服务器的媒体文件自管理的实现,希望对各位有所启发,不足之处也请补充。
View Detailsmysql 语法
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
创建数据库: CREATE DATABASE --DATABASE 或者 SCHEMA数据库集合 IF NOT EXISTS db_name CHARACTER SET utf8 COLLATE utf8_general_ci 删除数据库 : DROP DATABASE db_name; 创建数据表: CREATE TABLE IF NOTEXISTS tb_name( id int(5) UNSIGNED --无符号 ZEROFILL --填满0 NOT NULL --不允许为空 AUTO_INCREMENT --主键自动增长 COMMENT '注释', PRIMARY KEY (field1, field2), --定义主键 INDEX key_name USING BTREE (field3)--定义索引 --UNIQUE INDEX | FULLTEXT INDEX 唯一 与 全文 --BTREE | HASH 索引方式 --定义外键 CONSTRAINT key_name FOREIGN KEY (field1) REFERENCES db.tb(field2) ON DELETE SET NULL --删除时的事件 ON UPDATE RESTRICT --更新时的事件 )ENGINE=MyISAM --引擎 DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci --字符编码 与 校对编码 COMMENT='表注释' AUTO_INCREMENT=5 --默认自动增长量为1 CHECKSUM=1 --每行维持一个校验和,会使表更新变得更慢,但它更容易找出损坏的表 ROW_FORMAT=DEFAULT --行格式 AVG_ROW_LENGTH=77 --表的平均行长度近似值,你只需为有变长记录的表设置。 MAX_ROWS=9 --表中存储的最大行数9 MIN_ROWS=3 -- 表中存储的最小行数3 PACK_KEYS=1 --封装键 DELAY_KEY_WRITE=1 --推迟关键表的更新直到表被关闭 DATA DIRECTORY='' --数据目录 INDEX DIRECTORY='' --索引目录 ; 清空数据表两种方法: TRUNCATE TABLE db.tb; DELETE FROM db.tb; 删除数据表: DROP db.tb; 另外,还可以这样新建表: CREATE TABLE IF NOTEXISTS tb_new(SELECT * FROM db.table1); --复制另一张表的内容,填充到新表,若新表重名,则省略创建过程,直接插入数据。 CREATE TABLE IF NOTEXISTS tb_new(LIKE db.table1); --复制另一表的结构。 修改表结构: ALTER TABLE db.table1 ADD COLUMN new_field int(5) NOT NULL AFTER field2; --添加字段 ALTER TABLE db.table1 CHANGE COLUMN field_name new_field_name varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `id`; --修改字段 ALTER TABLE db.table1 DROP COLUMN field1; --删除字段 ALTER TABLE db.table1 ADD UNIQUE INDEX index_name USING BTREE (field1); --添加索引 ALTER TABLE db.table1 DROP PRIMARY KEY, --删除主键 ADD PRIMARY KEY (id); --修改主键 ALTER TABLE db.table1 DROP INDEX index_name, --删除索引 ADD FULLTEXT INDEX index_name USING BTREE (field1); --添加索引 插入语句: INSERT INTO table1 VALUES (value1, value2, valueAll); INSERT INTO table1(field1, field2) VALUES (value1, value2); 更新语句: UPDATE table1 SET field1='value1', field2='value2' WHERE field3='value3'; 删除语句: DELETE FROM table1 WHERE field1='value1'; SELECT 语句: SELECT DISTINCT field1, field2 FROM table1; DISTINCT --值不重复 SELECT * FROM table1 WHERE field1='value'; =、<>、>、<、>=、<= --这些个,不解释 BETWEEN 'A' AND 'C' --限定范围,即:徘徊于牛A与牛C之间。 IN('value1','value2','value3') --限定值 LIKE '%abc%' --模糊查询 % --替代n个字符 _ --替代一个字符 [abcd] --限定为字符列表中的任一的字符 [^abcd] 或 [!abcd] --限定为排除字符列表中的任一的字符 SELECT * FROM table1 WHERE (field1='value1' OR field2='value2') AND field3='[abc]%'; SELECT * FROM table1 ORDER BY field1 DESC, field2 ASC; --若两个字段排序规则相同:ORDER BY filed1, filed2 DESC SELECT * FROM table1 LIMIT start, length; --查询指定的记录 SELECT TOP 10 PERCENT * FROM table1; --这是标准的SQL语句,查得前百分之十的记录,不加 PERCENT 则是前10条 SELECT t1.field1, t2.field2 FROM table1 AS t1, table2 AS t2 WHERE t1.field2=t2.field3; --表取别名 SELECT field1 AS f1 FROM table1; --字段取别名 SELECT * FROM table1 AS t1 FULL JOIN table2 AS t2; --无条件完全组合在一起 SELECT * FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.field1=t2.field1; --内连接,查询满足条件的记录(也可直接写JOIN)。 SELECT * FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.field1=t2.field1; --查询的表排列的顺序是从左到右,这是左连接,故以左边的表为主表,即:返回所有满足条件的记录,而主表中不满足条件的记录同样返回。 SELECT * FROM table1 AS t1 RIGHT JOIN table2 AS t2 ON t1.field1=t2.field1; --同理于上,反之而行 SELECT field1, field2 FROM table1 UNION SELECT field1, field2 FROM table2; --联合两张表的查询结果,要求查询字段必然数量相等 SELECT field1, field2 FROM table1 UNION ALL SELECT field1, field2 FROM table2; --上面不显示重复值,加上 ALL 表示全部 SELECT field1, field2 INTO table2 FROM table1 WHERE table1.field3='value'; --拷贝表的效果 SELECT * INTO table2 IN 'Backup.mdb' FROM table1; --向另一个数据库中拷贝表 SELECT field1, SUM(field2) FROM table1 GROUP BY field3; --用于结合合计函数,根据一个或多个列对结果集进行分组。 SELECT filed1,SUM(field2) FROM table1 HAVING SUM(OrderPrice)<2000; --WHERE无法与合计函数一起使用 ,HAVING 应运而生。 |
from:http://www.cnblogs.com/zbseoag/archive/2013/03/18/2966568.html
View DetailsMySQL数据类型
1、整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围(-2147483648~2147483647) bigint(m) 8个字节 范围(+-9.22*10的18次方) 取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。 int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。 2、浮点型(float和double) MySQL数据类型 含义 float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位 double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d小数位 设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。 3、定点数 浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。 decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。 4、字符串(char,varchar,_text) MySQL数据类型 含义 char(n) 固定长度,最多255个字符 varchar(n) 固定长度,最多65535个字符 tinytext 可变长度,最多255个字符 text 可变长度,最多65535个字符 mediumtext 可变长度,最多2的24次方-1个字符 longtext 可变长度,最多2的32次方-1个字符 char和varchar: 1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。 2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。 3.char类型的字符串检索速度要比varchar类型的快。 varchar和text: 1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。 2.text类型不能有默认值。 3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。 5.二进制数据(_Blob) 1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。 2._BLOB存储的数据只能整体读出。 3._TEXT可以指定字符集,_BLO不用指定字符集。 6.日期时间类型 MySQL数据类型 含义 date 日期 '2008-12-2' time 时间 ’12:25:36′ datetime 日期时间 '2008-12-2 22:06:44' timestamp 自动存储记录修改时间 若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。 数据类型的属性 MySQL关键字 […]
View Detailswordpress IP验证不当漏洞的修复步骤
有关wordpress IP验证不当漏洞的通知,阿里云每天一封邮件加一条短信。虽然关系不大,但还是看着心烦。同时升级专业版不是小博客能够承受的,所以只能自己动手。 漏洞描述 wordpress /wp-includes/http.php文件中的wp_http_validate_url函数对输入IP验证不当,导致黑客可构造类似于012.10.10.10这样的畸形IP绕过验证,进行SSRF。【注意:该补丁为云盾自研代码修复方案,云盾会根据您当前代码是否符合云盾自研的修复模式进行检测,如果您自行采取了底层/框架统一修复、或者使用了其他的修复方案,可能会导致您虽然已经修复了改漏洞,云盾依然报告存在漏洞,遇到该情况可选择忽略该漏洞提示】 漏洞修复 找到wp-includes/http.php这个文件,在文件的465行附近找到:
|
1 |
$same_host = strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] ); |
把改行修改为成以下代码,或者注销该行添加。
|
1 2 3 4 5 |
if (isset($parsed_home['host'])) { $same_host = (strtolower($parsed_home['host']) === strtolower($parsed_url['host']) || 'localhost' === strtolower($parsed_url['host'])); } else { $same_host = false; }; |
还是这个文件,在 478行左右找以下代码
|
1 |
if ( 127 === $parts[0] || 10 === $parts[0] |
替换成
|
1 |
if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0] |
如果在修改的时候发现478该行代码已经是修改过的代码,请忽略。 漏洞验证 登录阿里云帐号,在服务器安全页面点击验证。 参考连接: https://my.oschina.net/u/1433006/blog/752189 from:http://www.sijitao.net/2508.html
View DetailsReact Native 开发之 IDE 选型和配置
React Native 发布一年多了,有不少公司已经在线上产品中或小范围试水,或大范围应用,很多公司或开发者都在为 React Native 的生态系统作出自己的贡献。 React Native 的开发基本上是 Javascript + 系统原生开发语言(Java,Objective-C,Swift),原生语言的开发所用的 IDE 没有多余的选择,Android 平台只能使用 Android Studio(不要告诉我你还在使用 Eclipse),iOS 平台只能使用 XCode,而开发 Javascript 的 IDE 选择就多了,从 FaceBook 官方推荐的 Atom+Nuclide,到与 Android Studio 同系列的 Javascript IDE WebStorm,再到功能强大的 Sublime Text 3,以及微软推出的 Visual Studio Code 和 decosoftware 专门为 React Native 打造的开源 IDE Deco,甚至 Vim,NodePad++ 等等,都可以用来开发 React Native,唯一的前提能够支持识别 Javascript 语法,识别 JSX 和 React Native API 的智能提醒。接下来我们就来介绍最常用的五款 IDE 的配置和选型。 Atom+Nuclide Atom 是由 Github 打造的下一代编程开发利器,支持 Windows、Mac OS X、Linux 三大桌面平台,免费且开源。Atom 支持各种编程语言的代码高亮,同时具备强大的代码补全功能,能够极大的提高编程效率,Atom 本质上是一个文本编辑器,而不是一个 IDE,因此在用来开发 React Native 时需要配合 Nuclide 一起使用。 Nuclide 是 Facebook 基于 Atom 的基础上开发的一个插件 IDE,可以用来开发 React Native,iOS […]
View DetailsHTML&CSS编码规范
目录 HTML 语法 HTML5 doctype 语言属性(Language attribute) 字符编码 IE 兼容模式 引入 CSS 和 JavaScript 文件 实用为王 属性顺序 布尔(boolean)型属性 减少标签的数量 JavaScript 生成的标签 CSS 语法 声明顺序 不要使用 @import 媒体查询(Media query)的位置 带前缀的属性 单行规则声明 简写形式的属性声明 Less 和 Sass 中的嵌套 Less 和 Sass 中的操作符 注释 class 命名 选择器 代码组织 黄金定律 永远遵循同一套编码规范 — 可以是这里列出的,也可以是你自己总结的。如果你发现本规范中有任何错误,敬请指正。通过 open an issue on GitHub 为本规范添加内容或贡献力量。 不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的。 HTML 语法 用两个空格来代替制表符(tab) — 这是唯一能保证在所有环境下获得一致展现的方法。 嵌套元素应当缩进一次(即两个空格)。 对于属性的定义,确保全部使用双引号,绝不要使用单引号。 不要在自闭合(self-closing)元素的尾部添加斜线 — HTML5 规范中明确说明这是可选的。 不要省略可选的结束标签(closing tag)(例如,</li> 或 </body>)。
|
1 2 3 4 5 6 7 8 9 10 |
<span class="cp"><!DOCTYPE html></span> <span class="nt"><html></span> <span class="nt"><head></span> <span class="nt"><title></span>Page title<span class="nt"></title></span> <span class="nt"></head></span> <span class="nt"><body></span> <span class="nt"><img</span> <span class="na">src=</span><span class="s">"images/company-logo.png"</span> <span class="na">alt=</span><span class="s">"Company"</span><span class="nt">></span> <span class="nt"><h1</span> <span class="na">class=</span><span class="s">"hello-world"</span><span class="nt">></span>Hello, world!<span class="nt"></h1></span> <span class="nt"></body></span> <span class="nt"></html></span> |
HTML5 doctype 为每个 HTML 页面的第一行添加标准模式(standard mode)的声明,这样能够确保在每个浏览器中拥有一致的展现。
|
1 2 3 4 5 |
<span class="cp"><!DOCTYPE html></span> <span class="nt"><html></span> <span class="nt"><head></span> <span class="nt"></head></span> <span class="nt"></html></span> |
语言属性 根据 HTML5 规范: 强烈建议为 html 根元素指定 lang 属性,从而为文档设置正确的语言。这将有助于语音合成工具确定其所应该采用的发音,有助于翻译工具确定其翻译时所应遵守的规则等等。 更多关于 lang 属性的知识可以从 此规范 中了解。 这里列出了语言代码表。
|
1 2 3 |
<span class="nt"><html</span> <span class="na">lang=</span><span class="s">"en-us"</span><span class="nt">></span> <span class="c"><!-- ... --></span> <span class="nt"></html></span> |
IE 兼容模式 IE […]
View DetailsThread – 多线程更新(update)数据库表的例子
目标:为提高数据库表更新(update)效率,使用多线程更新。其实这里也可以考虑另一种方法批量更新,不过如果更新失败了,同一事务(transaction)中的其他更新语句就会回滚,比较麻烦,所在还是简单点用多线程去处理。 困难点:开始是想把需要更新的数据等分到线程中去处理,不过搞了一段时间都没成功,主要是没有什么办法把动态参数从线程外传进线程内。后来换了个思路,每个线程去拿一条数据去更新,拿数据时同步处理。这样之后就可以了。 例子(部分外部类没有写上去,所以只能参考,要运行需要改改):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; public class BaiduBaikeJob { static final Logger logger = LoggerFactory .getLogger(BaiduBaikeJob.class); @Autowired private MongoLockService mongoLockService; @Autowired private WeiboPersonService weiboPersonService; @Resource(name = "globalProperties") private PropertyPlaceholderConfigurer config; final int THREAD_COUNT = 10; AtomicInteger updCounter = new AtomicInteger(0); AtomicInteger next = new AtomicInteger(0); private CountDownLatch threadCompletedCounter = new CountDownLatch(THREAD_COUNT); /** * 每隔 1小时,获得百度百科里的人物信息 */ public void baiduBaikeRun() { if ("true".equalsIgnoreCase((String) config.getProperty("runBaiduBaikeJob", "false")) && mongoLockService.getLock(MongoLockService.LOCK_BAIDU_BAIKE)) { List<WeiboPerson> unBaikeFills = null; try { unBaikeFills = weiboPersonService.findUnBaikeFills(2000); if (unBaikeFills != null && !unBaikeFills.isEmpty()) { List<WeiboPerson> weiboPersonList = new ArrayList<WeiboPerson>(); for (final WeiboPerson person : unBaikeFills) { // 获取百度百科信息 WeiboPerson weiboPerson = BaiduBaikeUtils.getBaiduBaikeInfo(person.getName()); weiboPerson.setId(person.getId()); weiboPerson.setName(person.getName()); weiboPerson.setTenantId(person.getTenantId()); weiboPerson.setGroupId(person.getGroupId()); // 更新状态 if (!StringUtils.isEmptyString(weiboPerson.getDescription())) { weiboPerson.setFlagBaike(WeiboPerson.BAIKE_SUCCESS); } else { weiboPerson.setFlagBaike(WeiboPerson.BAIKE_FAIL); } weiboPerson.setLastUpdDate(new Date()); weiboPersonList.add(weiboPerson); } // 首次更新或过期更新 baiduBaikeRunInMultiThreads(weiboPersonList); } } catch (Exception e) { logger.error("update baidu baike error," + e.getClass().getName() + ": " + e.getMessage()); } finally { try { mongoLockService.releaseLock(MongoLockService.LOCK_BAIDU_BAIKE); } catch (Exception e) { logger.error("release lock error ", e); } } } } /** * 多线程处理:更新table */ private void baiduBaikeRunInMultiThreads(final List<WeiboPerson> weiboPersonList) { ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); for (int i = 0; i < THREAD_COUNT; i++) { executor.submit(new Runnable() { public void run() { WeiboPerson weiboPerson = getNext(weiboPersonList); while (null != weiboPerson) { try { // 首次更新或过期更新 weiboPersonService.update(weiboPerson); } catch (Exception e) { logger.error("table weiboPerson update error ", e); } updCounter.incrementAndGet(); // System.out.println("Thread:" + Thread.currentThread().getName() + ", counter:" + updCounter + ", name:" + weiboPerson.getName()); weiboPerson = getNext(weiboPersonList); } threadCompletedCounter.countDown(); } }); } closeThreadPool(executor); } /** * 同步处理:获取需要更新的一条微博人物 */ private synchronized WeiboPerson getNext(List<WeiboPerson> weiboPersonList){ if(next.intValue()>=weiboPersonList.size()) return null; next.incrementAndGet(); return weiboPersonList.get(next.intValue()-1); } /** * 关闭线程池 */ private void closeThreadPool(final ExecutorService executor) { try { threadCompletedCounter.await(); executor.shutdown(); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { // mock List<WeiboPerson> weiboPersonList = new ArrayList<WeiboPerson>(); int i = 1; while (i <= 10) { WeiboPerson weiboPerson = new WeiboPerson(); weiboPerson.setName("a" + i); weiboPersonList.add(weiboPerson); i++; } // test multi-thread BaiduBaikeJob baiduBaikeJob = new BaiduBaikeJob(); baiduBaikeJob.baiduBaikeRunInMultiThreads(weiboPersonList); } } |
from:http://blog.csdn.net/textboy/article/details/44680289
View Details