BlogJava-Terry.Li-彬http://www.ymeg.top/libin2722/虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。zh-cnMon, 19 Aug 2019 12:13:38 GMTMon, 19 Aug 2019 12:13:38 GMT60身份證JS校驗http://www.ymeg.top/libin2722/archive/2017/04/14/432452.html禮物禮物Fri, 14 Apr 2017 02:37:00 GMThttp://www.ymeg.top/libin2722/archive/2017/04/14/432452.htmlhttp://www.ymeg.top/libin2722/comments/432452.htmlhttp://www.ymeg.top/libin2722/archive/2017/04/14/432452.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/432452.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/432452.html身份證號校驗 ///校驗參數配置項 if (!value) return false; if (value.length == 0) { return "身份證號不可以為空!"; } if (value.length != 18) { return "18位身份證號長度錯誤!"; } value = value.toUpperCase(); var city = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "內蒙古", 21: "遼寧", 22: "吉林", 23: "黑龍江 ", 31: "上海", 32: "江蘇", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山東", 41: "河南", 42: "湖北 ", 43: "湖南", 44: "廣東", 45: "廣西", 46: "海南", 50: "重慶", 51: "四川", 52: "貴州", 53: "云南", 54: "西藏 ", 61: "陜西", 62: "甘肅", 63: "青海", 64: "寧夏", 65: "新疆", 71: "臺灣", 81: "香港", 82: "澳門", 91: "國外 " }; if (!value || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[012]\d|3[01])\d{3}(\d|X)$/i.test(value)) { return "身份證號碼格式錯誤,請重新輸入!"; } else if (!city[value.substr(0, 2)]) { return "無效的地區編碼,請重新輸入!"; } else { //18位身份證需要驗證最后一位校驗位 value = value.split(''); //∑(ai×Wi)(mod 11) //加權因子 var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //校驗位 var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]; var sum = 0; var ai = 0; var wi = 0; for (var i = 0; i < 17; i++) { ai = value[i]; wi = factor[i]; sum += ai * wi; } var last = parity[sum % 11]; if (parity[sum % 11] != value[17]) { return "無效的身份證號,請重新輸入!!"; } } return; },

禮物 2017-04-14 10:37 發表評論
]]>
MySQL導入.sql文件及常用命令http://www.ymeg.top/libin2722/articles/427346.html禮物禮物Wed, 16 Sep 2015 00:49:00 GMThttp://www.ymeg.top/libin2722/articles/427346.htmlhttp://www.ymeg.top/libin2722/comments/427346.htmlhttp://www.ymeg.top/libin2722/articles/427346.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/427346.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/427346.html MySQL導入.sql文件及常用命令

在MySQL Qurey?? Brower中直接導入*.sql腳本,是不能一次執行多條sql命令的,在mysql中執行sql文件的命令:

mysql> source?? d:/myprogram/database/db.sql;

另附mysql常用命令:

一) 連接MYSQL:

??? 格式: mysql -h主機地址 -u用戶名 -p用戶密碼

1、例1:連接到本機上的MYSQL

??? 首先在打開DOS窗口,然后進入mysql安裝目錄下的bin目錄下,例如: D:/mysql/bin,再鍵入命令mysql -uroot -p,回車后提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是:mysql>

2、例2:連接到遠程主機上的MYSQL (遠程:IP地址)

??? 假設遠程主機的IP為:10.0.0.1,用戶名為root,密碼為123。則鍵入以下命令:

?? mysql -h10.0.0.1 -uroot -p123

?? (注:u與root可以不用加空格,其它也一樣)

3、退出MYSQL命令

??? exit (回車)

(二) 修改密碼:

??? 格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼

1、例1:給root加個密碼123。首先在DOS下進入目錄C:/mysql/bin,然后鍵入以下命令:

??? mysqladmin -uroot -password 123

??? 注:因為開始時root沒有密碼,所以-p舊密碼一項就可以省略了。

2、例2:再將root的密碼改為456

??? mysqladmin -uroot -pab12 password 456

(三) 增加新用戶:(注意:和上面不同,下面的因為是MYSQL環境中的命令,所以后面都帶一個分號作為命令結束符)

??? 格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by "密碼"

??? 例1、增加一個用戶test1密碼為abc,讓他可以在任何主機上登錄,并對所有數據庫有查詢、插入、修改、刪除的權限。首先用以root用戶連入MYSQL,然后鍵入以下命令:???? grant select,insert,update,delete on *.* to? test2@localhost ?identified by "abc";

??? 如果你不想test2有密碼,可以再打一個命令將密碼消掉。???? grant select,insert,update,delete on mydb.* to? test2@localhost ?identified by "";

(四) 顯示命令

1、顯示數據庫列表:

??? show databases;???? 剛開始時才兩個數據庫:mysql和test。mysql庫很重要它里面有MYSQL的系統信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。

2、顯示庫中的數據表:

??? use mysql; //打開庫??? show tables;

3、顯示數據表的結構:

??? describe 表名;

4、建庫:

??? create database 庫名;

5、建表:

??? use 庫名;???? create table 表名 (字段設定列表);

6、刪庫和刪表:

??? drop database 庫名;???? drop table 表名;

7、將表中記錄清空:

??? delete from 表名;

8、顯示表中的記錄:

??? select * from 表名;

導出sql腳本

mysqldump -u 用戶名 -p 數據庫名 > 存放位置

mysqldump -u root -p test > c:/a.sql

導入sql腳本

mysql -u 用戶名 -p 數據庫名 < 存放位置

mysqljump -u root -p test < c:/a.sql

注意,test數據庫必須已經存在

MySQL導出導入命令的用例

1.導出整個數據庫

mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

2.導出一個表

mysqldump -u 用戶名 -p 數據庫名表名> 導出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

3.導出一個數據庫結構

mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:wcnc_db.sql

-d 沒有數據 --add-drop-table 在每個create語句之前增加一個drop table

4.導入數據庫

常用source 命令

進入mysql數據庫控制臺,

如mysql -u root -p

mysql>use 數據庫

然后使用source命令,后面參數為腳本文件(如這里用到的.sql)

mysql>source d:wcnc_db.sql



禮物 2015-09-16 08:49 發表評論
]]>
ERROR 2006 (HY000) at line xx: MySQL server has gone away 解決方法 http://www.ymeg.top/libin2722/articles/427345.html禮物禮物Wed, 16 Sep 2015 00:48:00 GMThttp://www.ymeg.top/libin2722/articles/427345.htmlhttp://www.ymeg.top/libin2722/comments/427345.htmlhttp://www.ymeg.top/libin2722/articles/427345.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/427345.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/427345.html1.執行批量的MYSQL語句,例如備份恢復的時候,時間過長。
對應:修改my.cnf中的wait_timeout和interactive_timeout變量
在一些不便修改的情形下,如租用的空間,可以采取sql語句修改,如何做呢?

解決辦法

找到my.ini文件

添加一句max_allowed_packet=16M,如果不行將16M再加大

加大wait_timeout也可起一定作用

eg:

wait_timeout=2880000
interactive_timeout = 2880000
max_allowed_packet = 100M

應用時記住重啟數據庫哦~~

除此之外,可能還有一些別的buffer_size的變量會影響到,也值得注意
例如
read_buffer_size
read_rnd_buffer_size


禮物 2015-09-16 08:48 發表評論
]]>
Ajax Session Timeout 超時 處理http://www.ymeg.top/libin2722/articles/407255.html禮物禮物Thu, 05 Dec 2013 08:11:00 GMThttp://www.ymeg.top/libin2722/articles/407255.htmlhttp://www.ymeg.top/libin2722/comments/407255.htmlhttp://www.ymeg.top/libin2722/articles/407255.html#Feedback1http://www.ymeg.top/libin2722/comments/commentRss/407255.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/407255.html?* Author : Larry Li
?* Date : 2013-12-5
?* Email : larry.li@aicent.com
?*/
var Session = function() {
?? ?var defaults = {
?? ??? ??? ?title??????? : 'Session Notification',
?? ??? ??? ?message????? : 'Your session is about to expire.',
?? ??? ??? ?keepAliveUrl : '/admin/session/keep-alive',
?? ??? ??? ?redirUrl???? : '/account/timed-out',
?? ??? ??? ?logoutUrl??? : '/account/logout',
?? ??? ??? ?warnAfter??? : 900000, // 15 minutes
?? ??? ??? ?redirAfter?? : 1200000 // 20 minutes
?? ?};
?? ?
?? ?var o = defaults, dialogTimer, redirTimer;
?? ?
?? ?var controlRedirTimer = function(action) {
?? ??? ?switch(action) {
?? ??? ??? ?case 'start':
?? ??? ??? ??? ?// Dialog has been shown, if no action taken during redir period, redirect
?? ??? ??? ??? ?redirTimer = setTimeout(function(){
?? ??? ??? ??? ??? ?window.location = o.redirUrl;
?? ??? ??? ??? ?}, o.redirAfter - o.warnAfter);
?? ??? ??? ??? ?break;
?? ?
?? ??? ??? ?case 'stop':
?? ??? ??? ??? ?clearTimeout(redirTimer);
?? ??? ??? ??? ?break;
?? ??? ??? ?case 'restart':
?? ??? ??? ??? ?clearTimeout(redirTimer);
?? ??? ??? ??? ?redirTimer = setTimeout(function(){
?? ??? ??? ??? ??? ?window.location = o.redirUrl;
?? ??? ??? ??? ?}, o.redirAfter - o.warnAfter);
?? ??? ??? ??? ?break;
?? ??? ?}
?? ?};
?? ?
?? ?var controlDialogTimer = function(action) {
?? ??? ?switch(action) {
?? ??? ??? ?case 'start':
?? ??? ??? ??? ?dialogTimer = setTimeout(function(){
?? ??? ??? ??? ??? ?$('#sessionTimeout-dialog').modal('show');
?? ??? ??? ??? ??? ?controlRedirTimer('start');
?? ??? ??? ??? ?}, o.warnAfter);
?? ??? ??? ??? ?break;
?? ??? ??? ?case 'stop':
?? ??? ??? ??? ?clearTimeout(dialogTimer);
?? ??? ??? ??? ?break;
?? ??? ??? ?case 'restart':
?? ??? ??? ??? ?clearTimeout(dialogTimer);
?? ??? ??? ??? ?dialogTimer = setTimeout(function(){
?? ??? ??? ??? ??? ?$('#sessionTimeout-dialog').modal('show');
?? ??? ??? ??? ??? ?controlRedirTimer('restart');
?? ??? ??? ??? ?}, o.warnAfter);
?? ??? ??? ??? ?break;
?? ??? ?}
?? ?};
?? ?
?? ?var doKeepAlive = function() {
?? ??? ?$.ajax({
?? ??? ??? ?type: 'POST',
?? ??? ??? ?url: o.keepAliveUrl,
?? ??? ??? ?success: function() {
?? ??? ??? ??? ?// Stop redirect timer and restart warning timer
?? ??? ??? ??? ?controlRedirTimer('restart');
?? ??? ??? ??? ?controlDialogTimer('restart');
?? ??? ??? ?}
?? ??? ?});
?? ?};
?? ?
?? ?return {
?? ??? ?sessionTimeout: function(options) {
?? ??? ??? ?if ( options ) { o = $.extend( defaults, options ); }
?? ??? ??? ?
?? ??? ??? ?var warning_dialog = '<div class="modal fade" id="sessionTimeout-dialog">'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ?<div class="modal-dialog modal-small">'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ?<div class="modal-content">'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ?<div class="modal-header">'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ??? ?<button id="_close" type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ??? ?<h4 class="modal-title">'+ o.title +'</h4>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ?</div>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ?<div class="modal-body">'+ o.message +'</div>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ?<div class="modal-footer">'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ??? ?<button id="sessionTimeout-dialog-logout" type="button" class="btn btn-default">Logout</button>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ??? ?<button id="sessionTimeout-dialog-keepalive" type="button" class="btn btn-primary" data-dismiss="modal">Stay Connected</button>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ??? ?</div>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ??? ?</div>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'?? ?</div>'
?? ??? ??? ??? ??? ??? ??? ??? ?+'</div>';
?? ??? ??? ?
?? ??? ??? ?$('body').append(warning_dialog);
?? ??? ??? ?
?? ??? ??? ?$('#sessionTimeout-dialog-logout').on('click', function () { window.location = o.logoutUrl; });
?? ??? ??? ?
?? ??? ??? ?$('#_close,#sessionTimeout-dialog-keepalive').click(function() {
?? ??? ??? ??? ?doKeepAlive();
?? ??? ??? ?});
?? ??? ??? ?// Begin warning period
?? ??? ??? ?controlDialogTimer('start');
?? ??? ?},
?? ??? ?
?? ??? ?sessionTimeoutKeepAlive: function() {
?? ??? ??? ?controlRedirTimer('restart');
?? ??? ??? ?controlDialogTimer('restart');
?? ??? ?}
?? ?};
}();

$(function() {
?? ?Session.sessionTimeout({
?? ??? ?title: 'Session Timeout Notification',
?? ??? ?message: 'Your session is about to expire.',
?? ??? ?keepAliveUrl: contextPath + '/admin/session/keep-alive',
?? ??? ?redirUrl: contextPath + '/account/login',
?? ??? ?logoutUrl: contextPath + '/account/logout',
?? ??? ?warnAfter: 1500000,
?? ??? ?redirAfter: 1780000
?? ?});
?? ?
?? ?$(document).ajaxComplete(function() {
?? ??? ?Session.sessionTimeoutKeepAlive();
?? ?});
});

禮物 2013-12-05 16:11 發表評論
]]>
忘掉jQuery,使用JavaScript原生APIhttp://www.ymeg.top/libin2722/articles/406911.html禮物禮物Thu, 28 Nov 2013 01:31:00 GMThttp://www.ymeg.top/libin2722/articles/406911.htmlhttp://www.ymeg.top/libin2722/comments/406911.htmlhttp://www.ymeg.top/libin2722/articles/406911.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/406911.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/406911.html閱讀全文

禮物 2013-11-28 09:31 發表評論
]]>
Ehcache詳細解讀http://www.ymeg.top/libin2722/articles/406569.html禮物禮物Wed, 20 Nov 2013 04:53:00 GMThttp://www.ymeg.top/libin2722/articles/406569.htmlhttp://www.ymeg.top/libin2722/comments/406569.htmlhttp://www.ymeg.top/libin2722/articles/406569.html#Feedback1http://www.ymeg.top/libin2722/comments/commentRss/406569.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/406569.html閱讀全文

禮物 2013-11-20 12:53 發表評論
]]>
How can I print SQL query result log with log4j?http://www.ymeg.top/libin2722/articles/405551.html禮物禮物Wed, 23 Oct 2013 06:34:00 GMThttp://www.ymeg.top/libin2722/articles/405551.htmlhttp://www.ymeg.top/libin2722/comments/405551.htmlhttp://www.ymeg.top/libin2722/articles/405551.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/405551.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/405551.html閱讀全文

禮物 2013-10-23 14:34 發表評論
]]>
repositorieshttp://www.ymeg.top/libin2722/articles/404849.html禮物禮物Thu, 10 Oct 2013 15:08:00 GMThttp://www.ymeg.top/libin2722/articles/404849.htmlhttp://www.ymeg.top/libin2722/comments/404849.htmlhttp://www.ymeg.top/libin2722/articles/404849.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/404849.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/404849.html<!-- ********************************************** --> <!-- **** REPOSITORIOS DEL PROYECTO **** --> <!-- ********************************************** --> <repositories> <!-- ****** RELEASE ****** --> <repository> <id>atlassian</id> <url>http://maven.atlassian.com/repository/public</url> <releases> <enabled> true</enabled> </releases> <snapshots> <enabled> false </enabled> </snapshots> </repository> <repository> <id>maven.org.repo2</id> <name>Repository of Maven.org</name> <url>http://search.maven.org/#search</url> </repository> <repository> <id>search.maven.org</id> <name>Repository of Maven.org</name> <url>http://search.maven.org</url> </repository> <repository> <id>itextpdf.com</id> <name>Maven Repository for iText</name> <url>http://maven.itextpdf.com</url> </repository> <repository> <id>repository.jboss.com</id> <name>Jboss Repository for Maven</name> <url>http://repository.jboss.com</url> </repository> <repository> <id>snapshots.jboss.org</id> <name>Jboss Snapshot Repository for Maven</name> <url>http://snapshots.jboss.org/maven2</url> </repository> <repository> <id>java.net</id> <name>Repository of Java.net</name> <url>http://download.java.net/maven/1</url> </repository> <repository> <id>deltaset.org</id> <name>Repository of Deltaset</name> <url>http://deltaset.googlecode.com/svn/maven2</url> </repository> <repository> <id>prime.com</id> <name>Repository of PrimeFaces</name> <url>http://repository.prime.com.tr/org</url> </repository> <repository> <id>com.springsource.repository.maven.milestone</id> <name>Spring Framework Maven Milestone Releases (Maven Central Format)</name> <url>http://maven.springframework.org/milestone</url> </repository> <repository> <id>maven-repository2.dev.java.net</id> <name>Java.net Repository for Maven 2</name> <url>http://download.java.net/maven/2</url> </repository> <repository> <id>mvnrepository.com</id> <name>mvnrepository.com</name> <url>http://mvnrepository.com</url> </repository> <repository> <id>www.mvnbrowser.com</id> <name>www.mvnbrowser.com</name> <url>http://www.mvnbrowser.com</url> </repository> <repository> <id>objectweb</id> <name>Objectweb repository</name> <url>http://maven.objectweb.org/maven2</url> </repository> <repository> <id>ops4j.repository</id> <name>OPS4J Repository</name> <url>http://repository.ops4j.org/maven2</url> </repository> <repository> <id>Codehaus Snapshots</id> <url>http://snapshots.repository.codehaus.org/</url> </repository> <!-- **** SNAPSHOTS **** --> <repository> <id>apache-maven-snapshots</id> <name>Repository of Snapshots</name> <url>http://repository.apache.org/snapshots</url> </repository> <repository> <id>apache.snapshots</id> <name>ASF Maven 2 Snapshot</name> <url>http://people.apache.org/builds/struts/2.1.8.1/m2-staging-repository</url> </repository> <repository> <id>com.springsource.repository.maven.snapshot</id> <name>SpringSource Enterprise Bundle Maven Repository - SpringSource Snapshot Releases</name> <url>http://maven.springframework.org/snapshot</url> </repository> </repositories>

禮物 2013-10-10 23:08 發表評論
]]>
ehcache 配置參數說明http://www.ymeg.top/libin2722/articles/404115.html禮物禮物Mon, 16 Sep 2013 02:43:00 GMThttp://www.ymeg.top/libin2722/articles/404115.htmlhttp://www.ymeg.top/libin2722/comments/404115.htmlhttp://www.ymeg.top/libin2722/articles/404115.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/404115.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/404115.html < ? ehcache ? ? ? xmlns:xsi ? = ? "http://www.w3.org/2001/XMLSchema-instance" ? ?? ??? xsi:noNamespaceSchemaLocation ? = ? "ehcache.xsd" ? > ? ?? ?
?? ? < ? diskStore ? ? ? path ? = ? "java.io.tmpdir" ? /> ? ?? ?
?? ? < ? defaultCache ? ?? ?
???? ? maxElementsInMemory ? = ? "10000" ? ?? ?
???? ? maxElementsOnDisk ? = ? "0" ? ?? ?
???? ? eternal ? = ? "true" ? ?? ?
???? ? overflowToDisk ? = ? "true" ? ?? ?
???? ? diskPersistent ? = ? "false" ? ?? ?
???? ? timeToIdleSeconds ? = ? "0" ? ?? ?
???? ? timeToLiveSeconds ? = ? "0" ? ?? ?
???? ? diskSpoolBufferSizeMB ? = ? "50" ? ?? ?
???? ? diskExpiryThreadIntervalSeconds ? = ? "120" ? ?? ?
???? ? memoryStoreEvictionPolicy ? = ? "LFU" ? ?? ?
???? ? /> ? ?? ?
?? ? < ? cache ? ? ? name ? = ? "myCache" ? ?? ?
???? ? maxElementsInMemory ? = ? "100" ? ?? ?
???? ? maxElementsOnDisk ? = ? "0" ? ?? ?
???? ? eternal ? = ? "false" ? ?? ?
???? ? overflowToDisk ? = ? "false" ? ?? ?
???? ? diskPersistent ? = ? "false" ? ?? ?
???? ? timeToIdleSeconds ? = ? "120" ? ?? ?
???? ? timeToLiveSeconds ? = ? "120" ? ?? ?
???? ? diskSpoolBufferSizeMB ? = ? "50" ? ?? ?
???? ? diskExpiryThreadIntervalSeconds ? = ? "120" ? ?? ?
???? ? memoryStoreEvictionPolicy ? = ? "FIFO" ? ?? ?
???? ? /> ? ?? ?
</ ? ehcache ? >
???
diskStore ?:指定數據存儲位置,可指定磁盤中的文件夾位置
defaultCache?: 默認的管理策略

以下屬性是必須的:
  1. name: ?Cache的名稱,必須是唯一的(ehcache會把這個cache放到HashMap里)。
  2. maxElementsInMemory: ? 在內存中緩存的element的最大數目?
  3. maxElementsOnDisk: ? 在磁盤上緩存的element的最大數目,默認值為0,表示不限制。?
  4. eternal: ? 設定緩存的elements是否永遠不過期。如果為true,則緩存的數據始終有效,如果為false那么還要根據timeToIdleSeconds,timeToLiveSeconds判斷?
  5. overflowToDisk: ?如果內存中數據超過內存限制,是否要緩存到磁盤上。

以下屬性是可選的: ?
  1. timeToIdleSeconds: ?對象空閑時間,指對象在多長時間沒有被訪問就會失效。只對eternal為false的有效。默認值0,表示一直可以訪問。
  2. timeToLiveSeconds: ?對象存活時間,指對象從創建到失效所需要的時間。只對eternal為false的有效。默認值0,表示一直可以訪問。
  3. diskPersistent: ?是否在磁盤上持久化。指重啟jvm后,數據是否有效。默認為false。
  4. diskExpiryThreadIntervalSeconds: ?對象檢測線程運行時間間隔。標識對象狀態的線程多長時間運行一次。
  5. diskSpoolBufferSizeMB: ?DiskStore使用的磁盤大小,默認值30MB。每個cache使用各自的DiskStore。
  6. memoryStoreEvictionPolicy: ?如果內存中數據超過內存限制,向磁盤緩存時的策略。默認值LRU,可選FIFO、LFU。
緩存的3 種清空策略 ?
FIFO?,first in first out (先進先出).

LFU?, Less Frequently Used (最少使用).意思是一直以來最少被使用的。緩存的元素有一個hit 屬性,hit 值最小的將會被清出緩存。

LRU?,Least Recently Used(最近最少使用). (ehcache 默認值).緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那么現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。


禮物 2013-09-16 10:43 發表評論
]]>
OSChina架構中,依照“管理重于配置”的思路使用Servlet設計的MVChttp://www.ymeg.top/libin2722/articles/403043.html禮物禮物Mon, 19 Aug 2013 08:41:00 GMThttp://www.ymeg.top/libin2722/articles/403043.htmlhttp://www.ymeg.top/libin2722/comments/403043.htmlhttp://www.ymeg.top/libin2722/articles/403043.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/403043.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/403043.htmlpackage my.mvc; import java.io.*; import java.lang.reflect.*; import java.net.URLDecoder; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import my.db.DBException; import my.util.ResourceUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; /** * 業務處理方法入口,URI的映射邏輯: * /action/xxxxxx/xxxx -> com.dlog4j.action.XxxxxxAction.xxxx(req,res) * <pre> 林花謝了春紅, 太匆匆, 無奈朝來寒雨晚來風。 胭脂淚, 相留醉, 幾時重, 自是人生長恨水長東。 * </pre> * @author Winter Lau (http://my.oschina.net/javayou)<br> */ public final class ActionServlet extends HttpServlet { private final static String ERROR_PAGE = "error_page"; private final static String GOTO_PAGE = "goto_page"; private final static String THIS_PAGE = "this_page"; private final static String ERROR_MSG = "error_msg"; private final static String UTF_8 = "utf-8"; private List<String> action_packages = null; private final static ThreadLocal<Boolean> g_json_enabled = new ThreadLocal<Boolean>(); @Override public void init() throws ServletException { String tmp = getInitParameter("packages"); action_packages = Arrays.asList(StringUtils.split(tmp,',')); String initial_actions = getInitParameter("initial_actions"); for(String action : StringUtils.split(initial_actions,',')) try { _LoadAction(action); } catch (Exception e) { log("Failed to initial action : " + action, e); } } @Override public void destroy() { for(Object action : actions.values()){ try{ Method dm = action.getClass().getMethod("destroy"); if(dm != null){ dm.invoke(action); log("!!!!!!!!! " + action.getClass().getSimpleName() + " destroy !!!!!!!!!"); } }catch(NoSuchMethodException e){ }catch(Exception e){ log("Unabled to destroy action: " + action.getClass().getSimpleName(), e); } } super.destroy(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { process(RequestContext.get(), false); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { process(RequestContext.get(), true); } /** * 執行Action方法并進行返回處理、異常處理 * @param req * @param resp * @param is_post * @throws ServletException * @throws IOException */ protected void process(RequestContext req, boolean is_post) throws ServletException, IOException { try{ req.response().setContentType("text/html;charset=utf-8"); if(_process(req, is_post)){ String gp = req.param(GOTO_PAGE); if(StringUtils.isNotBlank(gp)) req.redirect(gp); } }catch(InvocationTargetException e){ Throwable t = e.getCause(); if(t instanceof ActionException) handleActionException(req, (ActionException)t); else if(t instanceof DBException) handleDBException(req, (DBException)t); else throw new ServletException(t); }catch(ActionException t){ handleActionException(req, t); }catch(IOException e){ throw e; }catch(DBException e){ handleDBException(req, e); }catch(Exception e){ log("Exception in action process.", e); throw new ServletException(e); }finally{ g_json_enabled.remove(); } } /** * Action業務異常 * @param req * @param resp * @param t * @throws ServletException * @throws IOException */ protected void handleActionException(RequestContext req, ActionException t) throws ServletException, IOException { handleException(req, t.getMessage()); } protected void handleDBException(RequestContext req, DBException e) throws ServletException, IOException { log("DBException in action process.", e); handleException(req, ResourceUtils.getString("error", "database_exception", e.getCause().getMessage())); } /** * URL解碼 * * @param url * @param charset * @return */ private static String _DecodeURL(String url, String charset) { if (StringUtils.isEmpty(url)) return ""; try { return URLDecoder.decode(url, charset); } catch (Exception e) { } return url; } protected void handleException(RequestContext req, String msg) throws ServletException, IOException { String ep = req.param(ERROR_PAGE); if(StringUtils.isNotBlank(ep)){ if(ep.charAt(0)=='%') ep = _DecodeURL(ep, UTF_8); ep = ep.trim(); if(ep.charAt(0)!='/'){ req.redirect(req.contextPath()+"/"); } else{ req.request().setAttribute(ERROR_MSG, msg); req.forward(ep.trim()); } } else{ if(g_json_enabled.get()) req.output_json("msg", msg); else req.print(msg); } } /** * 業務邏輯處理 * @param req * @param resp * @param is_post_method * @throws IllegalAccessException * @throws InstantiationException * @throws IOException * @throws ServletException * @throws IOException * @throws InvocationTargetException * @throws IllegalArgumentException */ private boolean _process(RequestContext req, boolean is_post) throws InstantiationException, IllegalAccessException, IOException, IllegalArgumentException, InvocationTargetException { String requestURI = req.uri(); String[] parts = StringUtils.split(requestURI, '/'); if(parts.length<2){ req.not_found(); return false; } //加載Action類 Object action = this._LoadAction(parts[1]); if(action == null){ req.not_found(); return false; } String action_method_name = (parts.length>2)?parts[2]:"index"; Method m_action = this._GetActionMethod(action, action_method_name); if(m_action == null){ req.not_found(); return false; } //判斷action方法是否只支持POST if (!is_post && m_action.isAnnotationPresent(Annotation.PostMethod.class)){ req.not_found(); return false; } g_json_enabled.set(m_action.isAnnotationPresent(Annotation.JSONOutputEnabled.class)); if(m_action.isAnnotationPresent(Annotation.UserRoleRequired.class)){ IUser loginUser = req.user(); if(loginUser == null){ String this_page = req.param(THIS_PAGE, ""); throw req.error("user_not_login", this_page); } if(loginUser.IsBlocked()) throw req.error("user_blocked"); Annotation.UserRoleRequired urr = (Annotation.UserRoleRequired) m_action.getAnnotation(Annotation.UserRoleRequired.class); if(loginUser.getRole() < urr.role()) throw req.error("user_role_deny"); } //調用Action方法之準備參數 int arg_c = m_action.getParameterTypes().length; switch(arg_c){ case 0: // login() m_action.invoke(action); break ; case 1: m_action.invoke(action, req); break; case 2: // login(HttpServletRequest req, HttpServletResponse res) m_action.invoke(action, req.request(), req.response()); break ; case 3: // login(HttpServletRequest req, HttpServletResponse res, String[] extParams) StringBuilder args = new StringBuilder(); for(int i=3;i<parts.length;i++){ if(StringUtils.isBlank(parts[i])) continue; if(args.length() > 0) args.append('/'); args.append(parts[i]); } boolean isLong = m_action.getParameterTypes()[2].equals(long.class); m_action.invoke(action, req.request(), req.response(), isLong ? NumberUtils.toLong( args.toString(), -1L) : args.toString()); break ; default: req.not_found(); return false; } return true; } /** * 加載Action類 * @param act_name * @return * @throws InstantiationException * @throws IllegalAccessException * @throws ClassNotFoundException */ protected Object _LoadAction(String act_name) throws InstantiationException,IllegalAccessException { Object action = actions.get(act_name); if(action == null){ for(String pkg : action_packages){ String cls = pkg + '.' + StringUtils.capitalize(act_name) + "Action"; action = _LoadActionOfFullname(act_name, cls); if(action != null) break; } } return action ; } private Object _LoadActionOfFullname(String act_name, String cls) throws IllegalAccessException, InstantiationException { Object action = null; try { action = Class.forName(cls).newInstance(); try{ Method action_init_method = action.getClass().getMethod("init", ServletContext.class); action_init_method.invoke(action, getServletContext()); }catch(NoSuchMethodException e){ }catch(InvocationTargetException excp) { excp.printStackTrace(); } if(!actions.containsKey(act_name)){ synchronized(actions){ actions.put(act_name, action); } } } catch (ClassNotFoundException excp) {} return action; } /** * 獲取名為{method}的方法 * @param action * @param method * @return */ private Method _GetActionMethod(Object action, String method) { String key = action.getClass().getSimpleName() + '.' + method; Method m = methods.get(key); if(m != null) return m; for(Method m1 : action.getClass().getMethods()){ if(m1.getModifiers()==Modifier.PUBLIC && m1.getName().equals(method)){ synchronized(methods){ methods.put(key, m1); } return m1 ; } } return null; } private final static HashMap<String, Object> actions = new HashMap<String, Object>(); private final static HashMap<String, Method> methods = new HashMap<String, Method>(); }

禮物 2013-08-19 16:41 發表評論
]]>
class卸載、熱替換和Tomcat的熱部署的分析http://www.ymeg.top/libin2722/articles/396091.html禮物禮物Tue, 05 Mar 2013 09:16:00 GMThttp://www.ymeg.top/libin2722/articles/396091.htmlhttp://www.ymeg.top/libin2722/comments/396091.htmlhttp://www.ymeg.top/libin2722/articles/396091.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/396091.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/396091.html這篇文章主要是分析Tomcat中關于熱部署和JSP更新替換的原理,在此之前先介紹class的熱替換和class的卸載的原理。

一 class的熱替換
ClassLoader中重要的方法
loadClass
????? ClassLoader.loadClass(...) 是ClassLoader的入口點。當一個類沒有指明用什么加載器加載的時候,JVM默認采用AppClassLoader加載器加載沒有加載過的class,調用的方法的入口就是loadClass(...)。如果一個class被自定義的ClassLoader加載,那么JVM也會調用這個自定義的ClassLoader.loadClass(...)方法來加載class內部引用的一些別的class文件。重載這個方法,能實現自定義加載class的方式,拋棄雙親委托機制,但是即使不采用雙親委托機制,比如java.lang包中的相關類還是不能自定義一個同名的類來代替,主要因為JVM解析、驗證class的時候,會進行相關判斷。
?
defineClass
????? 系統自帶的ClassLoader,默認加載程序的是AppClassLoader,ClassLoader加載一個class,最終調用的是defineClass(...)方法,這時候就在想是否可以重復調用defineClass(...)方法加載同一個類(或者修改過),最后發現調用多次的話會有相關錯誤:
...
java.lang.LinkageError
attempted duplicate class definition
...
所以一個class被一個ClassLoader實例加載過的話,就不能再被這個ClassLoader實例再次加載(這里的加載指的是,調用了defileClass(...)放方法,重新加載字節碼、解析、驗證。)。而系統默認的AppClassLoader加載器,他們內部會緩存加載過的class,重新加載的話,就直接取緩存。所與對于熱加載的話,只能重新創建一個ClassLoader,然后再去加載已經被加載過的class文件。www.2cto.com

下面看一個class熱加載的例子:
代碼:HotSwapURLClassLoader自定義classloader,實現熱替換的關鍵
? 1 package testjvm.testclassloader;
? 2
? 3 import java.io.File;
? 4 import java.io.FileNotFoundException;
? 5 import java.net.MalformedURLException;
? 6 import java.net.URL;
? 7 import java.net.URLClassLoader;
? 8 import java.util.HashMap;
? 9 import java.util.Map;
?10
?11 /**
?12? * 只要功能是重新加載更改過的.class文件,達到熱替換的作用
?13? * @author banana
?14? */
?15 public class HotSwapURLClassLoader extends URLClassLoader {
?16???? //緩存加載class文件的最后最新修改時間
?17???? public static Map<String,Long> cacheLastModifyTimeMap = new HashMap<String,Long>();
?18???? //工程class類所在的路徑
?19???? public static String projectClassPath = "D:/Ecpworkspace/ZJob-Note/bin/";
?20???? //所有的測試的類都在同一個包下
?21???? public static String packagePath = "testjvm/testclassloader/";
?22????
?23???? private static HotSwapURLClassLoader hcl = new HotSwapURLClassLoader();
?24????
?25???? public HotSwapURLClassLoader() {
?26???????? //設置ClassLoader加載的路徑
?27???????? super(getMyURLs());
?28???? }
?29????
?30???? public static HotSwapURLClassLoader? getClassLoader(){
?31???????? return hcl;
?32???? }
?33
?34???? private static? URL[] getMyURLs(){
?35???????? URL url = null;
?36???????? try {
?37???????????? url = new File(projectClassPath).toURI().toURL();
?38???????? } catch (MalformedURLException e) {
?39???????????? e.printStackTrace();
?40???????? }
?41???????? return new URL[] { url };
?42???? }
?43????
?44???? /**
?45????? * 重寫loadClass,不采用雙親委托機制("java."開頭的類還是會由系統默認ClassLoader加載)
?46????? */
?47???? @Override
?48???? public Class<?> loadClass(String name,boolean resolve) throws ClassNotFoundException {
?49???????? Class clazz = null;
?50???????? //查看HotSwapURLClassLoader實例緩存下,是否已經加載過class
?51???????? //不同的HotSwapURLClassLoader實例是不共享緩存的
?52???????? clazz = findLoadedClass(name);
?53???????? if (clazz != null ) {
?54???????????? if (resolve){
?55???????????????? resolveClass(clazz);
?56???????????? }
?57???????????? //如果class類被修改過,則重新加載
?58???????????? if (isModify(name)) {
?59???????????????? hcl = new HotSwapURLClassLoader();
?60???????????????? clazz = customLoad(name, hcl);
?61???????????? }
?62???????????? return (clazz);
?63???????? }
?64
?65???????? //如果類的包名為"java."開始,則有系統默認加載器AppClassLoader加載
?66???????? if(name.startsWith("java.")){
?67???????????? try {
?68???????????????? //得到系統默認的加載cl,即AppClassLoader
?69???????????????? ClassLoader system = ClassLoader.getSystemClassLoader();
?70???????????????? clazz = system.loadClass(name);
?71???????????????? if (clazz != null) {
?72???????????????????? if (resolve)
?73???????????????????????? resolveClass(clazz);
?74???????????????????? return (clazz);
?75???????????????? }
?76???????????? } catch (ClassNotFoundException e) {
?77???????????????? // Ignore
?78???????????? }
?79???????? }
?80????????
?81???????? return customLoad(name,this);
?82???? }
?83
?84???? public Class load(String name) throws Exception{
?85???????? return loadClass(name);
?86???? }
?87
?88???? /**
?89????? * 自定義加載
?90????? * @param name
?91????? * @param cl
?92????? * @return
?93????? * @throws ClassNotFoundException
?94????? */
?95???? public Class customLoad(String name,ClassLoader cl) throws ClassNotFoundException {
?96???????? return customLoad(name, false,cl);
?97???? }
?98
?99???? /**
100????? * 自定義加載
101????? * @param name
102????? * @param resolve
103????? * @return
104????? * @throws ClassNotFoundException
105????? */
106???? public Class customLoad(String name, boolean resolve,ClassLoader cl)
107???????????? throws ClassNotFoundException {
108???????? //findClass()調用的是URLClassLoader里面重載了ClassLoader的findClass()方法
109???????? Class clazz = ((HotSwapURLClassLoader)cl).findClass(name);
110???????? if (resolve)
111???????????? ((HotSwapURLClassLoader)cl).resolveClass(clazz);
112???????? //緩存加載class文件的最后修改時間
113???????? long lastModifyTime = getClassLastModifyTime(name);
114???????? cacheLastModifyTimeMap.put(name,lastModifyTime);
115???????? return clazz;
116???? }
117????
118???? public Class<?> loadClass(String name) throws ClassNotFoundException {
119???????? return loadClass(name,false);
120???? }
121????
122???? @Override
123???? protected Class<?> findClass(String name) throws ClassNotFoundException {
124???????? // TODO Auto-generated method stub
125???????? return super.findClass(name);
126???? }
127????
128???? /**
129????? * @param name
130????? * @return .class文件最新的修改時間
131????? */
132???? private long getClassLastModifyTime(String name){
133???????? String path = getClassCompletePath(name);
134???????? File file = new File(path);
135???????? if(!file.exists()){
136???????????? throw new RuntimeException(new FileNotFoundException(name));
137???????? }
138???????? return file.lastModified();
139???? }
140????
141???? /**
142????? * 判斷這個文件跟上次比是否修改過
143????? * @param name
144????? * @return
145????? */
146???? private boolean isModify(String name){
147???????? long lastmodify = getClassLastModifyTime(name);
148???????? long previousModifyTime = cacheLastModifyTimeMap.get(name);
149???????? if(lastmodify>previousModifyTime){
150???????????? return true;
151???????? }
152???????? return false;
153???? }
154????
155???? /**
156????? * @param name
157????? * @return .class文件的完整路徑 (e.g. E:/A.class)
158????? */
159???? private String getClassCompletePath(String name){
160???????? String simpleName = name.substring(name.lastIndexOf(".")+1);
161???????? return projectClassPath+packagePath+simpleName+".class";
162???? }
163????
164 }
165

代碼:Hot被用來修改的類
1 package testjvm.testclassloader;
2
3 public class Hot {
4???? public void hot(){
5???????? System.out.println(" version 1 : "+this.getClass().getClassLoader());
6???? }
7 }
8

代碼:TestHotSwap測試類
?1 package testjvm.testclassloader;
?2
?3 import java.lang.reflect.Method;
?4
?5 public class TestHotSwap {
?6
?7???? public static void main(String[] args) throws Exception {
?8???????? //開啟線程,如果class文件有修改,就熱替換
?9???????? Thread t = new Thread(new MonitorHotSwap());
10???????? t.start();
11???? }
12 }
13
14 class MonitorHotSwap implements Runnable {
15???? // Hot就是用于修改,用來測試熱加載
16???? private String className = "testjvm.testclassloader.Hot";
17???? private Class hotClazz = null;
18???? private HotSwapURLClassLoader hotSwapCL = null;
19
20???? @Override
21???? public void run() {
22???????? try {
23???????????? while (true) {
24???????????????? initLoad();
25???????????????? Object hot = hotClazz.newInstance();
26???????????????? Method m = hotClazz.getMethod("hot");
27???????????????? m.invoke(hot, null); //打印出相關信息
28???????????????? // 每隔10秒重新加載一次
29???????????????? Thread.sleep(10000);
30???????????? }
31???????? } catch (Exception e) {
32???????????? e.printStackTrace();
33???????? }
34???? }
35
36???? /**
37????? * 加載class
38????? */
39???? void initLoad() throws Exception {
40???????? hotSwapCL = HotSwapURLClassLoader.getClassLoader();
41???????? // 如果Hot類被修改了,那么會重新加載,hotClass也會返回新的
42???????? hotClazz = hotSwapCL.loadClass(className);
43???? }
44 }

???? 在測試類運行的時候,修改Hot.class文件
Hot.class
原來第五行:System.out.println(" version 1 : "+this.getClass().getClassLoader());
改后第五行:System.out.println(" version 2 : "+this.getClass().getClassLoader());
??
輸出
?version 1 : testjvm.testclassloader.HotSwapURLClassLoader@610f7612
?version 1 : testjvm.testclassloader.HotSwapURLClassLoader@610f7612
?version 2 : testjvm.testclassloader.HotSwapURLClassLoader@45e4d960
?version 2 : testjvm.testclassloader.HotSwapURLClassLoader@45e4d960
???? 所以HotSwapURLClassLoader是重加載了Hot類 。注意上面,其實當加載修改后的Hot時,HotSwapURLClassLoader實例跟加載沒修改Hot的HotSwapURLClassLoader不是同一個。
圖:HotSwapURLClassLoader加載情況

???? 總結:上述類熱加載,需要自定義ClassLoader,并且只能重新實例化ClassLoader實例,利用新的ClassLoader實例才能重新加載之前被加載過的class。并且程序需要模塊化,才能利用這種熱加載方式。

二 class卸載
????? 在Java中class也是可以unload。JVM中class和Meta信息存放在PermGen space區域。如果加載的class文件很多,那么可能導致PermGen space區域空間溢出。引起:java.lang.OutOfMemoryErrorPermGen space.? 對于有些Class我們可能只需要使用一次,就不再需要了,也可能我們修改了class文件,我們需要重新加載 newclass,那么oldclass就不再需要了。那么JVM怎么樣才能卸載Class呢。

????? JVM中的Class只有滿足以下三個條件,才能被GC回收,也就是該Class被卸載(unload):
?? - 該類所有的實例都已經被GC。
?? - 加載該類的ClassLoader實例已經被GC。
?? - 該類的java.lang.Class對象沒有在任何地方被引用。

???? GC的時機我們是不可控的,那么同樣的我們對于Class的卸載也是不可控的。

例子:
代碼:SimpleURLClassLoader,一個簡單的自定義classloader
? 1 package testjvm.testclassloader;
? 2
? 3 import java.io.File;
? 4 import java.net.MalformedURLException;
? 5 import java.net.URL;
? 6 import java.net.URLClassLoader;
? 7
? 8 public class SimpleURLClassLoader extends URLClassLoader {
? 9???? //工程class類所在的路徑
?10???? public static String projectClassPath = "E:/IDE/work_place/ZJob-Note/bin/";
?11???? //所有的測試的類都在同一個包下
?12???? public static String packagePath = "testjvm/testclassloader/";
?13????
?14???? public SimpleURLClassLoader() {
?15???????? //設置ClassLoader加載的路徑
?16???????? super(getMyURLs());
?17???? }
?18????
?19???? private static? URL[] getMyURLs(){
?20???????? URL url = null;
?21???????? try {
?22???????????? url = new File(projectClassPath).toURI().toURL();
?23???????? } catch (MalformedURLException e) {
?24???????????? e.printStackTrace();
?25???????? }
?26???????? return new URL[] { url };
?27???? }
?28????
?29???? public Class load(String name) throws Exception{
?30???????? return loadClass(name);
?31???? }
?32
?33???? public Class<?> loadClass(String name) throws ClassNotFoundException {
?34???????? return loadClass(name,false);
?35???? }
?36????
?37???? /**
?38????? * 重寫loadClass,不采用雙親委托機制("java."開頭的類還是會由系統默認ClassLoader加載)
?39????? */
?40???? @Override
?41???? public Class<?> loadClass(String name,boolean resolve) throws ClassNotFoundException {
?42???????? Class clazz = null;
?43???????? //查看HotSwapURLClassLoader實例緩存下,是否已經加載過class
?44???????? clazz = findLoadedClass(name);
?45???????? if (clazz != null ) {
?46???????????? if (resolve){
?47???????????????? resolveClass(clazz);
?48???????????? }
?49???????????? return (clazz);
?50???????? }
?51
?52???????? //如果類的包名為"java."開始,則有系統默認加載器AppClassLoader加載
?53???????? if(name.startsWith("java.")){
?54???????????? try {
?55???????????????? //得到系統默認的加載cl,即AppClassLoader
?56???????????????? ClassLoader system = ClassLoader.getSystemClassLoader();
?57???????????????? clazz = system.loadClass(name);
?58???????????????? if (clazz != null) {
?59???????????????????? if (resolve)
?60???????????????????????? resolveClass(clazz);
?61???????????????????? return (clazz);
?62???????????????? }
?63???????????? } catch (ClassNotFoundException e) {
?64???????????????? // Ignore
?65???????????? }
?66???????? }
?67????????
?68???????? return customLoad(name,this);
?69???? }
?70
?71???? /**
?72????? * 自定義加載
?73????? * @param name
?74????? * @param cl
?75????? * @return
?76????? * @throws ClassNotFoundException
?77????? */
?78???? public Class customLoad(String name,ClassLoader cl) throws ClassNotFoundException {
?79???????? return customLoad(name, false,cl);
?80???? }
?81
?82???? /**
?83????? * 自定義加載
?84????? * @param name
?85????? * @param resolve
?86????? * @return
?87????? * @throws ClassNotFoundException
?88????? */
?89???? public Class customLoad(String name, boolean resolve,ClassLoader cl)
?90???????????? throws ClassNotFoundException {
?91???????? //findClass()調用的是URLClassLoader里面重載了ClassLoader的findClass()方法
?92???????? Class clazz = ((SimpleURLClassLoader)cl).findClass(name);
?93???????? if (resolve)
?94???????????? ((SimpleURLClassLoader)cl).resolveClass(clazz);
?95???????? return clazz;
?96???? }
?97????
?98???? @Override
?99???? protected Class<?> findClass(String name) throws ClassNotFoundException {
100???????? return super.findClass(name);
101???? }
102 }
103

代碼:A
1 public class A {?
2 //? public static final Level CUSTOMLEVEL = new Level("test", 550) {}; // 內部類
3 }
代碼:TestClassUnload,測試類
?1 package testjvm.testclassloader;
?2
?3 public class TestClassUnLoad {
?4
?5???? public static void main(String[] args) throws Exception {
?6???????? SimpleURLClassLoader loader = new SimpleURLClassLoader();
?7???????? // 用自定義的加載器加載A
?8???????? Class clazzA = loader.load("testjvm.testclassloader.A");
?9???????? Object a = clazzA.newInstance();
10???????? // 清除相關引用
11???????? a = null;
12???????? clazzA = null;
13???????? loader = null;
14???????? // 執行一次gc垃圾回收
15???????? System.gc();
16???????? System.out.println("GC over");
17???? }
18 }
19

????? 運行的時候配置VM參數: -verbose:class;用于查看class的加載與卸載情況。如果用的是Eclipse,在Run Configurations中配置此參數即可。
圖:Run Configurations配置???

輸出結果
.....
[Loaded java.net.URI$Parser from E:\java\jdk1.7.0_03\jre\lib\rt.jar]
[Loaded testjvm.testclassloader.A from file:/E:/IDE/work_place/ZJob-Note/bin/]
[Unloading class testjvm.testclassloader.A]
GC over
[Loaded sun.misc.Cleaner from E:\java\jdk1.7.0_03\jre\lib\rt.jar]
[Loaded java.lang.Shutdown from E:\java\jdk1.7.0_03\jre\lib\rt.jar]
......



禮物 2013-03-05 17:16 發表評論
]]>
個性化推薦技術漫談http://www.ymeg.top/libin2722/articles/396041.html禮物禮物Mon, 04 Mar 2013 08:39:00 GMThttp://www.ymeg.top/libin2722/articles/396041.htmlhttp://www.ymeg.top/libin2722/comments/396041.htmlhttp://www.ymeg.top/libin2722/articles/396041.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/396041.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/396041.html如果說過去的十年是搜索技術大行其道的十年,那么個性化推薦技術將成為未來十年中最重要的革新之一。目前幾乎所有大型的電子商務系統,如Amazon、CDNOW、Netflix等,都不同程度地使用了各種形式的推薦系統。而近來以“發現”為核心的網站正開始在互聯網上嶄露頭角,比如側重于音樂推薦的八寶盒,側重于圖書推薦的豆瓣等等。
?
那么,一個好的推薦系統需要滿足什么目標呢?
個性化推薦系統必須能夠基于用戶之前的口味和喜好提供相關的精確的推薦,而且這種口味和喜歡的收集必須盡量少的需要用戶的勞動。推薦的結果必須能夠實時計算,這樣才能夠在用戶離開網站前之前獲得推薦的內容,并且及時的對推薦結果作出反饋。實時性也是推薦系統與通常的數據挖掘技術顯著不同的一個特點。
?
一個完整的推薦系統由三部分構成:行為記錄模塊、模型分析模塊和推薦模塊。行為記錄模塊負責記錄能夠體現用戶喜好的行為,比如購買、下載、評分等。這部分看起來簡單,其實需要非常仔細的設計。比如說購買和評分這兩種行為表達潛在的喜好程度就不盡相同完善的行為記錄需要能夠綜合多種不同的用戶行為,處理不同行為的累加。模型分析模塊的功能則實現了對用戶行為記錄的分析,采用不同算法建立起模型描述用戶的喜好信息。最后,通過推薦模塊,實時的從內容集篩選出目標用戶可能會感興趣的內容推薦給用戶。因此,除了推薦系統本身,為了實現推薦,還需要一個可供推薦的內容集。比如,對于音樂推薦系統來說,一個音樂庫就是這樣的內容集。我們對內容集本身需要提供的信息要求非常低,在經典的協同過濾算法下,內容集甚至只需要提供ID就足夠。而對于基于內容的推薦系統來說,由于往往需要對內容進行特征抽取和索引,我們就會需要提供更多的領域知識和內容屬性。這種情況下,還是拿音樂舉例,歌手、流派之類的屬性和音頻信息就成為必需的內容集信息。

迄今為止在個性化推薦系統中,協同過濾(Collaborative Filtering)技術是應用最成功的技術。目前國內外互聯網上有許多大型網站已經應用這項技術為用戶更加智能的推薦內容。如果你想要研究協同過濾,一定不能錯過MovieLens(http://movielens.umn.edu/)。它是協同過濾最著名的研究項目之一。
?
第一代的協同過濾技術,又被稱為基于用戶(User-based)的協同過濾。基于用戶的協同過濾,基本原理是基于用戶行為選擇的相關性。用戶的行為選擇這里指的是下載、購買、評價等等能夠顯式或者隱式體現出用戶喜好的行為。在一個典型的基于協同過濾技術的推薦系統中,輸入數據通常可以表述為一個m×n 的用戶內容矩陣R,m是用戶數,n是內容數。矩陣的值與內容的類型有關,通常由行為記錄模塊決定。如果內容是網上書店中的書,則矩陣的值可以表示用戶購買與否,例如1表示購買,0表示沒有購買;或者表示用戶對它的評價有多高,這樣的評價值就可以有幾個等級,比如常見的1~5級評價制。
?
基于用戶的協同過濾,通過比較目標用戶的一系列行為選擇和其他用戶之間的相似性,來識別出一組相互具有類似喜好的用戶,又可以稱為“同好”。一旦系統能夠識別一個用戶的同好用戶,就能夠將他們最感興趣的內容作為當前用戶的推薦結果推薦給這個用戶。也就是說,以前的行為選擇與你相似的用戶,在以后的行為中很可能也會和你相似。因此將這些用戶做為基準來向你推薦內容。
?
協同過濾的核心問題是尋找與目標用戶興趣相近的一組用戶。這種相似用戶通常被稱為最近鄰居(Nearest Neighbor)。用戶之間的相似度是通過比較兩個用戶的行為選擇矢量得到的。目前,比較行為選擇矢量的相似度計算方法有許多種,比較經典的算法包括泊松相關系數(Person Correlation Coefficient)和余弦相似性(Cosine-based Similarity)。
?
“最近鄰居”產生后,我們就能夠計算得到用戶最可能感興趣的內容集(也叫做TopN推薦集)。為了得到推薦集,分別統計“最近鄰居”中的用戶對不同內容的興趣度,取其中排在最前面的內容作為推薦集。下面是一個簡化的示例:假如用戶張三有兩個同好:李四和王五。
?
張三喜歡看電影A;
李四喜歡看電影A,B,C和D;
王五喜歡看電影A,B,D,E和F;
?
這樣,推薦系統就能夠過濾出相似用戶都喜歡的電影B和D作為張三最可能也會喜歡的電影推薦給張三。
?
基于用戶的協同過濾技術在個性化推薦系統中獲得了極大的成功,但它有自身的局限性。推薦集的產生方式意味著一個內容只有已經被用戶選擇(購買)后才有機會被推薦給其他用戶。對于一個網上書店來說,新上架的書因為還沒有被相當數量的用戶購買或者評價的記錄,便很少有機會被用戶的“最近鄰居”篩選進入推薦集。這個問題,也被稱之為協同過濾的“冷啟動”問題。
?
此外,因為計算用戶的相似度時,是通過將目標用戶的歷史行為記錄與其他每一個用戶的記錄相比較得出的,所以對于一個現實的推薦系統來說,擴展性將成為非常嚴重的問題。設想一下,對于一個擁有上百萬用戶的網站來說,每計算一個用戶都將涉及到上百萬次的比較,更不要說其中會帶來的大量數據庫IO操作的開銷。
?
于是第二代基于內容項(Item-based)的協同過濾技術就產生了。與基于用戶的技術不同的是,這種方法比較的是內容項與內容項之間的相似度。Item-based 方法同樣需要進行三個步驟獲得推薦:1)得到內容項(Item)的歷史評分數據;2)針對內容項進行內容項之間的相似度計算,找到目標內容項的“最近鄰居”;3)產生推薦。這里內容項之間的相似度是通過比較兩個內容項上的用戶行為選擇矢量得到的。舉個例子,假設用戶和內容項如下:
?
?
電影A
電影B
電影C
電影D
張三
喜歡
?
?
?
李四
喜歡
喜歡
喜歡
喜歡
王五
不喜歡
?
不喜歡
不喜歡
趙六
喜歡
喜歡
?
喜歡
?
可以看出,電影A與D是最相似的。因為張三喜歡A,所以電影D就可以推薦給張三。
?
和基于用戶的推薦系統相比,基于內容項的推薦系統最大的改進是更具有擴展性。基于內容項的方法通過計算內容項之間的相似性來代替用戶之間的相似性。對于通常的互聯網應用來說,提供的內容項數量相對較為穩定。比如一個大型網上書店,可能出售的書籍數量也就在幾十萬上下,而用戶數量就可能達到幾百萬。所以,比起用戶,內容項之間的相似性計算需要的計算量要少很多,從而大大降低了在線計算量,提高系統性能。基于內容項的推薦系統應用最為成功的是Amazon。Amazon為此還申請了一項專利叫做”Collaborative recommendations using item-to-item similarity mappings”[1]。當然,在降低了計算量的同時,完全基于內容項的推薦技術也在推薦的準確度上做了小小的犧牲。大多數情況下,基于用戶的推薦技術表現要略好于基于內容項的方法。這是因為基于內容的方法忽略了相似用戶之間的組群特征。
?
不論是第一代的基于用戶方法,還是第二代的基于內容項方法,都不可避免的遇到數據稀疏的問題。在任何一個網站中,用戶的評分記錄或者購買記錄,相對整個可供選擇的內容集來說,都是很小的一部分。所以在許多推薦系統中,每個用戶涉及的數據量相當有限,在一些大的系統如Amazon中,用戶最多不過就評價過上百萬本書的1%,造成評估數據相當稀疏。當用戶評價過的內容之間找不到交集時,就難以判斷用戶的口味是否相似,難以找到相似用戶集,導致推薦效果大大降低。為了解決用戶數據的稀疏問題,最方便的辦法就是將用戶對沒有選擇過的內容項的評分設為一個固定的缺省值,例如用戶的平均評分。針對如何預測遺漏的評分業內又提出了很多種方法,不過一般來說采用最簡單的改進方法就可以有效地提高協同過濾推薦系統的準確度。
?
另外一方面,即便采用了基于內容項的方法,在數據量巨大的時候,計算復雜度仍然成為性能瓶頸。為了進一步解決協同過濾技術的擴展性能問題,目前比較有效的辦法是在用戶評分數據上做一次聚類分析(clustering)。聚類技術首先將具有相似興趣愛好的用戶分配到相同的分類中。聚類產生之后,它或者將“最近鄰居”搜索對象限制在最相近的聚類中,根據類中其他用戶的評價預測目標用戶的評價,或者用聚類的中心作為近似提取推薦結果。由于用戶之間的分類相對變化比較小,因此聚類過程往往可以離線進行,而無需實時計算,這樣就大大降低了實時推薦的計算壓力,提高推薦系統的速度。一般來說,聚類將用戶分為多少個類,推薦系統的整體速度就能夠提高多少倍。具體選擇什么樣的聚類算法,又會因應用領域和數據的分布特性而不同。如果聚類算法選擇不當,反而會降低推薦的準確性。近年來,推薦系統的算法技術的發展也有了一些新的方向,比如SlopeOne,SVD等方法,就不一一列舉了。
?
在我看來,一個商用推薦系統的尤其關鍵之處在于對海量用戶數據的處理。因為推薦系統是數據優先,數據的積累越多對推薦的精度就越有好處。而當用戶的行為數據真正積累到上百萬甚至上億時,如何在合理時間內得出有效的推薦,就是對推薦技術最大的考驗。除此之外,一個優秀的推薦系統需要能夠結合內容相似與用戶行為相。傳統的協同過濾方法是忽略內容本身的屬性的,這一方面固然是對數據要求少的優點,但另一方面也帶來了難以避免的“冷啟動”問題。其實,隨著標簽系統在互聯網上的廣泛應用,標簽本身就不失為是一種很好的內容屬性。如何利用也是值得大家探討的。充分利用到內容本身的屬性,將不同的相似性結合起來,這會給基于協同過濾的推薦技術帶來新的動力。最后一點,設計良好的推薦技術要能夠從用戶對推薦內容的反饋中自行調整和學習。因為實際上每個用戶對于推薦的內容都有不同的要求,比如有的用戶可能偏好比較熱門的內容,有的用戶更愿意發現冷門的內容。針對不同用戶的反饋來不斷學習每個用戶的特征,才能夠避免所采用算法本身先天的偏差,獲得較為理想的效果。


禮物 2013-03-04 16:39 發表評論
]]>
探索推薦引擎內部的秘密,第 1 部分: 推薦引擎初探http://www.ymeg.top/libin2722/articles/396035.html禮物禮物Mon, 04 Mar 2013 06:30:00 GMThttp://www.ymeg.top/libin2722/articles/396035.htmlhttp://www.ymeg.top/libin2722/comments/396035.htmlhttp://www.ymeg.top/libin2722/articles/396035.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/396035.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/396035.html

簡介:?隨著 Web 技術的發展,使得內容的創建和分享變得越來越容易。每天都有大量的圖片、博客、視頻發布到網上。信息的極度爆炸使得人們找到他們需要的信息將變得越來越難。傳統的搜索技術是一個相對簡單的幫助人們找到信息的工具,也廣泛的被人們所使用,但搜索引擎并不能完全滿足用戶對信息發現的需求,原因一是用戶很難用恰當的關鍵詞描述自己的需求,二是基于關鍵詞的信息檢索在很多情況下是不夠的。而推薦引擎的出現,使用戶獲取信息的方式從簡單的目標明確的數據的搜索轉換到更高級更符合人們使用習慣的上下文信息更豐富的信息發現。

發布日期:?2011 年 3 月 16 日?
級別:?高級?
訪問情況 :?65031 次瀏覽?
評論:?11?(查看?|?添加評論?- 登錄)

平均分 5 星 共 236 個評分 ?平均分 (236個評分)
為本文評分

“探索推薦引擎內部的秘密”系列將帶領讀者從淺入深的學習探索推薦引擎的機制,實現方法,其中還涉及一些基本的優化方法,例如聚類和分類的應用。同時在理論講解的基礎上,還會結合 Apache Mahout 介紹如何在大規模數據上實現各種推薦策略,進行策略優化,構建高效的推薦引擎的方法。本文作為這個系列的第一篇文章,將深入介紹推薦引擎的工作原理,和其中涉及的各種推薦機制,以及它們各自的優缺點和適用場景,幫助用戶清楚的了解和快速構建適合自己的推薦引擎。

信息發現

如今已經進入了一個數據爆炸的時代,隨著 Web 2.0 的發展, Web 已經變成數據分享的平臺,那么,如何讓人們在海量的數據中想要找到他們需要的信息將變得越來越難。

在這樣的情形下,搜索引擎(Google,Bing,百度等等)成為大家快速找到目標信息的最好途徑。在用戶對自己需求相對明確的時候,用搜索引擎很方便的通過關鍵字搜索很快的找到自己需要的信息。但搜索引擎并不能完全滿足用戶對信息發現的需求,那是因為在很多情況下,用戶其實并不明確自己的需要,或者他們的需求很難用簡單的關鍵字來表述。又或者他們需要更加符合他們個人口味和喜好的結果,因此出現了推薦系統,與搜索引擎對應,大家也習慣稱它為推薦引擎。

隨著推薦引擎的出現,用戶獲取信息的方式從簡單的目標明確的數據的搜索轉換到更高級更符合人們使用習慣的信息發現。

如今,隨著推薦技術的不斷發展,推薦引擎已經在電子商務 (E-commerce,例如 Amazon,當當網 ) 和一些基于 social 的社會化站點 ( 包括音樂,電影和圖書分享,例如豆瓣,Mtime 等 ) 都取得很大的成功。這也進一步的說明了,Web2.0 環境下,在面對海量的數據,用戶需要這種更加智能的,更加了解他們需求,口味和喜好的信息發現機制。

推薦引擎

前面介紹了推薦引擎對于現在的 Web2.0 站點的重要意義,這一章我們將講講推薦引擎到底是怎么工作的。推薦引擎利用特殊的信息過濾技術,將不同的物品或內容推薦給可能對它們感興趣的用戶。


圖 1. 推薦引擎工作原理圖
圖 1. 推薦引擎工作原理圖 ?

圖 1 給出了推薦引擎的工作原理圖,這里先將推薦引擎看作黑盒,它接受的輸入是推薦的數據源,一般情況下,推薦引擎所需要的數據源包括:

  • 要推薦物品或內容的元數據,例如關鍵字,基因描述等;
  • 系統用戶的基本信息,例如性別,年齡等
  • 用戶對物品或者信息的偏好,根據應用本身的不同,可能包括用戶對物品的評分,用戶查看物品的記錄,用戶的購買記錄等。其實這些用戶的偏好信息可以分為兩類:
  • 顯式的用戶反饋:這類是用戶在網站上自然瀏覽或者使用網站以外,顯式的提供反饋信息,例如用戶對物品的評分,或者對物品的評論。
  • 隱式的用戶反饋:這類是用戶在使用網站是產生的數據,隱式的反應了用戶對物品的喜好,例如用戶購買了某物品,用戶查看了某物品的信息等等。

顯式的用戶反饋能準確的反應用戶對物品的真實喜好,但需要用戶付出額外的代價,而隱式的用戶行為,通過一些分析和處理,也能反映用戶的喜好,只是數據不是很精確,有些行為的分析存在較大的噪音。但只要選擇正確的行為特征,隱式的用戶反饋也能得到很好的效果,只是行為特征的選擇可能在不同的應用中有很大的不同,例如在電子商務的網站上,購買行為其實就是一個能很好表現用戶喜好的隱式反饋。

推薦引擎根據不同的推薦機制可能用到數據源中的一部分,然后根據這些數據,分析出一定的規則或者直接對用戶對其他物品的喜好進行預測計算。這樣推薦引擎可以在用戶進入的時候給他推薦他可能感興趣的物品。

推薦引擎的分類

推薦引擎的分類可以根據很多指標,下面我們一一介紹一下:

  1. 推薦引擎是不是為不同的用戶推薦不同的數據

    根據這個指標,推薦引擎可以分為基于大眾行為的推薦引擎和個性化推薦引擎

    • 根據大眾行為的推薦引擎,對每個用戶都給出同樣的推薦,這些推薦可以是靜態的由系統管理員人工設定的,或者基于系統所有用戶的反饋統計計算出的當下比較流行的物品。
    • 個性化推薦引擎,對不同的用戶,根據他們的口味和喜好給出更加精確的推薦,這時,系統需要了解需推薦內容和用戶的特質,或者基于社會化網絡,通過找到與當前用戶相同喜好的用戶,實現推薦。

    這是一個最基本的推薦引擎分類,其實大部分人們討論的推薦引擎都是將個性化的推薦引擎,因為從根本上說,只有個性化的推薦引擎才是更加智能的信息發現過程。

  2. 根據推薦引擎的數據源

    其實這里講的是如何發現數據的相關性,因為大部分推薦引擎的工作原理還是基于物品或者用戶的相似集進行推薦。那么參考圖 1 給出的推薦系統原理圖,根據不同的數據源發現數據相關性的方法可以分為以下幾種:

    • 根據系統用戶的基本信息發現用戶的相關程度,這種被稱為基于人口統計學的推薦(Demographic-based Recommendation)
    • 根據推薦物品或內容的元數據,發現物品或者內容的相關性,這種被稱為基于內容的推薦(Content-based Recommendation)
    • 根據用戶對物品或者信息的偏好,發現物品或者內容本身的相關性,或者是發現用戶的相關性,這種被稱為基于協同過濾的推薦(Collaborative Filtering-based Recommendation)。
  3. 根據推薦模型的建立方式

    可以想象在海量物品和用戶的系統中,推薦引擎的計算量是相當大的,要實現實時的推薦務必需要建立一個推薦模型,關于推薦模型的建立方式可以分為以下幾種:

    • 基于物品和用戶本身的,這種推薦引擎將每個用戶和每個物品都當作獨立的實體,預測每個用戶對于每個物品的喜好程度,這些信息往往是用一個二維矩陣描述的。由于用戶感興趣的物品遠遠小于總物品的數目,這樣的模型導致大量的數據空置,即我們得到的二維矩陣往往是一個很大的稀疏矩陣。同時為了減小計算量,我們可以對物品和用戶進行聚類, 然后記錄和計算一類用戶對一類物品的喜好程度,但這樣的模型又會在推薦的準確性上有損失。
    • 基于關聯規則的推薦(Rule-based Recommendation):關聯規則的挖掘已經是數據挖掘中的一個經典的問題,主要是挖掘一些數據的依賴關系,典型的場景就是“購物籃問題”,通過關聯規則的挖掘,我們可以找到哪些物品經常被同時購買,或者用戶購買了一些物品后通常會購買哪些其他的物品,當我們挖掘出這些關聯規則之后,我們可以基于這些規則給用戶進行推薦。
    • 基于模型的推薦(Model-based Recommendation):這是一個典型的機器學習的問題,可以將已有的用戶喜好信息作為訓練樣本,訓練出一個預測用戶喜好的模型,這樣以后用戶在進入系統,可以基于此模型計算推薦。這種方法的問題在于如何將用戶實時或者近期的喜好信息反饋給訓練好的模型,從而提高推薦的準確度。

其實在現在的推薦系統中,很少有只使用了一個推薦策略的推薦引擎,一般都是在不同的場景下使用不同的推薦策略從而達到最好的推薦效果,例如 Amazon 的推薦,它將基于用戶本身歷史購買數據的推薦,和基于用戶當前瀏覽的物品的推薦,以及基于大眾喜好的當下比較流行的物品都在不同的區域推薦給用戶,讓用戶可以從全方位的推薦中找到自己真正感興趣的物品。

深入推薦機制

這一章的篇幅,將詳細介紹各個推薦機制的工作原理,它們的優缺點以及應用場景。

基于人口統計學的推薦

基于人口統計學的推薦機制(Demographic-based Recommendation)是一種最易于實現的推薦方法,它只是簡單的根據系統用戶的基本信息發現用戶的相關程度,然后將相似用戶喜愛的其他物品推薦給當前用戶,圖 2 給出了這種推薦的工作原理。


圖 2. 基于人口統計學的推薦機制的工作原理
圖 2. 基于人口統計學的推薦機制的工作原理 ?

從圖中可以很清楚的看到,首先,系統對每個用戶都有一個用戶 Profile 的建模,其中包括用戶的基本信息,例如用戶的年齡,性別等等;然后,系統會根據用戶的 Profile 計算用戶的相似度,可以看到用戶 A 的 Profile 和用戶 C 一樣,那么系統會認為用戶 A 和 C 是相似用戶,在推薦引擎中,可以稱他們是“鄰居”;最后,基于“鄰居”用戶群的喜好推薦給當前用戶一些物品,圖中將用戶 A 喜歡的物品 A 推薦給用戶 C。

這種基于人口統計學的推薦機制的好處在于:

  1. 因為不使用當前用戶對物品的喜好歷史數據,所以對于新用戶來講沒有“冷啟動(Cold Start)”的問題。
  2. 這個方法不依賴于物品本身的數據,所以這個方法在不同物品的領域都可以使用,它是領域獨立的(domain-independent)。

那么這個方法的缺點和問題是什么呢?這種基于用戶的基本信息對用戶進行分類的方法過于粗糙,尤其是對品味要求較高的領域,比如圖書,電影和音樂等領域,無法得到很好的推薦效果。可能在一些電子商務的網站中,這個方法可以給出一些簡單的推薦。另外一個局限是,這個方法可能涉及到一些與信息發現問題本身無關卻比較敏感的信息,比如用戶的年齡等,這些用戶信息不是很好獲取。

基于內容的推薦

基于內容的推薦是在推薦引擎出現之初應用最為廣泛的推薦機制,它的核心思想是根據推薦物品或內容的元數據,發現物品或者內容的相關性,然后基于用戶以往的喜好記錄,推薦給用戶相似的物品。圖 3 給出了基于內容推薦的基本原理。


圖 3. 基于內容推薦機制的基本原理
圖 3. 基于內容推薦機制的基本原理 ?

圖 3 中給出了基于內容推薦的一個典型的例子,電影推薦系統,首先我們需要對電影的元數據有一個建模,這里只簡單的描述了一下電影的類型;然后通過電影的元數據發現電影間的相似度,因為類型都是“愛情,浪漫”電影 A 和 C 被認為是相似的電影(當然,只根據類型是不夠的,要得到更好的推薦,我們還可以考慮電影的導演,演員等等);最后實現推薦,對于用戶 A,他喜歡看電影 A,那么系統就可以給他推薦類似的電影 C。

這種基于內容的推薦機制的好處在于它能很好的建模用戶的口味,能提供更加精確的推薦。但它也存在以下幾個問題:

  1. 需要對物品進行分析和建模,推薦的質量依賴于對物品模型的完整和全面程度。在現在的應用中我們可以觀察到關鍵詞和標簽(Tag)被認為是描述物品元數據的一種簡單有效的方法。
  2. 物品相似度的分析僅僅依賴于物品本身的特征,這里沒有考慮人對物品的態度。
  3. 因為需要基于用戶以往的喜好歷史做出推薦,所以對于新用戶有“冷啟動”的問題。

雖然這個方法有很多不足和問題,但他還是成功的應用在一些電影,音樂,圖書的社交站點,有些站點還請專業的人員對物品進行基因編碼,比如潘多拉,在一份報告中說道,在潘多拉的推薦引擎中,每首歌有超過 100 個元數據特征,包括歌曲的風格,年份,演唱者等等。

基于協同過濾的推薦

隨著 Web2.0 的發展,Web 站點更加提倡用戶參與和用戶貢獻,因此基于協同過濾的推薦機制因運而生。它的原理很簡單,就是根據用戶對物品或者信息的偏好,發現物品或者內容本身的相關性,或者是發現用戶的相關性,然后再基于這些關聯性進行推薦。基于協同過濾的推薦可以分為三個子類:基于用戶的推薦(User-based Recommendation),基于項目的推薦(Item-based Recommendation)和基于模型的推薦(Model-based Recommendation)。下面我們一個一個詳細的介紹著三種協同過濾的推薦機制。

基于用戶的協同過濾推薦

基于用戶的協同過濾推薦的基本原理是,根據所有用戶對物品或者信息的偏好,發現與當前用戶口味和偏好相似的“鄰居”用戶群,在一般的應用中是采用計算“K- 鄰居”的算法;然后,基于這 K 個鄰居的歷史偏好信息,為當前用戶進行推薦。下圖 4 給出了原理圖。


圖 4. 基于用戶的協同過濾推薦機制的基本原理
圖 4. 基于用戶的協同過濾推薦機制的基本原理 ?

上圖示意出基于用戶的協同過濾推薦機制的基本原理,假設用戶 A 喜歡物品 A,物品 C,用戶 B 喜歡物品 B,用戶 C 喜歡物品 A ,物品 C 和物品 D;從這些用戶的歷史喜好信息中,我們可以發現用戶 A 和用戶 C 的口味和偏好是比較類似的,同時用戶 C 還喜歡物品 D,那么我們可以推斷用戶 A 可能也喜歡物品 D,因此可以將物品 D 推薦給用戶 A。

基于用戶的協同過濾推薦機制和基于人口統計學的推薦機制都是計算用戶的相似度,并基于“鄰居”用戶群計算推薦,但它們所不同的是如何計算用戶的相似度,基于人口統計學的機制只考慮用戶本身的特征,而基于用戶的協同過濾機制可是在用戶的歷史偏好的數據上計算用戶的相似度,它的基本假設是,喜歡類似物品的用戶可能有相同或者相似的口味和偏好。

基于項目的協同過濾推薦

基于項目的協同過濾推薦的基本原理也是類似的,只是說它使用所有用戶對物品或者信息的偏好,發現物品和物品之間的相似度,然后根據用戶的歷史偏好信息,將類似的物品推薦給用戶,圖 5 很好的詮釋了它的基本原理。

假設用戶 A 喜歡物品 A 和物品 C,用戶 B 喜歡物品 A,物品 B 和物品 C,用戶 C 喜歡物品 A,從這些用戶的歷史喜好可以分析出物品 A 和物品 C 時比較類似的,喜歡物品 A 的人都喜歡物品 C,基于這個數據可以推斷用戶 C 很有可能也喜歡物品 C,所以系統會將物品 C 推薦給用戶 C。

與上面講的類似,基于項目的協同過濾推薦和基于內容的推薦其實都是基于物品相似度預測推薦,只是相似度計算的方法不一樣,前者是從用戶歷史的偏好推斷,而后者是基于物品本身的屬性特征信息。


圖 5. 基于項目的協同過濾推薦機制的基本原理
圖 5. 基于項目的協同過濾推薦機制的基本原理 ?

同時協同過濾,在基于用戶和基于項目兩個策略中應該如何選擇呢?其實基于項目的協同過濾推薦機制是 Amazon 在基于用戶的機制上改良的一種策略,因為在大部分的 Web 站點中,物品的個數是遠遠小于用戶的數量的,而且物品的個數和相似度相對比較穩定,同時基于項目的機制比基于用戶的實時性更好一些。但也不是所有的場景都是這樣的情況,可以設想一下在一些新聞推薦系統中,也許物品,也就是新聞的個數可能大于用戶的個數,而且新聞的更新程度也有很快,所以它的形似度依然不穩定。所以,其實可以看出,推薦策略的選擇其實和具體的應用場景有很大的關系。

基于模型的協同過濾推薦

基于模型的協同過濾推薦就是基于樣本的用戶喜好信息,訓練一個推薦模型,然后根據實時的用戶喜好的信息進行預測,計算推薦。

基于協同過濾的推薦機制是現今應用最為廣泛的推薦機制,它有以下幾個顯著的優點:

  1. 它不需要對物品或者用戶進行嚴格的建模,而且不要求物品的描述是機器可理解的,所以這種方法也是領域無關的。
  2. 這種方法計算出來的推薦是開放的,可以共用他人的經驗,很好的支持用戶發現潛在的興趣偏好

而它也存在以下幾個問題:

  1. 方法的核心是基于歷史數據,所以對新物品和新用戶都有“冷啟動”的問題。
  2. 推薦的效果依賴于用戶歷史偏好數據的多少和準確性。
  3. 在大部分的實現中,用戶歷史偏好是用稀疏矩陣進行存儲的,而稀疏矩陣上的計算有些明顯的問題,包括可能少部分人的錯誤偏好會對推薦的準確度有很大的影響等等。
  4. 對于一些特殊品味的用戶不能給予很好的推薦。
  5. 由于以歷史數據為基礎,抓取和建模用戶的偏好后,很難修改或者根據用戶的使用演變,從而導致這個方法不夠靈活。

混合的推薦機制

在現行的 Web 站點上的推薦往往都不是單純只采用了某一種推薦的機制和策略,他們往往是將多個方法混合在一起,從而達到更好的推薦效果。關于如何組合各個推薦機制,這里講幾種比較流行的組合方法。

  1. 加權的混合(Weighted Hybridization): 用線性公式(linear formula)將幾種不同的推薦按照一定權重組合起來,具體權重的值需要在測試數據集上反復實驗,從而達到最好的推薦效果。
  2. 切換的混合(Switching Hybridization):前面也講到,其實對于不同的情況(數據量,系統運行狀況,用戶和物品的數目等),推薦策略可能有很大的不同,那么切換的混合方式,就是允許在不同的情況下,選擇最為合適的推薦機制計算推薦。
  3. 分區的混合(Mixed Hybridization):采用多種推薦機制,并將不同的推薦結果分不同的區顯示給用戶。其實,Amazon,當當網等很多電子商務網站都是采用這樣的方式,用戶可以得到很全面的推薦,也更容易找到他們想要的東西。
  4. 分層的混合(Meta-Level Hybridization): 采用多種推薦機制,并將一個推薦機制的結果作為另一個的輸入,從而綜合各個推薦機制的優缺點,得到更加準確的推薦。

推薦引擎的應用

介紹完推薦引擎的基本原理,基本推薦機制,下面簡要分析幾個有代表性的推薦引擎的應用,這里選擇兩個領域:Amazon 作為電子商務的代表,豆瓣作為社交網絡的代表。

推薦在電子商務中的應用 – Amazon

Amazon 作為推薦引擎的鼻祖,它已經將推薦的思想滲透在應用的各個角落。Amazon 推薦的核心是通過數據挖掘算法和比較用戶的消費偏好于其他用戶進行對比,借以預測用戶可能感興趣的商品。對應于上面介紹的各種推薦機制,Amazon 采用的是分區的混合的機制,并將不同的推薦結果分不同的區顯示給用戶,圖 6 和圖 7 展示了用戶在 Amazon 上能得到的推薦。


圖 6. Amazon 的推薦機制 - 首頁
圖 6. Amazon 的推薦機制 - 首頁 ?

圖 7. Amazon 的推薦機制 - 瀏覽物品
圖 7. Amazon 的推薦機制 - 瀏覽物品 ?

Amazon 利用可以記錄的所有用戶在站點上的行為,根據不同數據的特點對它們進行處理,并分成不同區為用戶推送推薦:

  • 今日推薦 (Today's Recommendation For You): 通常是根據用戶的近期的歷史購買或者查看記錄,并結合時下流行的物品給出一個折中的推薦。
  • 新產品的推薦 (New For You): 采用了基于內容的推薦機制 (Content-based Recommendation),將一些新到物品推薦給用戶。在方法選擇上由于新物品沒有大量的用戶喜好信息,所以基于內容的推薦能很好的解決這個“冷啟動”的問題。
  • 捆綁銷售 (Frequently Bought Together): 采用數據挖掘技術對用戶的購買行為進行分析,找到經常被一起或同一個人購買的物品集,進行捆綁銷售,這是一種典型的基于項目的協同過濾推薦機制。
  • 別人購買 / 瀏覽的商品 (Customers Who Bought/See This Item Also Bought/See): 這也是一個典型的基于項目的協同過濾推薦的應用,通過社會化機制用戶能更快更方便的找到自己感興趣的物品。

值得一提的是,Amazon 在做推薦時,設計和用戶體驗也做得特別獨到:

Amazon 利用有它大量歷史數據的優勢,量化推薦原因。

  • 基于社會化的推薦,Amazon 會給你事實的數據,讓用戶信服,例如:購買此物品的用戶百分之多少也購買了那個物品;
  • 基于物品本身的推薦,Amazon 也會列出推薦的理由,例如:因為你的購物框中有 ***,或者因為你購買過 ***,所以給你推薦類似的 ***。

另外,Amazon 很多推薦是基于用戶的 profile 計算出來的,用戶的 profile 中記錄了用戶在 Amazon 上的行為,包括看了那些物品,買了那些物品,收藏夾和 wish list 里的物品等等,當然 Amazon 里還集成了評分等其他的用戶反饋的方式,它們都是 profile 的一部分,同時,Amazon 提供了讓用戶自主管理自己 profile 的功能,通過這種方式用戶可以更明確的告訴推薦引擎他的品味和意圖是什么。

推薦在社交網站中的應用 – 豆瓣

豆瓣是國內做的比較成功的社交網站,它以圖書,電影,音樂和同城活動為中心,形成一個多元化的社交網絡平臺,自然推薦的功能是必不可少的,下面我們看看豆瓣是如何推薦的。


圖 8 . 豆瓣的推薦機制 - 豆瓣電影
圖 8 . 豆瓣的推薦機制 - 豆瓣電影 ?

當你在豆瓣電影中將一些你看過的或是感興趣的電影加入你看過和想看的列表里,并為它們做相應的評分,這時豆瓣的推薦引擎已經拿到你的一些偏好信息,那么它將給你展示如圖 8 的電影推薦。


圖 9 . 豆瓣的推薦機制 - 基于用戶品味的推薦
圖 9 . 豆瓣的推薦機制 - 基于用戶品味的推薦 ?

豆瓣的推薦是通過“豆瓣猜”,為了讓用戶清楚這些推薦是如何來的,豆瓣還給出了“豆瓣猜”的一個簡要的介紹。

你的個人推薦是根據你的收藏和評價自動得出的,每個人的推薦清單都不同。你的收藏和評價越多,豆瓣給你的推薦會越準確和豐富。
每天推薦的內容可能會有變化。隨著豆瓣的長大,給你推薦的內容也會越來越準。

這一點讓我們可以清晰明了的知道,豆瓣必然是基于社會化的協同過濾的推薦,這樣用戶越多,用戶的反饋越多,那么推薦的效果會越來越準確。

相對于 Amazon 的用戶行為模型,豆瓣電影的模型更加簡單,就是“看過”和“想看”,這也讓他們的推薦更加專注于用戶的品味,畢竟買東西和看電影的動機還是有很大不同的。

另外,豆瓣也有基于物品本身的推薦,當你查看一些電影的詳細信息的時候,他會給你推薦出“喜歡這個電影的人也喜歡的電影”, 如圖 10,這是一個基于協同過濾的應用。


圖 10 . 豆瓣的推薦機制 - 基于電影本身的推薦
圖 10 . 豆瓣的推薦機制 - 基于電影本身的推薦 ?

總結

在網絡數據爆炸的年代,如何讓用戶更快的找到想要的數據,如何讓用戶發現自己潛在的興趣和需求,無論是對于電子商務還是社會網絡的應用都是至關重要的。推薦引擎的出現,使得這個問題越來越被大家關注。但對大多數人來講,也許還在驚嘆它為什么總是能猜到你到底想要些什么。推薦引擎的魔力在于你不清楚在這個推薦背后,引擎到底記錄和推理了些什么。

通過這篇綜述性的文章,你可以了解,其實推薦引擎只是默默的記錄和觀察你的一舉一動,然后再借由所有用戶產生的海量數據分析和發現其中的規律,進而慢慢的了解你,你的需求,你的習慣,并默默的無聲息的幫助你快速的解決你的問題,找到你想要的東西。

其實,回頭想想,很多時候,推薦引擎比你更了解你自己。

通過第一篇文章,相信大家對推薦引擎有一個清晰的第一印象,本系列的下一篇文章將深入介紹基于協同過濾的推薦策略。在現今的推薦技術和算法中,最被大家廣泛認可和采用的就是基于協同過濾的推薦方法。它以其方法模型簡單,數據依賴性低,數據方便采集,推薦效果較優等多個優點成為大眾眼里的推薦算法“No.1”。本文將帶你深入了解協同過濾的秘密,并給出基于 Apache Mahout 的協同過濾算法的高效實現。Apache Mahout 是 ASF 的一個較新的開源項目,它源于 Lucene,構建在 Hadoop 之上,關注海量數據上的機器學習經典算法的高效實現。

感謝大家對本系列的關注和支持。

聲明

本人所發表的內容僅為個人觀點,不代表 IBM 公司立場、戰略和觀點。


參考資料

學習

討論



禮物 2013-03-04 14:30 發表評論
]]>
一個類引發的回憶http://www.ymeg.top/libin2722/archive/2013/03/01/395890.html禮物禮物Fri, 01 Mar 2013 01:52:00 GMThttp://www.ymeg.top/libin2722/archive/2013/03/01/395890.htmlhttp://www.ymeg.top/libin2722/comments/395890.htmlhttp://www.ymeg.top/libin2722/archive/2013/03/01/395890.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/395890.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/395890.html

package?com.itgenius.netoa.admin;

import?java.sql.*;
import?javax.sql.*;
import?javax.naming.Context;
import?javax.naming.InitialContext;
import?javax.naming.*;

import?java.util.List;

public?class?EJBDAO?implements?ApplicationUtil?{
??
private??Connection?conn=null;
??
private?Statement?st=null;
??
private?PreparedStatement?pst=null;
??
private?CallableStatement?cs=null;
??
private?ResultSet?rs=null;
??
private?DataSource?ds=null;
??
private?boolean?isCorrect=false;

??
public?EJBDAO()?{
??}
??
public?void?getConnection(){
????
try{
??????Context?ctx?
=?new?InitialContext();
??????ds
=(DataSource)ctx.lookup(dsJndi);
??????conn
=ds.getConnection();
????}
catch?(NamingException?ex)?{
??????ex.printStackTrace();
????}
catch(SQLException?e){
??????e.printStackTrace();
????}
??}
??
public?void?getConnection(String?dburl,String?dbdriver,String?dbusername,String?dbpasswd){
??}
??
public?void?getStatement(){
????
try{
??????getConnection();
??????st?
=?conn.createStatement();
????}
catch?(SQLException?ex)?{
??????ex.printStackTrace();
????}
??}
??
//得到預備狀態通道
??public?void?getPStatement(String?sql){
????
try{
??????getConnection();
??????pst?
=?conn.prepareStatement(sql);
????}
catch?(SQLException?ex)?{
????}
??}
??
//執行查詢得到結果集
??public?ResultSet?getResultSet(String?sql){
????
try{
???????getStatement();
???????rs
=st.executeQuery(sql);
????}
catch(SQLException?ex)?{
????}
finally{
???????
return?rs;
????}
??}
??
//給預備狀態通道中的sql的變量付值,然后執行
??public?boolean?executePstatement(List?list){
?????isCorrect
=false;
?????
try{
??????????
for(int?i?=?0;?i?<?list.size();?i++){
????????????pst.setString((i?
+?1),?list.get(i).toString());
??????????}
??????????pst.executeUpdate();
??????????isCorrect
=true;
??????}
catch?(SQLException?ex)?{
??????}
finally{
?????????
return?isCorrect;
??????}
??}
??
//執行新增、修改、刪除
??public?boolean?doUpdate(String?sql){
????isCorrect
=false;
????
try{
??????getStatement();
??????st.executeUpdate(sql);
??????isCorrect
=true;
????}
catch?(SQLException?ex){
???????ex.printStackTrace();
????}
finally{
??????
return?isCorrect;
????}
??}
??
//執行存儲過程
??public?boolean?doProcure(String?pname,List?list){
??????isCorrect
=false;
????
try{
????????getConnection();
???????cs
=conn.prepareCall("{call?"+pname+"}");
???????
for(int?i?=?0;?i?<?list.size();?i++)
???????{
???????????cs.setString((i?
+?1),?list.get(i).toString());
???????}
???????cs.execute();
???????isCorrect
=true;
????}
catch?(SQLException?ex)?{
????}
finally{
??????
return?isCorrect;
????}
??}
??
public?void?addBatch(List?list){
????
try{
??????
for(int?i=0;i<list.size();i++){
????????st.addBatch(list.get(i).toString());
??????}
????}
catch(Exception?e){
????}
??}
??
public?boolean?ExecuteBatch(){
?????isCorrect
=false;
?????
try{
???????st.executeBatch();
???????isCorrect
=true;
?????}
catch(Exception?e){
????????e.printStackTrace();
?????}
finally{
????????Close();
????????
return?isCorrect;
?????}
??}
??
//關閉連接
??public?void?Close(){
??????
try{
????????
if(rs!=null)
????????{
??????????rs.close();
????????}
????????
if(st!=null){
??????????st.close();
????????}
????????
if(pst!=null)
????????{
??????????pst.close();
????????}
????????
if(cs!=null)
??????????cs.close();
????????
if(conn!=null)
????????conn.close();
??????}
catch?(SQLException?ex)?{
??????}
??}

}



禮物 2013-03-01 09:52 發表評論
]]>
配置_Druid和Spring關聯監控配置http://www.ymeg.top/libin2722/articles/395482.html禮物禮物Wed, 20 Feb 2013 09:40:00 GMThttp://www.ymeg.top/libin2722/articles/395482.htmlhttp://www.ymeg.top/libin2722/comments/395482.htmlhttp://www.ymeg.top/libin2722/articles/395482.html#Feedback2http://www.ymeg.top/libin2722/comments/commentRss/395482.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/395482.htmlDruid提供了Spring和Jdbc的關聯監控。

配置spring

com.alibaba.druid.support.spring.stat.DruidStatInterceptor是一個標準的Spring MethodInterceptor。可以靈活進行AOP配置。

Spring AOP的配置文檔:?http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop-api.html

按類型攔截配置

				  <bean id="druid-stat-interceptor"
    class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

  <bean id="druid-type-proxyCreator" class="com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator">
    <!-- 所有ABCInterface的派生類被攔截監控  -->
    <property name="targetBeanType" value="xxxx.ABCInterface" />
    <property name="interceptorNames">
        <list>
            <value>druid-stat-interceptor</value>
        </list>
    </property>
  </bean>

		

方法名正則匹配攔截配置

				  <bean id="druid-stat-interceptor"
    class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
    scope="prototype">
    <property name="patterns">
        <list>
            <value>com.mycompany.service.*</value>
            <value>com.mycompany.dao.*</value>
        </list>
    </property>
</bean>

<aop:config>
    <aop:advisor advice-ref="druid-stat-interceptor"
        pointcut-ref="druid-stat-pointcut" />
</aop:config>

		

有些情況下,可能你需要配置proxy-target-class,例如:

				<aop:config proxy-target-class="true">
    <aop:advisor advice-ref="druid-stat-interceptor"
        pointcut-ref="druid-stat-pointcut" />
</aop:config>

		

按照BeanId來攔截配置

				  <bean id="druid-stat-interceptor"
    class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

<bean
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="proxyTargetClass" value="true" />
    <property name="beanNames">
        <list>
            <!-- 這里配置需要攔截的bean id列表 -->
            <value>xxx-dao</value>
            <value>xxx-service</value>
        </list>
    </property>
    <property name="interceptorNames">
        <list>
            <value>druid-stat-interceptor</value>
        </list>
    </property>
</bean>
		


禮物 2013-02-20 17:40 發表評論
]]>
AtomicIntegerhttp://www.ymeg.top/libin2722/archive/2013/01/31/394996.html禮物禮物Thu, 31 Jan 2013 09:15:00 GMThttp://www.ymeg.top/libin2722/archive/2013/01/31/394996.htmlhttp://www.ymeg.top/libin2722/comments/394996.htmlhttp://www.ymeg.top/libin2722/archive/2013/01/31/394996.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394996.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394996.htmlAtomicInteger,一個提供原子操作的Integer的類。在Java語言中,++i和i++操作并不是線程安全的,在使用的時候,不可避免的會用到synchronized關鍵字。而AtomicInteger則通過一種線程安全的加減操作接口。

來看AtomicInteger提供的接口。

//獲取當前的值

public final int get()

//取當前的值,并設置新的值

?public final int getAndSet(int newValue)

//獲取當前的值,并自增

?public final int getAndIncrement()

//獲取當前的值,并自減

public final int getAndDecrement()

//獲取當前的值,并加上預期的值

public final int getAndAdd(int delta)

... ...


下面是一個對比測試,我們寫一個synchronized的方法和一個AtomicInteger的方法來進行測試,直觀的感受下性能上的差異

[java] ? view plain copy
  1. package ?zl.study.concurrency;??
  2. import ?java.util.concurrent.atomic.AtomicInteger;??
  3. public ? class ?AtomicIntegerCompareTest?{??
  4. ????private?int?value;??
  5. ??????
  6. ????public?AtomicIntegerCompareTest(int?value){??
  7. ????????this.value?=?value;??
  8. ????}??
  9. ??????
  10. ????public?synchronized?int?increase(){??
  11. ????????return?value++;??
  12. ????}??
  13. ??????
  14. ????public?static?void?main(String?args[]){??
  15. ????????long?start?=?System.currentTimeMillis();??
  16. ??????????
  17. ????????AtomicIntegerCompareTest?test?=?new?AtomicIntegerCompareTest(0);??
  18. ????????for(?int?i=0;i<?1000000;i++){??
  19. ????????????test.increase();??
  20. ????????}??
  21. ????????long?end?=?System.currentTimeMillis();??
  22. ????????System.out.println("time?elapse:"+(end?-start));??
  23. ??????????
  24. ????????long?start1?=?System.currentTimeMillis();??
  25. ??????????
  26. ????????AtomicInteger?atomic?=?new?AtomicInteger(0);??
  27. ??????????
  28. ????????for(?int?i=0;i<?1000000;i++){??
  29. ????????????atomic.incrementAndGet();??
  30. ????????}??
  31. ????????long?end1?=?System.currentTimeMillis();??
  32. ????????System.out.println("time?elapse:"+(end1?-start1)?);??
  33. ??????????
  34. ??????????
  35. ????}??
  36. }??

結果

time elapse:31
time elapse:16
由此不難看出,通過JNI本地的CAS性能遠超synchronized關鍵字

?

Reference

http://stackoverflow.com/questions/2443239/java-atomicinteger-what-are-the-differences-between-compareandset-and-weakcompar



禮物 2013-01-31 17:15 發表評論
]]>
spring通過annotation注冊MBean到JMXhttp://www.ymeg.top/libin2722/articles/394995.html禮物禮物Thu, 31 Jan 2013 09:02:00 GMThttp://www.ymeg.top/libin2722/articles/394995.htmlhttp://www.ymeg.top/libin2722/comments/394995.htmlhttp://www.ymeg.top/libin2722/articles/394995.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394995.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394995.html閱讀全文

禮物 2013-01-31 17:02 發表評論
]]>
BootStrap入門教程 (四)http://www.ymeg.top/libin2722/articles/394967.html禮物禮物Thu, 31 Jan 2013 03:08:00 GMThttp://www.ymeg.top/libin2722/articles/394967.htmlhttp://www.ymeg.top/libin2722/comments/394967.htmlhttp://www.ymeg.top/libin2722/articles/394967.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394967.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394967.html閱讀全文

禮物 2013-01-31 11:08 發表評論
]]>
BootStrap入門教程 (三)http://www.ymeg.top/libin2722/articles/394961.html禮物禮物Thu, 31 Jan 2013 02:16:00 GMThttp://www.ymeg.top/libin2722/articles/394961.htmlhttp://www.ymeg.top/libin2722/comments/394961.htmlhttp://www.ymeg.top/libin2722/articles/394961.html#Feedback2http://www.ymeg.top/libin2722/comments/commentRss/394961.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394961.html閱讀全文

禮物 2013-01-31 10:16 發表評論
]]>
BootStrap入門教程 (二)http://www.ymeg.top/libin2722/articles/394960.html禮物禮物Thu, 31 Jan 2013 02:14:00 GMThttp://www.ymeg.top/libin2722/articles/394960.htmlhttp://www.ymeg.top/libin2722/comments/394960.htmlhttp://www.ymeg.top/libin2722/articles/394960.html#Feedback1http://www.ymeg.top/libin2722/comments/commentRss/394960.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394960.html閱讀全文

禮物 2013-01-31 10:14 發表評論
]]>
BootStrap入門教程 (一)http://www.ymeg.top/libin2722/articles/394959.html禮物禮物Thu, 31 Jan 2013 02:08:00 GMThttp://www.ymeg.top/libin2722/articles/394959.htmlhttp://www.ymeg.top/libin2722/comments/394959.htmlhttp://www.ymeg.top/libin2722/articles/394959.html#Feedback3http://www.ymeg.top/libin2722/comments/commentRss/394959.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394959.html閱讀全文

禮物 2013-01-31 10:08 發表評論
]]>
Linux centos 6.3 Tomcat Installhttp://www.ymeg.top/libin2722/articles/394027.html禮物禮物Wed, 09 Jan 2013 07:01:00 GMThttp://www.ymeg.top/libin2722/articles/394027.htmlhttp://www.ymeg.top/libin2722/comments/394027.htmlhttp://www.ymeg.top/libin2722/articles/394027.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394027.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394027.html
#!/bin/sh
########################################################################################
#
# Install Ejabberd Server
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=apache-tomcat-7.0.34.tar.gz
SOURCE=http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-7/v7.0.34/bin/$TARGET

# Create a build directory
mkdir -p /opt/install/tomcat && cd /opt/install/tomcat

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y apr-devel openssl-devel

# Create a User Group
groupadd tomcat
useradd -r -g tomcat tomcat

# Compile and deploy
mkdir -p /opt/server/web && mv tmp/* /opt/server/web/tomcat && cd /opt/server/web/tomcat/bin
tar -zxvf tomcat-native.tar.gz && cd tomcat-native-1.1.24-src/jni/native/
./configure \
--with-apr=/usr/bin/apr-1-config \
--with-java-home=/opt/environment/java/1.7.0 \
--with-ssl=yes \
--prefix=/opt/server/web/tomcat
make
make install

cd /opt/server/web/tomcat
curl -o conf/server.xml https://raw.github.com/fly2wind/TSShellScript/master/tomcat/conf/server.xml
curl -o conf/tomcat-users.xml https://raw.github.com/fly2wind/TSShellScript/master/tomcat/conf/tomcat-users.xml
curl -o conf/wrapper.conf https://raw.github.com/fly2wind/TSShellScript/master/tomcat/wrapper/wrapper.conf
curl -o lib/wrapper.jar https://raw.github.com/fly2wind/TSShellScript/master/tomcat/wrapper/wrapper.jar
curl -o lib/wrapper.so https://raw.github.com/fly2wind/TSShellScript/master/tomcat/wrapper/libwrapper.so
curl -o bin/tomcat https://raw.github.com/fly2wind/TSShellScript/master/tomcat/wrapper/tomcat

# Postinstallation setup
cd /opt/server/web/tomcat
chown -R tomcat .
chgrp -R tomcat .
chown -R root .
chown -R tomcat conf webapps work temp logs

# Configuration
curl -o /etc/init.d/tomcat https://raw.github.com/fly2wind/TSShellScript/master/tomcat/init/tomcat
chmod a+x /etc/init.d/tomcat

# Additional
chkconfig --add tomcat
chkconfig tomcat on



禮物 2013-01-09 15:01 發表評論
]]>
Linux centos 6.3 Nginx Installhttp://www.ymeg.top/libin2722/articles/394024.html禮物禮物Wed, 09 Jan 2013 07:00:00 GMThttp://www.ymeg.top/libin2722/articles/394024.htmlhttp://www.ymeg.top/libin2722/comments/394024.htmlhttp://www.ymeg.top/libin2722/articles/394024.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394024.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394024.html
#!/bin/sh
########################################################################################
#
# Install Ejabberd Server
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=nginx-1.2.6.tar.gz
SOURCE=http://nginx.org/download/nginx-1.2.6.tar.gz

# Create a build directory
mkdir -p /opt/install/nginx && cd /opt/install/nginx

# Prepare for compilation source
curl -o $TARGET $SOURCE
curl -o ngx_devel_kit.tar.gz https://nodeload.github.com/simpl/ngx_devel_kit/tar.gz/v0.2.17
curl -o lua-nginx-module.tar.gz https://nodeload.github.com/chaoslawful/lua-nginx-module/tar.gz/v0.7.12

mkdir -p tmp && tar -zxvf $TARGET -C tmp
tar -zxvf ngx_devel_kit.tar.gz
tar -zxvf lua-nginx-module.tar.gz

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y pcre-devel zlib-devel openssl-devel

# Create a User Group
groupadd nginx
useradd -r -g nginx nginx

# Compile and deploy
mv tmp/* source && cd source

export LUAJIT_LIB=/opt/environment/lua/lj2/lib
export LUAJIT_INC=/opt/environment/lua/lj2/include/luajit-2.0

./configure \
--prefix=/opt/server/web/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-client-body-temp-path=/opt/server/web/nginx/var/tmp/nginx/client-body \
--http-proxy-temp-path=/opt/server/web/nginx/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/opt/server/web/nginx/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/opt/server/web/nginx/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/opt/server/web/nginx/var/tmp/nginx/scgi \
--add-module=../ngx_devel_kit-0.2.17 \
--add-module=../lua-nginx-module-0.7.12 \
--with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"
make
make install

cd /opt/server/web/nginx
mkdir -p var/tmp/nginx var/lock var/run

curl -o conf/nginx.conf https://raw.github.com/fly2wind/TSShellScript/master/nginx/conf/nginx.conf

# Postinstallation setup
cd /opt/server/web/nginx
chown -R nginx .
chgrp -R nginx .
chown -R root .
chown -R nginx html var

# Configuration
curl -o /etc/init.d/nginx https://raw.github.com/fly2wind/TSShellScript/master/nginx/init/nginx
chmod a+x /etc/init.d/nginx

# Additional
chkconfig --add nginx
chkconfig nginx on




禮物 2013-01-09 15:00 發表評論
]]>
Linux centos 6.3 Python Installhttp://www.ymeg.top/libin2722/articles/394025.html禮物禮物Wed, 09 Jan 2013 07:00:00 GMThttp://www.ymeg.top/libin2722/articles/394025.htmlhttp://www.ymeg.top/libin2722/comments/394025.htmlhttp://www.ymeg.top/libin2722/articles/394025.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394025.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394025.html
#!/bin/sh
########################################################################################
#
# Install JDK Script
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=Python-2.7.3.tar.bz2
SOURCE=http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2

# Create a build directory
mkdir -p /opt/install/python && cd /opt/install/python

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -xvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y ncurses-devel openssl-devel readline-devel

# Create a User Group

# Compile and deploy
mv tmp/* source && cd source
./configure \
--prefix=/opt/environment/python/2.7.3
make
make install

cd ..
curl -O http://python-distribute.org/distribute_setup.py
curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
/opt/environment/python/2.7.3/bin/python2.7 distribute_setup.py
/opt/environment/python/2.7.3/bin/python2.7 get-pip.py

# Postinstallation setup
export PATH=$PATH:/opt/environment/python/2.7.3/bin

# Configuration

# Additional
sed -i '/export PATH=/a\export PATH=$PATH:\/opt\/environment\/python\/2.7.3\/bin' /etc/profile




禮物 2013-01-09 15:00 發表評論
]]>
Linux centos 6.3 Redis Installhttp://www.ymeg.top/libin2722/articles/394026.html禮物禮物Wed, 09 Jan 2013 07:00:00 GMThttp://www.ymeg.top/libin2722/articles/394026.htmlhttp://www.ymeg.top/libin2722/comments/394026.htmlhttp://www.ymeg.top/libin2722/articles/394026.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394026.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394026.html
#!/bin/sh
########################################################################################
#
# Install Ejabberd Server
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=redis-2.6.7.tar.gz
SOURCE=http://redis.googlecode.com/files/redis-2.6.7.tar.gz

# Create a build directory
mkdir -p /opt/install/redis && cd /opt/install/redis

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake

# Create a User Group
groupadd redis
useradd -r -g redis redis

# Compile and deploy
mv tmp/* source && cd source
make PREFIX=/opt/server/cache/redis
make install PREFIX=/opt/server/cache/redis

cd /opt/server/cache/redis
mkdir -p conf var/run var/lock var/snapshot logs
curl -o conf/redis.conf https://raw.github.com/fly2wind/TSShellScript/master/redis/conf/redis.conf

# Postinstallation setup
cd /opt/server/cache/redis
chown -R redis .
chgrp -R redis .
chown -R root .
chown -R redis var logs

# Configuration
curl -o /etc/init.d/redis https://raw.github.com/fly2wind/TSShellScript/master/redis/init/redis
chmod a+x /etc/init.d/redis

# Additional
chkconfig --add redis
chkconfig redis on




禮物 2013-01-09 15:00 發表評論
]]>
Linux centos 6.3 Mysql Installhttp://www.ymeg.top/libin2722/articles/394022.html禮物禮物Wed, 09 Jan 2013 06:59:00 GMThttp://www.ymeg.top/libin2722/articles/394022.htmlhttp://www.ymeg.top/libin2722/comments/394022.htmlhttp://www.ymeg.top/libin2722/articles/394022.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394022.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394022.html
#!/bin/sh
########################################################################################
#
# Install MySQL Script
#
# Shawn Ma
# 2013-01-06
#
########################################################################################
# Define
TARGET=mysql-5.5.29.tar.gz
SOURCE=http://cdn.mysql.com/Downloads/MySQL-5.5/$TARGET

# Create a build directory
mkdir -p /opt/install/mysql && cd /opt/install/mysql

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y bison ncurses-devel

# Create a User Group
groupadd mysql
useradd -r -g mysql mysql

# Compile and deploy
mv tmp/* source && cd source
cmake \
-DCMAKE_INSTALL_PREFIX=/opt/server/database/mysql \
-DSYSCONFDIR=/opt/server/database/mysql \
-DMYSQL_UNIX_ADDR=/opt/server/database/mysql/tmp/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_DATADIR=/opt/server/database/mysql/data \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS:STRING=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_DEBUG=OFF \
-DMYSQL_USER=mysql
make
make install

cd /opt/server/database/mysql
curl -o my.cnf https://raw.github.com/fly2wind/TSShellScript/master/mysql/conf/my.cnf


# Postinstallation setup
cd /opt/server/database/mysql
chown -R mysql .
chgrp -R mysql .
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data

# Configuration
curl -o /etc/init.d/mysql https://raw.github.com/fly2wind/TSShellScript/master/mysql/init/mysql
chmod a+x /etc/init.d/mysql

/etc/init.d/mysql start
bin/mysqladmin -u root password "TV.xian"
bin/mysql -u root -pTV.xian -e "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'TV.xian' WITH GRANT OPTION; FLUSH PRIVILEGES;"
bin/mysql -u root -pTV.xian -e "GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' IDENTIFIED BY 'backup'; FLUSH PRIVILEGES;";
/etc/init.d/mysql stop

# Additional
chkconfig --add mysql
chkconfig mysql on



禮物 2013-01-09 14:59 發表評論
]]>
Linux centos 6.3 Mysql slave Installhttp://www.ymeg.top/libin2722/articles/394023.html禮物禮物Wed, 09 Jan 2013 06:59:00 GMThttp://www.ymeg.top/libin2722/articles/394023.htmlhttp://www.ymeg.top/libin2722/comments/394023.htmlhttp://www.ymeg.top/libin2722/articles/394023.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394023.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394023.html
#!/bin/sh
########################################################################################
#
# Install MySQL Script
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=mysql-5.5.29.tar.gz
SOURCE=http://cdn.mysql.com/Downloads/MySQL-5.5/$TARGET

# Create a build directory
mkdir -p /opt/install/mysql && cd /opt/install/mysql

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y bison ncurses-devel

# Create a User Group
groupadd mysql
useradd -r -g mysql mysql

# Compile and deploy
mv tmp/* source && cd source
cmake \
-DCMAKE_INSTALL_PREFIX=/opt/server/database/mysql_slave \
-DSYSCONFDIR=/opt/server/database/mysql_slave \
-DMYSQL_UNIX_ADDR=/opt/server/database/mysql_slave/tmp/mysql.sock \
-DMYSQL_TCP_PORT=3307 \
-DMYSQL_DATADIR=/opt/server/database/mysql_slave/data \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS:STRING=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_DEBUG=OFF \
-DMYSQL_USER=mysql
make
make install

# Postinstallation setup
cd /opt/server/database/mysql_slave
chown -R mysql .
chgrp -R mysql .
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data

# Configuration
cp support-files/my-medium.cnf my.cnf
sed -i "/\[mysqld\]$/a\datadir???????? = \/opt\/server\/database\/mysql_slave\/data/" my.cnf
sed -i "s/^server-id.*/server-id?????? = 2/g" my.cnf
cp support-files/mysql.server /etc/init.d/mysql_slave && chmod a+x /etc/init.d/mysql_slave
##chkconfig --add mysql
##chkconfig --level 345 mysql on
##update-rc.d -a mysql
##update-rc.d mysql defaults

# Additional
/etc/init.d/mysql_slave start
bin/mysqladmin -u root password "TV.xian"
bin/mysql -u root -pTV.xian -e "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'TV.xian' WITH GRANT OPTION; FLUSH PRIVILEGES;"
bin/mysql -u root -pTV.xian -e "change master to master_host='192.168.102.128',master_port=3306,master_user='backup',master_password='backup', master_log_file='mysql-bin.000005',master_log_pos=326;"
bin/mysql -u root -pTV.xian -e "start slave;"

/etc/init.d/mysql_slave stop



禮物 2013-01-09 14:59 發表評論
]]>
Linux centos 6.3 Lua Installhttp://www.ymeg.top/libin2722/articles/394020.html禮物禮物Wed, 09 Jan 2013 06:58:00 GMThttp://www.ymeg.top/libin2722/articles/394020.htmlhttp://www.ymeg.top/libin2722/comments/394020.htmlhttp://www.ymeg.top/libin2722/articles/394020.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394020.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394020.html
#!/bin/sh
########################################################################################
#
# Install Lua Script
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=LuaJIT-2.0.0.tar.gz
SOURCE=http://luajit.org/download/LuaJIT-2.0.0.tar.gz

# Create a build directory
mkdir -p /opt/install/lua && cd /opt/install/lua

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies

# Create a User Group

# Compile and deploy
mv tmp/* source && cd source
make PREFIX=/opt/environment/lua/lj2
make install PREFIX=/opt/environment/lua/lj2

# Postinstallation setup
export PATH=$PATH:/opt/environment/lua/lj2/bin

# Configuration

# Additional






禮物 2013-01-09 14:58 發表評論
]]>
Linux centos 6.3 Memcached Installhttp://www.ymeg.top/libin2722/articles/394021.html禮物禮物Wed, 09 Jan 2013 06:58:00 GMThttp://www.ymeg.top/libin2722/articles/394021.htmlhttp://www.ymeg.top/libin2722/comments/394021.htmlhttp://www.ymeg.top/libin2722/articles/394021.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394021.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394021.html
#!/bin/sh
########################################################################################
#
# Install Ejabberd Server
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=memcached-1.4.15.tar.gz
SOURCE=http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz

# Create a build directory
mkdir -p /opt/install/memcached && cd /opt/install/memcached

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y libevent-devel

# Create a User Group
groupadd memcache
useradd -r -g memcache memcache

# Compile and deploy
mv tmp/* source && cd source
./configure \
--prefix=/opt/server/cache/memcached
make
make install

cd /opt/server/cache/memcached
mkdir -p conf var/run var/lock logs
curl -o conf/memcached.conf https://raw.github.com/fly2wind/TSShellScript/master/memcached/conf/memcached.conf

# Postinstallation setup
cd /opt/server/cache/memcached
chown -R memcache .
chgrp -R memcache .
chown -R root .
chown -R memcache var logs

# Configuration
curl -o /etc/init.d/memcached https://raw.github.com/fly2wind/TSShellScript/master/memcached/init/memcached
chmod a+x /etc/init.d/memcached

# Additional
chkconfig --add memcached
chkconfig memcached on




禮物 2013-01-09 14:58 發表評論
]]>
Linux centos 6.3 Erlang Installhttp://www.ymeg.top/libin2722/articles/394018.html禮物禮物Wed, 09 Jan 2013 06:57:00 GMThttp://www.ymeg.top/libin2722/articles/394018.htmlhttp://www.ymeg.top/libin2722/comments/394018.htmlhttp://www.ymeg.top/libin2722/articles/394018.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394018.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394018.html
#!/bin/sh
########################################################################################
#
# Install JDK Script
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=OTP_R15B03-1.tar.gz
SOURCE=https://nodeload.github.com/erlang/otp/tar.gz/OTP_R15B03-1

# Create a build directory
mkdir -p /opt/install/erlang && cd /opt/install/erlang

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y ncurses-devel openssl-devel

# Create a User Group

# Compile and deploy
mv tmp/* source && cd source
./otp_build autoconf
./configure \
--prefix=/opt/environment/erlang/R15B03 \
--enable-threads \
--enable-smp-support \
--enable-kernel-poll \
--enable-hipe \
--without-termcap \
--without-javac \
--with-ssl
make
make install

# Postinstallation setup
export PATH=$PATH:/opt/environment/erlang/R15B03/bin

# Configuration

# Additional
# export PATH USER
sed -i '/export PATH=/a\export PATH=$PATH:\/opt\/environment\/erlang\/R15B03\/bin' /etc/profile



禮物 2013-01-09 14:57 發表評論
]]>
Linux centos 6.3 Graphicsmagick Installhttp://www.ymeg.top/libin2722/articles/394019.html禮物禮物Wed, 09 Jan 2013 06:57:00 GMThttp://www.ymeg.top/libin2722/articles/394019.htmlhttp://www.ymeg.top/libin2722/comments/394019.htmlhttp://www.ymeg.top/libin2722/articles/394019.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394019.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394019.html
#!/bin/sh
########################################################################################
#
# Install Ejabberd Server
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=GraphicsMagick-LATEST.tar.gz
SOURCE=ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/GraphicsMagick-LATEST.tar.gz

# Create a build directory
mkdir -p /opt/install/graphicsmagick && cd /opt/install/graphicsmagick

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y libpng-devel libjpeg-devel libtiff-devel jasper-devel freetype-devel

# Create a User Group

# Compile and deploy
mv tmp/* source && cd source
./configure \
--prefix=/opt/tools/graphicsmagick \
--enable-shared \
--enable-static \
--with-quantum-depth=16 \
--with-ttf \
--with-jpeg \
--with-jp2 \
--with-png \
--with-zlib

make
make install

cd /opt/server/cache/memcached
mkdir -p conf var/run var/lock logs
curl -o conf/memcached.conf https://raw.github.com/fly2wind/TSShellScript/master/memcached/conf/memcached.conf

# Postinstallation setup
cd /opt/server/cache/memcached
chown -R memcache .
chgrp -R memcache .
chown -R root .
chown -R memcache var logs

# Configuration
curl -o /etc/init.d/memcached https://raw.github.com/fly2wind/TSShellScript/master/memcached/init/memcached
chmod a+x /etc/init.d/memcached

# Additional
chkconfig --add memcached
chkconfig memcached on




禮物 2013-01-09 14:57 發表評論
]]>
Linux centos 6.3 Ejabberd Installhttp://www.ymeg.top/libin2722/articles/394017.html禮物禮物Wed, 09 Jan 2013 06:55:00 GMThttp://www.ymeg.top/libin2722/articles/394017.htmlhttp://www.ymeg.top/libin2722/comments/394017.htmlhttp://www.ymeg.top/libin2722/articles/394017.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/394017.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/394017.html
#!/bin/sh
########################################################################################
#
# Install Ejabberd Server
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=v2.1.11.tar.gz
SOURCE=https://nodeload.github.com/processone/ejabberd/tar.gz/v2.1.11

# Create a build directory
mkdir -p /opt/install/ejabberd && cd /opt/install/ejabberd

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies
yum install -y gcc gcc-c++ make cmake autoconf automake
yum install -y expat-devel

# Create a User Group
groupadd ejabberd
useradd -r -g ejabberd ejabberd

# Compile and deploy
mv tmp/* source && cd source\src
./configure \
--prefix=/opt/server/xmpp/ejabberd \
--enable-user=ejabberd \
--enable-full-xml \
--enable-nif
make
make install

cd /opt/server/xmpp/ejabberd
curl -o etc/ejabberd/ejabberd.cfg https://raw.github.com/fly2wind/TSShellScript/master/ejabberd/conf/ejabberd.cfg
curl -o etc/ejabberd/ejabberdctl.cfg https://raw.github.com/fly2wind/TSShellScript/master/ejabberd/conf/ejabberdctl.cfg
curl -o etc/ejabberd/inetrc https://raw.github.com/fly2wind/TSShellScript/master/ejabberd/conf/inetrc

# Postinstallation setup
cd /opt/server/xmpp/ejabberd
chown -R ejabberd .
chgrp -R ejabberd .
chown -R root .
chown -R ejabberd var

# Configuration
sed -i "/^ERL=.*/a\PMD=\/opt\/environment\/erlang\/R15B03\/bin\/epmd" sbin/ejabberdctl
sed -i -e "s/epmd -names | grep -q name || epmd -kill/\$PMD -names | grep -q name || \$PMD -kill/" sbin/ejabberdctl
curl -o /etc/init.d/ejabberd https://raw.github.com/fly2wind/TSShellScript/master/ejabberd/init/ejabberd
chmod a+x /etc/init.d/ejabberd

# Additional
chkconfig --add ejabberd
chkconfig ejabberd on




禮物 2013-01-09 14:55 發表評論
]]>
Linux centos 6.3 JDK Installhttp://www.ymeg.top/libin2722/articles/393978.html禮物禮物Tue, 08 Jan 2013 09:38:00 GMThttp://www.ymeg.top/libin2722/articles/393978.htmlhttp://www.ymeg.top/libin2722/comments/393978.htmlhttp://www.ymeg.top/libin2722/articles/393978.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/393978.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/393978.html
#!/bin/sh
########################################################################################
#
# Install JDK Script
#
# Shawn Ma
#
########################################################################################
# Define
TARGET=jdk-7u10-linux-x64.tar.gz
SOURCE=http://www.ganshazi.com/jdk-7u10-linux-x64.tar.gz

# Create a build directory
mkdir -p /opt/install/java && cd /opt/install/java

# Prepare for compilation source
curl -o $TARGET $SOURCE
mkdir -p tmp && tar -zxvf $TARGET -C tmp

# Install build dependencies

# Create a User Group

# Compile and deploy
mkdir -p /opt/environment/java && mv tmp/* /opt/environment/java/1.7.0

# Postinstallation setup
export PATH=$PATH:/opt/environment/java/1.7.0/bin

# Configuration

# Additional
sed -i '/export PATH$/a\export PATH=$PATH:\/opt\/environment\/java\/1.7\/bin' /etc/profile







禮物 2013-01-08 17:38 發表評論
]]>
flex攝像頭拍照 java上傳到數據庫 .http://www.ymeg.top/libin2722/articles/355899.html禮物禮物Fri, 05 Aug 2011 14:32:00 GMThttp://www.ymeg.top/libin2722/articles/355899.htmlhttp://www.ymeg.top/libin2722/comments/355899.htmlhttp://www.ymeg.top/libin2722/articles/355899.html#Feedback2http://www.ymeg.top/libin2722/comments/commentRss/355899.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/355899.html閱讀全文

禮物 2011-08-05 22:32 發表評論
]]>
Nginx+Tomcat+Memcached共享session集群配置http://www.ymeg.top/libin2722/articles/355897.html禮物禮物Fri, 05 Aug 2011 13:31:00 GMThttp://www.ymeg.top/libin2722/articles/355897.htmlhttp://www.ymeg.top/libin2722/comments/355897.htmlhttp://www.ymeg.top/libin2722/articles/355897.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/355897.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/355897.html1、采用Nginx負載均衡?
2、memcached共享session?
3、tomcat集群配置(3臺CentOS 6)?

(172.18.188.64): 操作系統CentOS 6; 安裝nginx、memcached和tomcat 6?
(172.18.188.76): 操作系統CentOS 6; 安裝tomcat 6?
(172.18.188.78): 操作系統CentOS 6; 安裝tomcat 6?

nginx、memcached、tomcat 6安裝省略.?

nginx配置如下:?

nginx.conf如下:?
#運行nginx所在的用戶名和用戶組?
#user? root root;?

#啟動進程數?
worker_processes 8;?
#全局錯誤日志及PID文件?
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit;?

pid /usr/local/webserver/nginx/nginx.pid;?

#Specifies the value for maximum file descriptors that can be opened by this process.?

worker_rlimit_nofile 65535;?
#工作模式及連接數上限?
events?
{?
? use epoll;?
? worker_connections 65535;?
}?
#設定http服務器,利用它的反向代理功能提供負載均衡支持?
http?
{?
? #設定mime類型?
? include?????? mime.types;?
? default_type? application/octet-stream;?
? include /usr/local/webserver/nginx/conf/proxy.conf;?
? #charset? gb2312;?
? #設定請求緩沖???
? server_names_hash_bucket_size 128;?
? client_header_buffer_size 32k;?
? large_client_header_buffers 4 32k;?
? #client_max_body_size 8m;?
?????
? sendfile on;?
? tcp_nopush???? on;?

? keepalive_timeout 60;?

? tcp_nodelay on;?

#? fastcgi_connect_timeout 300;?
#? fastcgi_send_timeout 300;?
#? fastcgi_read_timeout 300;?
#? fastcgi_buffer_size 64k;?
#? fastcgi_buffers 4 64k;?
#? fastcgi_busy_buffers_size 128k;?
#? fastcgi_temp_file_write_size 128k;?

? gzip on;?
? gzip_min_length? 1k;?
? gzip_buffers???? 4 16k;?
? gzip_http_version 1.0;?
? gzip_comp_level 2;?
? gzip_types?????? text/plain application/x-javascript text/css application/xml;?
? gzip_vary on;?

? #limit_zone? crawler? $binary_remote_addr? 10m;?
###禁止通過ip訪問站點?
#? server{?
#?????? server_name _;?
#?????? return 404;?
#?????? }?

upstream tserver {?
??? server 172.18.188.64:8080 weight=1;?
??? server 172.18.188.76:8080 weight=1;?
??? server 172.18.188.78:8080 weight=1;?
}?

? server?
? {?
??? listen?????? 80;?
??? server_name? vmwarehost;?
??? index index.html index.htm index.jsp;?
??? root? /home/www/web/ROOT;?

??? #limit_conn?? crawler? 20;???
????
??? location /?
??? {?
??? proxy_pass http://tserver;?
??? }??
????
??? location /NginxStatus?
??? {?
????? stub_status on;?
????? access_log off;?
??? }????
???
??? location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ico)$?
??? {?
????? expires????? 30d;?
??? }?

??? location ~ .*\.(js|css)?$?
??? {?
????? expires????? 1h;?
??? }???

#定義訪問日志的寫入格式?
???? log_format? access? '$remote_addr - $remote_user [$time_local] "$request" '?
????????????? '$status $body_bytes_sent "$http_referer" '?
????????????? '"$http_user_agent" $http_x_forwarded_for';?
????????????? access_log? /usr/local/webserver/nginx/logs/localhost.log access;?

????? }?

}?

proxy.confi配置如下?
#!nginx (-)?
# proxy.conf?
proxy_redirect????????? off;?
proxy_set_header??????? Host $host;?
proxy_set_header??????? X-Real-IP $remote_addr;?
proxy_set_header?????? X-Forwarded-For?? $proxy_add_x_forwarded_for;?
client_max_body_size??? 10m;?
client_body_buffer_size 128k;?
proxy_connect_timeout?? 90;?
proxy_send_timeout????? 90;?
proxy_read_timeout????? 90;?
proxy_buffer_size?????? 4k;?
proxy_buffers?????????? 4 32k;?
proxy_busy_buffers_size 64k;?
proxy_temp_file_write_size 64k;?

tomcat 6 server.xml配置如下:?
<?xml version='1.0' encoding='utf-8'?>?
<!--?
? Licensed to the Apache Software Foundation (ASF) under one or more?
? contributor license agreements.? See the NOTICE file distributed with?
? this work for additional information regarding copyright ownership.?
? The ASF licenses this file to You under the Apache License, Version 2.0?
? (the "License"); you may not use this file except in compliance with?
? the License.? You may obtain a copy of the License at?

????? http://www.apache.org/licenses/LICENSE-2.0?

? Unless required by applicable law or agreed to in writing, software?
? distributed under the License is distributed on an "AS IS" BASIS,?
? WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.?
? See the License for the specific language governing permissions and?
? limitations under the License.?
-->?
<!-- Note:? A "Server" is not itself a "Container", so you may not?
???? define subcomponents such as "Valves" at this level.?
???? Documentation at /docs/config/server.html?
-->?
<Server port="8005" shutdown="SHUTDOWN">?

? <!--APR library loader. Documentation at /docs/apr.html -->?
? <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />?
? <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->?
? <Listener className="org.apache.catalina.core.JasperListener" />?
? <!-- Prevent memory leaks due to use of particular java/javax APIs-->?
? <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />?
? <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->?
? <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />?
? <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />?

? <!-- Global JNDI resources?
?????? Documentation at /docs/jndi-resources-howto.html?
? -->?
? <GlobalNamingResources>?
??? <!-- Editable user database that can also be used by?
???????? UserDatabaseRealm to authenticate users?
??? -->?
??? <Resource name="UserDatabase" auth="Container"?
????????????? type="org.apache.catalina.UserDatabase"?
????????????? description="User database that can be updated and saved"?
????????????? factory="org.apache.catalina.users.MemoryUserDatabaseFactory"?
????????????? pathname="conf/tomcat-users.xml" />?
? </GlobalNamingResources>?

? <!-- A "Service" is a collection of one or more "Connectors" that share?
?????? a single "Container" Note:? A "Service" is not itself a "Container",?
?????? so you may not define subcomponents such as "Valves" at this level.?
?????? Documentation at /docs/config/service.html?
?? -->?
? <Service name="Catalina">?
??
??? <!--The connectors can use a shared executor, you can define one or more named thread pools-->?
??? <!--?
??? <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"?
??????? maxThreads="150" minSpareThreads="4"/>?
??? -->?
????
????
??? <!-- A "Connector" represents an endpoint by which requests are received?
???????? and responses are returned. Documentation at :?
???????? Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)?
???????? Java AJP? Connector: /docs/config/ajp.html?
???????? APR (HTTP/AJP) Connector: /docs/apr.html?
???????? Define a non-SSL HTTP/1.1 Connector on port 8080?
??? -->?
??? <Connector port="8080" protocol="HTTP/1.1"?
?????????????? maxHttpHeaderSize="8192" connectionTimeout="20000"?
?????????????? disableUploadTimeout="true" enableLookups="false"?
?????????????? redirectPort="8443" maxThreads="600"?
?????????????? minSpareThreads="25" maxSpareThreads="75" acceptCount="100" />?
??? <!-- A "Connector" using the shared thread pool-->?
??? <!--?
??? <Connector executor="tomcatThreadPool"?
?????????????? port="8080" protocol="HTTP/1.1"?
?????????????? connectionTimeout="20000"?
?????????????? redirectPort="8443" />?
??? -->???????????
??? <!-- Define a SSL HTTP/1.1 Connector on port 8443?
???????? This connector uses the JSSE configuration, when using APR, the?
???????? connector should be using the OpenSSL style configuration?
???????? described in the APR documentation -->?
??? <!--?
??? <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"?
?????????????? maxThreads="150" scheme="https" secure="true"?
?????????????? clientAuth="false" sslProtocol="TLS" />?
??? -->?

??? <!-- Define an AJP 1.3 Connector on port 8009 -->?
??? <Connector port="8009" protocol="AJP/1.3"?
??? maxHttpHeaderSize="8192" connectionTimeout="20000"?
????????????????? disableUploadTimeout="true" maxThreads="600"?
????????????????? minSpareThreads="25" maxSpareThreads="75"?
????????????????? enableLookups="false" redirectPort="8443" />?


??? <!-- An Engine represents the entry point (within Catalina) that processes?
???????? every request.? The Engine implementation for Tomcat stand alone?
???????? analyzes the HTTP headers included with the request, and passes them?
???????? on to the appropriate Host (virtual host).?
???????? Documentation at /docs/config/engine.html -->?

??? <!-- You should set jvmRoute to support load-balancing via AJP ie :?
??? <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">?????????
??? -->?
??? <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">?

????? <!--For clustering, please take a look at documentation at:?
????????? /docs/cluster-howto.html? (simple how to)?
????????? /docs/config/cluster.html (reference documentation) -->?
??????
???????? <!--?
????? <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>?
????? -->?
??????? <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"?
???????????????? channelSendOptions="6">?
<!--?
<Manager className="org.apache.catalina.ha.session.BackupManager"?
?????????????????????? expireSessionsOnShutdown="false"?
?????????????????????? notifyListenersOnReplication="true"?
?????????????????????? mapSendOptions="6"/>?
?????????? -->?
?????????? <!--????????????
????????? <Manager className="org.apache.catalina.ha.session.DeltaManager"?
?????????????????? expireSessionsOnShutdown="false"?
?????????????????? notifyListenersOnReplication="true"/>?
-->?
????????? <Channel className="org.apache.catalina.tribes.group.GroupChannel">?
??????????? <Membership className="org.apache.catalina.tribes.membership.McastService"?
??????????????????????? address="228.0.0.4"?
??????????????????????? port="45564"?
??????????????????????? frequency="500"?
??????????????????????? dropTime="3000"/>?
??????????? <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"?
????????????????????? address="172.18.188.64"?
????????????????????? port="4001"?
????????????????????? autoBind="100"?
????????????????????? selectorTimeout="5000"?
????????????????????? maxThreads="6"/>?

??????????? <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">?
????????????? <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>?
??????????? </Sender>?????????
??????????? <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>?
??????????? <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>?
??????????? <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>??????????
????????? </Channel>?

????????? <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"?
????????? filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" />?

????????? <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"?
??????????????????????? tempDir="/tmp/war-temp/"?
??????????????????????? deployDir="/tmp/war-deploy/"?
??????????????????????? watchDir="/tmp/war-listen/"?
??????????????????????? watchEnabled="false"/>?
????????? <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>?
??????? </Cluster>?
?????????????

????? <!-- The request dumper valve dumps useful debugging information about?
?????????? the request and response data received and sent by Tomcat.?
?????????? Documentation at: /docs/config/valve.html -->?
????? <!--?
????? <Valve className="org.apache.catalina.valves.RequestDumperValve"/>?
????? -->?

????? <!-- This Realm uses the UserDatabase configured in the global JNDI?
?????????? resources under the key "UserDatabase".? Any edits?
?????????? that are performed against this UserDatabase are immediately?
?????????? available for use by the Realm.? -->?
????? <Realm className="org.apache.catalina.realm.UserDatabaseRealm"?
???????????? resourceName="UserDatabase"/>?

????? <!-- Define the default virtual host?
?????????? Note: XML Schema validation will not work with Xerces 2.2.?
?????? -->?
????? <Host name="localhost"? appBase="/home/www/web"?
??????????? unpackWARs="true" autoDeploy="true"?
??????????? xmlValidation="false" xmlNamespaceAware="false">?

??????? <!-- SingleSignOn valve, share authentication between web applications?
???????????? Documentation at: /docs/config/valve.html -->?
??????? <!--?
??????? <Valve className="org.apache.catalina.authenticator.SingleSignOn" />?
??????? -->?

??????? <!-- Access log processes all example.?
???????????? Documentation at: /docs/config/valve.html -->?
??????? <!--?
??????? <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"??
?????????????? prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>?
??????? -->?
????? </Host>?
??? </Engine>?
? </Service>?
</Server>?

content.xml配置如下?
<Context>?

??? <!-- Default set of monitored resources -->?
??? <WatchedResource>WEB-INF/web.xml</WatchedResource>?

??? <!-- Uncomment this to disable session persistence across Tomcat restarts -->?
??? <!--?
??? <Manager pathname="" />?
??? -->?

??? <!-- Uncomment this to enable Comet connection tacking (provides events?
???????? on session expiration as well as webapp lifecycle) -->?
??? <!--?
??? <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />?
??? -->?
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"?
memcachedNodes="n1:172.18.188.64:11211"?
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"?
sessionBackupAsync="false"?
sessionBackupTimeout="100"?
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"?
copyCollectionsForSerialization="false"/>?
</Context>?
memcached啟動命令:?
useradd -s /sbin/nologin memcached?
memcached -d -m 2048 -l 172.18.188.64 -p 11211 -u memcached?
ngingx啟動命令?
sbin/nginx?
tomcat啟動命令(startup.sh)?
分別啟動memcached nginx tomcat能實現session的簡單共享.?
按照上面配置Nginx Memcached Tomcat啟動運行都沒有問題,并且可以實現Session的共享.但是有2個問題?
一、Session的共享是基于訪問IP的,即在同一臺電腦上開2個IE窗口時,獲取到Session中內容是相同的,也就是sessionid除了最后面的jvmrout不一樣,其他都一樣,內容也一樣,這樣就造成如果2個用戶先后在同一臺電腦上登錄形成session混亂,有沒有可能配置成同一ip在不同的ie窗口中不共享session,一個ie窗口對應一個session,而不是一個ip共享一個session.后臺的訪問依然是由nginx根據weight做分發而不是固定到一臺固定的tomcat機器??
二、Memcached 啟動是用-m 512發現會有數據丟失而且丟失幾率很大,在一個頁面上連續不斷的刷新時就會發現session中的內容會清空.

禮物 2011-08-05 21:31 發表評論
]]>
基于詞典的正向最大匹配中文分詞算法,能實現中英文數字混合分詞http://www.ymeg.top/libin2722/articles/355838.html禮物禮物Fri, 05 Aug 2011 00:34:00 GMThttp://www.ymeg.top/libin2722/articles/355838.htmlhttp://www.ymeg.top/libin2722/comments/355838.htmlhttp://www.ymeg.top/libin2722/articles/355838.html#Feedback2http://www.ymeg.top/libin2722/comments/commentRss/355838.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/355838.html閱讀全文

禮物 2011-08-05 08:34 發表評論
]]>
linux下Nginx+tomcat整合的安裝與配置http://www.ymeg.top/libin2722/articles/355631.html禮物禮物Wed, 03 Aug 2011 01:08:00 GMThttp://www.ymeg.top/libin2722/articles/355631.htmlhttp://www.ymeg.top/libin2722/comments/355631.htmlhttp://www.ymeg.top/libin2722/articles/355631.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/355631.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/355631.html閱讀全文

禮物 2011-08-03 09:08 發表評論
]]>
從 iBatis 到 MyBatis - MyBatis 簡明學習教程http://www.ymeg.top/libin2722/articles/354030.html禮物禮物Sun, 10 Jul 2011 02:40:00 GMThttp://www.ymeg.top/libin2722/articles/354030.htmlhttp://www.ymeg.top/libin2722/comments/354030.htmlhttp://www.ymeg.top/libin2722/articles/354030.html#Feedback3http://www.ymeg.top/libin2722/comments/commentRss/354030.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/354030.html閱讀全文

禮物 2011-07-10 10:40 發表評論
]]>
Apache Http Server與Tomcat實現負載均衡和集群http://www.ymeg.top/libin2722/articles/352842.html禮物禮物Wed, 22 Jun 2011 14:18:00 GMThttp://www.ymeg.top/libin2722/articles/352842.htmlhttp://www.ymeg.top/libin2722/comments/352842.htmlhttp://www.ymeg.top/libin2722/articles/352842.html#Feedback2http://www.ymeg.top/libin2722/comments/commentRss/352842.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/352842.html閱讀全文

禮物 2011-06-22 22:18 發表評論
]]>
linux+nginx+tomcat負載均衡,實現session同步http://www.ymeg.top/libin2722/articles/352841.html禮物禮物Wed, 22 Jun 2011 14:15:00 GMThttp://www.ymeg.top/libin2722/articles/352841.htmlhttp://www.ymeg.top/libin2722/comments/352841.htmlhttp://www.ymeg.top/libin2722/articles/352841.html#Feedback0http://www.ymeg.top/libin2722/comments/commentRss/352841.htmlhttp://www.ymeg.top/libin2722/services/trackbacks/352841.html閱讀全文

禮物 2011-06-22 22:15 發表評論
]]>
精准平特三肖
    <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

    <bdo id="rub96"></bdo>

      1. <track id="rub96"><div id="rub96"></div></track>
        <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

            <nobr id="rub96"><address id="rub96"><big id="rub96"></big></address></nobr>
          1. <menuitem id="rub96"><strong id="rub96"><menu id="rub96"></menu></strong></menuitem>
            <dl id="rub96"><source id="rub96"><tr id="rub96"></tr></source></dl>
            1. <tbody id="rub96"><div id="rub96"></div></tbody>
              1. <bdo id="rub96"><optgroup id="rub96"></optgroup></bdo>
              2. <bdo id="rub96"><dfn id="rub96"><dd id="rub96"></dd></dfn></bdo>
                1. <option id="rub96"><source id="rub96"></source></option>
                2. <bdo id="rub96"></bdo>

                    <p id="rub96"><tr id="rub96"></tr></p>
                  1. <tbody id="rub96"></tbody>

                    <bdo id="rub96"></bdo>

                  2. <option id="rub96"><source id="rub96"></source></option>

                    <bdo id="rub96"><optgroup id="rub96"><dd id="rub96"></dd></optgroup></bdo>
                      <track id="rub96"></track>

                        <bdo id="rub96"></bdo>
                      1. <option id="rub96"><p id="rub96"><tr id="rub96"></tr></p></option>

                          <bdo id="rub96"></bdo>
                          1. <track id="rub96"></track>
                            1. <track id="rub96"></track>
                                  <bdo id="rub96"></bdo>
                                  <option id="rub96"></option>

                                      1. <track id="rub96"><span id="rub96"></span></track>

                                          <option id="rub96"></option>

                                          1. 
                                            
                                              <option id="rub96"><span id="rub96"></span></option>
                                              <bdo id="rub96"><address id="rub96"></address></bdo>
                                              <option id="rub96"><source id="rub96"></source></option>
                                                <nobr id="rub96"><address id="rub96"></address></nobr>
                                              1. <nobr id="rub96"><optgroup id="rub96"><big id="rub96"></big></optgroup></nobr>
                                                <track id="rub96"></track>

                                                <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>
                                                  <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

                                                  <bdo id="rub96"></bdo>

                                                    1. <track id="rub96"><div id="rub96"></div></track>
                                                      <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>

                                                          <nobr id="rub96"><address id="rub96"><big id="rub96"></big></address></nobr>
                                                        1. <menuitem id="rub96"><strong id="rub96"><menu id="rub96"></menu></strong></menuitem>
                                                          <dl id="rub96"><source id="rub96"><tr id="rub96"></tr></source></dl>
                                                          1. <tbody id="rub96"><div id="rub96"></div></tbody>
                                                            1. <bdo id="rub96"><optgroup id="rub96"></optgroup></bdo>
                                                            2. <bdo id="rub96"><dfn id="rub96"><dd id="rub96"></dd></dfn></bdo>
                                                              1. <option id="rub96"><source id="rub96"></source></option>
                                                              2. <bdo id="rub96"></bdo>

                                                                  <p id="rub96"><tr id="rub96"></tr></p>
                                                                1. <tbody id="rub96"></tbody>

                                                                  <bdo id="rub96"></bdo>

                                                                2. <option id="rub96"><source id="rub96"></source></option>

                                                                  <bdo id="rub96"><optgroup id="rub96"><dd id="rub96"></dd></optgroup></bdo>
                                                                    <track id="rub96"></track>

                                                                      <bdo id="rub96"></bdo>
                                                                    1. <option id="rub96"><p id="rub96"><tr id="rub96"></tr></p></option>

                                                                        <bdo id="rub96"></bdo>
                                                                        1. <track id="rub96"></track>
                                                                          1. <track id="rub96"></track>
                                                                                <bdo id="rub96"></bdo>
                                                                                <option id="rub96"></option>

                                                                                    1. <track id="rub96"><span id="rub96"></span></track>

                                                                                        <option id="rub96"></option>

                                                                                        1. 
                                                                                          
                                                                                            <option id="rub96"><span id="rub96"></span></option>
                                                                                            <bdo id="rub96"><address id="rub96"></address></bdo>
                                                                                            <option id="rub96"><source id="rub96"></source></option>
                                                                                              <nobr id="rub96"><address id="rub96"></address></nobr>
                                                                                            1. <nobr id="rub96"><optgroup id="rub96"><big id="rub96"></big></optgroup></nobr>
                                                                                              <track id="rub96"></track>

                                                                                              <nobr id="rub96"><optgroup id="rub96"></optgroup></nobr>
                                                                                              1. 河北时时走势图号码 四川时时合法吗 中特网开奖网 江西时时定位胆稳赚 广东时时三星分析 2019年今期东方心经B pk10玩法规则图 表天津时时彩走势图表 快乐10分前三组选绝招 时时彩(稳定版)计划 国标麻将 西安 强制进入qq空间软件 欢乐生肖怎么买 国标麻将牌型 中国福彩数字3开奖 微信快乐10分群