MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          高并發(fā)訪問的核心原則其實就一句話“把所有的用戶訪問請求都盡量往前推”。

          如果把來訪用戶比作來犯的"敵人",我們一定要把他們擋在800里地以外,即不能讓他們的請求一下打到我們的指揮部(指揮部就是數(shù)據(jù)庫及分布式存儲)。

          如:能緩存在用戶電腦本地的,就不要讓他去訪問CDN。 能緩存CDN服務器上的,就不要讓CDN去訪問源(靜態(tài)服務器)了。能訪問靜態(tài)服務器的,就不要去訪問動態(tài)服務器。以此類推:能不訪問數(shù)據(jù)庫和存儲就一定不要去訪問數(shù)據(jù)庫和存儲。

          ? ? 說起來很輕松,實際做起來卻不容易,但只要稍加努力是可以做到的,Google的日獨立IP過億不也做到了么?我們這幾千萬的PV站比起Google不是 小屋見大屋了。我們還是先從我們的小屋搭起吧!哈哈!下面內(nèi)容的介紹起點是千萬級別的PV站,也可以支持億級PV的網(wǎng)站架構。

          高性能高并發(fā)高可擴展網(wǎng)站架構訪問的幾個層次:

          有人會問,我們老是說把用戶對業(yè)務的訪問往前推,到底怎么推啊?推到哪呢?下面,老男孩就為大家一一道來。

          第一層:首先在用戶瀏覽器端,使用Apache的mod_deflate壓縮傳輸,再比如:expires功能、deflate和expires功能利用的好,就會大大提升用戶體驗效果及減少網(wǎng)站帶寬,減少后端服務器的壓力。當然,方法還有很多,這里不一一細談了。

          提示:有關壓縮傳輸及expires功能nginx/lighttpd等軟件同樣也有。

          第二層:頁面元素,如圖片/js/css等或靜態(tài)數(shù)據(jù)html,這個層面是網(wǎng)頁緩存層,比如CDN(效果比公司自己部署squid/nginx要好,他們 更專業(yè),價格低廉,比如快網(wǎng)/CC等(價格80元/M/月甚至更低)而且覆蓋的城市節(jié)點更多),自己架設squid/nginx cache來做小型CDN是次選(超大規(guī)模的公司可能會考慮風險問題實行自建加購買服務結合),除非是為前端的CDN提供數(shù)據(jù)源服務,以減輕后端我們的服 務器數(shù)據(jù)及存儲壓力,而不是直接提供cache服務給最終用戶。taobao的CDN曾經(jīng)因為一部分圖片的次寸大而導致CDN壓力大的情況,甚至對圖片尺 寸大的來改小,以達到降低流量及帶寬的作用。

          提示:我們也可以自己架設一層cache層,對我們購買的CDN提供數(shù)據(jù)源服務,可用的軟件有varnish/nginx/squid 等cache,以減輕第三層靜態(tài)數(shù)據(jù)層的壓力。在這層的前端我們也可以架設DNS服務器,來達到跨機房業(yè)務拓展及智能解析的目的。

          ? ? 第三層:靜態(tài)服務器層一般為圖片服務器,視頻服務器,靜態(tài)HTML服務器。這一層是前面緩存層和后面動態(tài)服務器層的連接紐帶,大公司發(fā)布新聞等內(nèi)容直接由 發(fā)布人員分發(fā)到各cache節(jié)點(sina,163等都是如此),這和一般公司的業(yè)務可能不一樣。所以,沒法直接的參考模仿,比如人人的SNS。

          我們可以使用Q隊列方式實現(xiàn)異步的分發(fā)訪問,同時把動態(tài)發(fā)布數(shù)據(jù)(數(shù)據(jù)庫中的數(shù)據(jù))靜態(tài)化存儲。即放到本層訪問,或通過其他辦法發(fā)布到各cache節(jié)點, 而不是直接讓所有用戶去訪問數(shù)據(jù)庫,不知道大家發(fā)現(xiàn)了沒有,qq.com門戶的新聞評論多的有幾十萬條,如果所有用戶一看新聞就加載所有評論,那數(shù)據(jù)庫不 掛才怪。他們的評論需要審核(美其名約,實際是異步的方式,而且,評論可能都是靜態(tài)化的或類似的靜態(tài)化或內(nèi)存cache的方式),這點可能就是需要 51cto.com這樣站點學習的,你們打開51CTO的一篇博文,就會發(fā)現(xiàn)下面的評論一直都顯示出來了,也可能是分頁的。不過,應該都是直接讀庫的,一 旦訪問量大,數(shù)據(jù)庫壓力大是必然。這里不是說51cto網(wǎng)站不好,所有的網(wǎng)站都是從類似的程序架構開始發(fā)展的。CU也可能是如此。

          提示:我們可以在靜態(tài)數(shù)據(jù)層的前端自己架設一層cache層,對我們購買的CDN提供數(shù)據(jù)源服務,可用的軟件有varnish/nginx/squid 等cache。在這層的前端我們也可以架設DNS服務器,來達到跨機房業(yè)務拓展及智能解析的目的。

          第四層:動態(tài)服務器層:php,java等,只有透過了前面3層后的訪問請求才會到這個層,才可能會訪問數(shù)據(jù)庫及存儲設備。經(jīng)過前三層的訪問過濾能到這層訪問請求一般來說已非常少了,一般都是新發(fā)布的內(nèi)容和新發(fā)布內(nèi)容第一次瀏覽如;博文(包括微博等),BBS帖子。

          特別提示:此層可以在程序上多做文章,比如向下訪問cache層,memcache,memcachedb,tc,mysql,oracle,在程序級別 實現(xiàn)分布式訪問,分布式讀寫分離,而程序級別分布式訪問的每個db cache節(jié)點,又可以是一組業(yè)務或者一組業(yè)務拆分開來的多臺服務器的負載均衡。這樣的架構會為后面的數(shù)據(jù)庫和存儲層大大的減少壓力,那么這里呢,相當于 指揮部的外層了。

          第五層:數(shù)據(jù)庫cache層,比如:memcache,memcachedb,tc等等。

          根據(jù)不同的業(yè)務需求,選擇適合具體業(yè)務的數(shù)據(jù)庫。對于memcache、memcachedb ttserver及相關nosql數(shù)據(jù)庫,可以在第四層通過程序來實現(xiàn)對本層實現(xiàn)分布式訪問,每個分布式訪問的節(jié)點都可能是一組負載均衡(數(shù)十臺機器)。

          第六層:數(shù)據(jù)庫層,一般的不是超大站點都會用mysql主從結構,如:163,sina,kaixin都是如此,程序?qū)幼龇植际綌?shù)據(jù)庫讀寫分離,一主(或 雙主)多從的方式,訪問大了,可以做級連的主從及環(huán)狀的多主多從,然后,實現(xiàn)多組負載均衡,供前端的分布式程序調(diào)用,如果訪問量在大,就需要拆業(yè)務了,比 如:我再給某企業(yè)做兼職時,發(fā)現(xiàn)類似的51cto的一個站點,把www服務,blog服務,bbs服務都放一個服務器上,然后做主從。這種情況,當業(yè)務訪 問量大了,可以簡單的把www,blog,bbs服務分別各用一組服務器拆分開,這種方式運維都會的沒啥難度。當然訪問量在大了,可以繼續(xù)針對某一個服務 拆分如:www庫拆分,每個庫做一組負載均衡,還可以對庫里的表拆分。需要高可用可以通過drbd等工具做成高可用方式。對于寫大的,可以做主主或多主的 MYSQL REP方式,對于ORACLE來說,來幾組oracle DG(1master多salve方式)就夠了,11G的DG可以象mysql rep一樣,支持讀寫分離了。當然可選的方案還有,mysql cluster 和oracle 的RAC,玩mysql cluster和oracle RAC要需要更好更多的硬件及部署后的大量維護成本,因此,要綜合考慮,到這里訪問量還很大,那就恭喜了,起碼是幾千萬以上甚至上億的PV了。

          象百度等巨型公司除了會采用常規(guī)的mysql及oracle數(shù)據(jù)庫庫外,會在性能要求更高的領域,大量的使用nosql數(shù)據(jù)庫,然后前端在加DNS,負載均衡,分布式的讀寫分離,最后依然是拆業(yè)務,拆庫,。。。逐步細化,然后每個點又可以是一組或多組機器。

          特別提示:數(shù)據(jù)庫層的硬件好壞也會決定訪問量的多少,尤其是要考慮磁盤IO的問題,大公司往往在性價比上做文章,比如核心業(yè)務采用硬件 netapp/emc及san光纖架構,對于資源數(shù)據(jù)存儲,如圖片視頻,會采用sas或固態(tài)ssd盤,如果數(shù)據(jù)超大,可以采取熱點分取分存的方法:如:最 常訪問的10-20%使用ssd存儲,中間的20-30%采用sas盤,最后的40-50%可以采用廉價的sata。

          第七層:千萬級PV的站如果設計的合理一些,1,2個NFS SERVER就足夠了。我所維護(兼職)或經(jīng)歷過的上千萬PV的用NFS及普通服務器做存儲的還有大把,多一些磁盤,如SAS 15K*6的,或者用dell6850,搞幾組 NFS存儲,中小網(wǎng)站足夠了。當然可以做成drbd+heartbeat+nfs+a/a的方式。

          如果能達到本文設計要求的,中等規(guī)模網(wǎng)站,后端的數(shù)據(jù)庫及存儲壓力會非常小了。 象門戶網(wǎng)站級別,如sina等, 會采用硬件netapp/emc等等硬件存儲設備或是san光纖同道,甚至在性價比上做文章,比如核心業(yè)務采用硬件netapp/emc及san光纖架 構,對于資源數(shù)據(jù)存儲,如圖片視頻,會采用sas或固態(tài)ssd盤,如果數(shù)據(jù)超到,可以采取熱點分取分存的方法:如:最常訪問的10-20%使用ssd存 儲,中間的20-30%采用sas盤,最后的40-50%可以采用廉價的sata。

          象百度等巨型公司會采用hadoop等分布式的存儲架構,前端在加上多層CACHE及多及的負載均衡,同樣會根據(jù)業(yè)務進行拆分,比如爬蟲層存儲,索引層存儲,服務層存儲。。。可以更細更細。。。為了應付壓力,什么手段都用上了。

          ? ? 特殊業(yè)務,如人人,開心網(wǎng),包括門戶網(wǎng)站的評論,微博,大多都是異步的寫入方式,即無論讀寫,并發(fā)訪問數(shù)據(jù)庫都是非常少量的。

          ? ? 以上1-7層,如果都搭好了,這樣漏網(wǎng)到第四層動態(tài)服務器層的訪問,就不多了。一般的中等站點,絕對不會對數(shù)據(jù)庫造成太大的壓力。程序?qū)拥姆植际皆L問是從千萬及PV向億級PV的發(fā)展,當然特殊的業(yè)務 還需要特殊架構,來合理利用數(shù)據(jù)庫和存儲。

          轉(zhuǎn)自:http://bbs.chinaunix.net/thread-3626937-1-1.html

          posted @ 2011-12-11 21:43 leekiang 閱讀(1790) | 評論 (0)編輯 收藏

          下載gparted的iso文件,修改CentOS虛擬機為從光盤啟動,并且選中該iso文件。重新啟動CentOS虛擬機,在啟動時迅速點擊虛擬機窗口,同時按ESC鍵,可看到Boot Menu,選擇從光盤啟動,重啟后就可以使用gparted了。

          使用gparted和acronis進行Linux分區(qū)和NTFS分區(qū)無損調(diào)整
          http://gparted.sourceforge.net/larry/generalities/gparted.htm
          在VMWare中增加Linux文件系統(tǒng)空間
          VMware虛擬機中調(diào)整Linux分區(qū)大小手記
          給Vmware進行硬盤擴容
          增加VMware下的虛擬機磁盤空間
          How to mount space in /dev/sda2
          linux? 分區(qū)擴容
          Insufficient Space for Yum Installs? I'm confused
          Resizing Virtual Machines Guide with VMware
          How To Resize/Grow VMware Linux Disks and Partitions

          posted @ 2011-12-11 21:40 leekiang 閱讀(419) | 評論 (0)編輯 收藏

          1,安裝gcc
          yum install gcc

          2,安裝MySQL,并設置為開機自動啟動。
          # yum install mysql mysql-devel mysql-server
          # chkconfig --levels 235 mysqld on
          # /etc/init.d/mysqld start

          3,安裝ruby
          # wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p352.tar.gz
          # tar zxf ruby-1.8.7-p352.tar.gz
          # cd ruby-1.8.7-p352
          # ./configure?
          # make?
          # make?install

          # ruby -v
          目前ruby1.8.7最新的是p352,見ftp://ftp.ruby-lang.org/pub/ruby/1.8/
          默認會安裝到/usr/local/lib/ruby/

          4,安裝rubygems
          在安裝rails 之前,要先安裝rubygems
          這個比較挑剔,在redmine安裝指導(http://www.redmine.org/projects/redmine/wiki/RedmineInstall)中提到有要求,要在1.3.7 ~ 1.7.0之間,這里選擇了1.6.2版。同樣是下載源碼安裝。
          # cd ~/rails_install
          # wget http://rubyforge.org/frs/download.php/74445/rubygems-1.6.2.tgz
          # tar zxvf rubygems-1.6.2.tgz
          # cd rubygems-1.6.2
          # ruby setup.rb
          安裝成功后,執(zhí)行gem –v ,可看到版本信息。

          5,安裝Rails及相關gems

          wget?http://rubygems.org/downloads/rake-0.8.7.gem
          wget?http
          ://rubygems.org/downloads/rack-1.1.0.gem
          wget?http
          ://rubygems.org/downloads/rails-2.3.14.gem
          wget?http
          ://rubygems.org/downloads/activesupport-2.3.14.gem
          wget?http
          ://rubygems.org/downloads/activerecord-2.3.14.gem
          wget?http
          ://rubygems.org/downloads/actionpack-2.3.14.gem
          wget?http
          ://rubygems.org/downloads/actionmailer-2.3.14.gem
          wget?http
          ://rubygems.org/downloads/activeresource-2.3.14.gem

          wget?http
          ://rubygems.org/downloads/i18n-0.4.2.gem
          wget?http
          ://rubygems.org/downloads/mysql-2.8.1.gem
          wget?http
          ://rubygems.org/downloads/cgi_multipart_eof_fix-2.5.0.gem
          wget?http
          ://rubygems.org/downloads/coderay-1.0.0.gem

          gem??install?
          --local?rake-0.8.7.gem
          gem??install?
          --local?rack-1.1.0.gem?
          gem??install?
          --local?rails-2.3.14.gem
          gem??install?
          --local?mysql-2.8.1.gem
          gem??install?
          --local?i18n-0.4.2.gem
          gem??install?
          --local?cgi_multipart_eof_fix-2.5.0.gem
          gem??install?
          --local?coderay-1.0.0.gem

          6,安裝Redmine1.2.3
          使用svn下載Redmine 1.2源碼到/www目錄中
          svn co svn://rubyforge.org/var/svn/redmine/branches/1.2-stable redmine-1.2

          創(chuàng)建Redmine數(shù)據(jù)庫和redmine用戶
          CREATE?DATABASE?redmine?CHARACTER?SET?utf8?COLLATE?utf8_general_ci;
          CREATE?USER?'redmine'@'localhost'?IDENTIFIED?BY?'redmine';
          GRANT?ALL?ON?redmine.*?TO?'redmine'@'localhost';

          到database.yml文件,修改production節(jié)點的帳號和密碼為redmine,注意冒號后要有空格。

          到/www/redmine1.2目錄下
          rake?config/initializers/session_store.rb
          RAILS_ENV
          =production?rake?db:migrate
          RAILS_ENV
          =production?rake?redmine:load_default_data
          ruby?script
          /server?webrick?-p?8000?-e?production


          如果報錯:rake aborted! no such file to load -- openssl
          先yum install? openssl-devel
          然后到下載的ruby源碼的ext/openssl目錄
          ruby?extconf.rb??(生成Makefile)
          make
          make?install



          刪除已安裝的ruby
          How to uninstall Ruby from /usr/local?
          How to Remove an Old version of Ruby



          參考:
          CentOS 6.0 安裝配置rails 2.3.11 + redmine 1.2.1 筆記
          Redmine在Linux(CentOS)下的安裝及配置




          "./configure && make && make install"是典型的使用GNU的AUTOCONF和AUTOMAKE產(chǎn)生的程序的安裝步驟。
          ./configure是用來檢測你的安裝平臺的目標特征的。比如它會檢測你是不是有CC或GCC,并不是需要CC(
          cc是gcc的連接,gcc是編譯器)或GCC,它是個shell腳本
          make是用來編譯的,它從Makefile中讀取指令,然后編譯。
          make?install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。
          AUTOMAKE和AUTOCONF是非常有用的用來發(fā)布C程序的東西

          posted @ 2011-12-10 12:26 leekiang 閱讀(553) | 評論 (0)編輯 收藏

          一:瀏覽器顯示中文
          yum install fonts-chinese??
          yum install fonts-ISO8859-2-75dpi
          修改 /etc/sysconfig/i18n ,內(nèi)容如下:
          LANG="en_US.UTF-8"
          SYSFONT="lat0-sun16"

          二:中文輸入法安裝
          yum -y install scim*?
          yum -y install Deployment_Guide-zh-* lv-* stardict*
          參見 Linux CentOS下,瀏覽器亂碼,支持中文解決;以及中文輸入法的安裝

          安裝jdk
          在/usr/java目錄
          chmod 777 jdk-6u29-linux-i586-rpm.bin
          ./jdk-6u29-linux-i586-rpm.bin


          在安裝新的虛擬機時,如果選擇了ISO或者光盤立即安裝,vmware會自動配置自動安裝,但這樣默認安裝的CentOS系統(tǒng),在顯示中文的時候,會出現(xiàn)亂碼。有人講了解決辦法:
          CentOS在vmware7下中文亂碼的解決方法
          但另外有人說還是有問題,要采用以下的辦法:
          選擇“我將操作系統(tǒng)以后安裝(I will install the operating system? later)”,把裸機建出來后,先Virtual Machine Setting,點CDROM 然后在左邊選擇加載ISO文件(USe ISO image file),再啟動安裝就沒問題了。


          由于VMware的智能自動安裝,如果沒有前面的兩步,在安裝系統(tǒng)時將不會出現(xiàn)語言選擇、軟件定制、分區(qū)等幾乎所有設置選擇,系統(tǒng)將會完全自動安裝完畢。但這樣安裝的系統(tǒng)不能顯示中文,沒有中文輸入法,連編譯工具GCC也沒有,什么意思啦,就是這樣只安裝了最核心最基本的一些東西。
          開始不知道,就沒有前兩步裝的,結果裝完后又要考慮漢化,然后又要裝中文輸入法,要用GCC 時,發(fā)現(xiàn)沒有GCC,然后又得裝GCC,后來找了半天,終于在http://zhidao.baidu.com/question /89551368.html?fr=qrl&cid=89&index=5找到了答案,終于不用再為漢化而煩了,呵呵!這樣VM安裝 RHEL,就輕松解決問題了。
          補充:這樣的安裝方法相對簡易安裝(easyinstall)有些麻煩,那就是安裝完后得手動安裝vmtools,但別緊張,我教你個笨辦法無憂解決,哪怕你沒有l(wèi)inux基礎:
          (1)點擊vmvare上的安裝vmtools按鈕,系統(tǒng)會下載vmtools tar.gz 的cd
          (2)復制它到桌面,解壓
          (3)雙擊解壓后文件里面vmware-install.pl ,彈出對話框,選“在終端運行”
          (4)一路回車即可,最后要選擇一下分辨率:12
          (5)安裝后重啟虛擬機
          來源

          當出現(xiàn)"Please insert disc 2 to continue"時,點擊vmware提供的"Change Disc"。

          問題:yum install mysql-server時報錯“Insufficient space in download directory /var/cache/yum/base/packages”
          解決:rm -rf /var/cache/yum/*。也可修改/etc/yum.conf的cachedir=/var/cache/yum, 但根本原因可能是磁盤滿了。


          VMware虛擬機安裝redhat Linux 問題
          簡單CentOS配置步驟
          CentOS 5.5 圖形安裝教程(超詳細)
          CentOS 6.0 圖形(圖解)安裝教程、基本配置、網(wǎng)絡配置、軟件源配置、安裝壓縮、語言包
          How to Install Linux on VMWare
          用VMware虛擬機安裝CentOS-5.0

          posted @ 2011-10-18 03:03 leekiang 閱讀(1174) | 評論 (0)編輯 收藏

          用某程序打開某文件(如果有空格,必須用引號):
          call "C:\Program Files\Notepad++\notepad++.exe"? E:\工作.txt
          執(zhí)行這個bat時,會彈出一個對話框,如何隱藏運行呢?可以使用vba:
          CreateObject("WScript.Shell").Run "cmd /c E:\test.bat",0
          保存為test.vbs,雙擊它就可以隱藏運行了。

          bat腳本方便備份文件
          bat批處理學習筆記

          posted @ 2011-10-15 18:49 leekiang 閱讀(386) | 評論 (0)編輯 收藏

          使用Perf4J進行性能分析和監(jiān)控

          posted @ 2011-10-08 02:35 leekiang 閱讀(362) | 評論 (0)編輯 收藏

          ResultSetHandler的實現(xiàn)類有很多種,涉及數(shù)組、map 、javabean等,都接受一個RowProcessor類型的參數(shù)來實現(xiàn)結果集向?qū)ο蟮霓D(zhuǎn)化。其中RowProcessor的默認實現(xiàn)類為BasicRowProcessor, 用戶也可以自己實現(xiàn)RowProcessor。 BasicRowProcessor使用BeanProcessor來完成resultset中的值向javabean的映射,前提要求列名和bean屬性名必須一致。

          ArrayHandler :將ResultSet中第一行的數(shù)據(jù)轉(zhuǎn)化成對象數(shù)組
          ArrayListHandler : 將ResultSet中所有的數(shù)據(jù)轉(zhuǎn)化成List,List中存放的是Object[]
          BeanHandler :將ResultSet中第一行的數(shù)據(jù)轉(zhuǎn)化成類對象
          BeanListHandler :將ResultSet中所有的數(shù)據(jù)轉(zhuǎn)化成List,List中存放的是類對象
          MapHandler :將ResultSet中第一行的數(shù)據(jù)存成Map映射
          MapListHandler :將ResultSet中所有的數(shù)據(jù)存成List。List中存放的是Map
          ColumnListHandler :將ResultSet中某一列的數(shù)據(jù)存成List,List中存放的是Object對象
          KeyedHandler :將ResultSet中所有數(shù)據(jù)存成Map,Map中key為某一列的值,value為Map,存放key對應的行的數(shù)據(jù)
          ScalarHandler :將ResultSet中一條記錄的其中某一列的數(shù)據(jù)存成Object

          查詢的基本用法:
          ??????? String?url?=?"jdbc:mysql://localhost:3306/blog";
          ????????String?jdbcDriver?
          =?"com.mysql.jdbc.Driver";
          ????????String?user?
          =?"root";
          ????????String?password?
          =?"root";
          ????????DbUtils.loadDriver(jdbcDriver);
          ????????Connection?conn?
          =?null;
          ????????
          try?{
          ????????????conn?
          =?DriverManager.getConnection(url,?user,?password);
          ????????????QueryRunner?qr?
          =?new?QueryRunner();
          ????????????List??results?
          =?(List)qr.query(conn,?"select??*??from?T_USER",?new?BeanListHandler(User.class)?);
          ????????}?
          catch?(SQLException?e)?{
          ????????????e.printStackTrace();
          ????????}?
          finally?{
          ????????????DbUtils.closeQuietly(conn);
          ????????}
          該query方法執(zhí)行后會自己關閉rs和stmt,但沒有關閉連接。
          如果傳入dataSource, QueryRunner run = new QueryRunner( dataSource ),則執(zhí)行不含conn參數(shù)的查詢方法時,會自己關閉連接。
          public?<T>?T?query(String?sql,?ResultSetHandler<T>?rsh,?Object?params)
          ????????
          throws?SQLException?{

          ????????Connection?conn?
          =?this.prepareConnection();

          ????????
          try?{
          ????????????
          return?this.query(conn,?sql,?rsh,?params);
          ????????}?
          finally?{
          ????????????close(conn);
          ????????}
          ????}


          擴展ApacheCommos的DbUtils以支持字段名下劃線映射
          對 DBUtils 包中 BeanProcessor 的優(yōu)化
          修改DbUtils支持表名下劃線映射
          dbutils
          Commons DbUtils 源碼閱讀四
          讓你的DBUtils支持enum
          OSChina底層數(shù)據(jù)庫操作的類(QueryHelper)源碼
          OSChina底層數(shù)據(jù)庫操作的類(QueryHelper)源碼2
          基于JDBC+Oracle+Apache Dbutil的泛型DAO
          日常數(shù)據(jù)庫操作的煩惱及解藥--DbUtils、MyBatis和Hibernate
          基于dbutils支持annotation的簡易orm

          posted @ 2011-10-07 17:22 leekiang 閱讀(864) | 評論 (0)編輯 收藏

          1,SuppressWarnings的作用是抑制編譯器產(chǎn)生警告信息。
          @SuppressWarnings("unused")
          @SuppressWarnings("unchecked")

          eclipse支持的SuppressWarning的值如下,其他開發(fā)工具略有差異。
          • all to suppress all warnings
          • boxing to suppress warnings relative to boxing/unboxing operations
          • cast to suppress warnings relative to cast operations
          • dep-ann to suppress warnings relative to deprecated annotation
          • deprecation to suppress warnings relative to deprecation
          • fallthrough to suppress warnings relative to missing breaks in switch statements
          • finally to suppress warnings relative to finally block that don't return
          • hiding to suppress warnings relative to locals that hide variable
          • incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)
          • nls to suppress warnings relative to non-nls string literals
          • null to suppress warnings relative to null analysis
          • restriction to suppress warnings relative to usage of discouraged or forbidden references
          • serial to suppress warnings relative to missing serialVersionUID field for a serializable class
          • static-access to suppress warnings relative to incorrect static access
          • synthetic-access to suppress warnings relative to unoptimized access from inner classes
          • unchecked to suppress warnings relative to unchecked operations
          • unqualified-field-access to suppress warnings relative to field access unqualified
          • unused to suppress warnings relative to unused code
          2,注解
          注解是加入到java源代碼中的一些描述性的數(shù)據(jù),本身不能執(zhí)行。可利用反射(當RetentionPolicy=RUNTIME)或文本解析取得注解信息。
          @Target,@Retention為元注解。
          SuppressWarnings的源碼如下:
          @Target({TYPE,?FIELD,?METHOD,?PARAMETER,?CONSTRUCTOR,?LOCAL_VARIABLE})
          @Retention(RetentionPolicy.SOURCE)
          public?@interface?SuppressWarnings?{
          ????String[]?value();
          }

          package?java.lang.annotation;

          public?enum?RetentionPolicy?{
          ????
          /**
          ?????*?Annotations?are?to?be?discarded?by?the?compiler.
          ?????
          */
          ????SOURCE,

          ????
          /**
          ?????*?Annotations?are?to?be?recorded?in?the?class?file?by?the?compiler
          ?????*?but?need?not?be?retained?by?the?VM?at?run?time.??This?is?the?default
          ?????*?behavior.
          ?????
          */
          ????CLASS,

          ????
          /**
          ?????*?Annotations?are?to?be?recorded?in?the?class?file?by?the?compiler?and
          ?????*?retained?by?the?VM?at?run?time,?so?they?may?be?read?reflectively.
          ?????*
          ?????*?
          @see?java.lang.reflect.AnnotatedElement
          ?????
          */
          ????RUNTIME
          }


          package?java.lang.annotation;
          public?enum?ElementType?{
          ????TYPE,
          ????FIELD,
          ????METHOD,
          ????PARAMETER,
          ????CONSTRUCTOR,
          ????LOCAL_VARIABLE,
          ????ANNOTATION_TYPE,
          ????PACKAGE
          }

          3,泛型

          ????public?<T>?T?testT(List<T>??list){
          ????????T?t?
          =(T)?list;
          ????????
          return?t;
          ????}

          4,自動裝箱(AutoBoxing

          關于row type
          http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it/
          http://www.aygfsteel.com/sevenguin/archive/2011/04/20/348628.html

          轉(zhuǎn):J2SE5中的最新注釋功能SuppressWarnings
          http://wenku.baidu.com/view/9d20440f844769eae009edf2.html
          實戰(zhàn)篇:設計自己的Annotation
          Supported Values for @SuppressWarnings

          posted @ 2011-10-07 15:05 leekiang 閱讀(508) | 評論 (0)編輯 收藏

          xp下使用mysql5.1,創(chuàng)建表空間時報錯:
          Creating database "blog" failed: SQL Error (23): Out of resources when opening file '.\blog\db.opt' (Errcode: 24)
          解決辦法:
          在my.ini中添加一行
          open_files_limit????= 1024
          順便把max_connections調(diào)大了一些

          posted @ 2011-10-04 18:41 leekiang 閱讀(755) | 評論 (0)編輯 收藏

          并發(fā)與并行
          并 發(fā),英文單詞是concurrent,是指邏輯上同時發(fā)生,有人做過比喻,要完成吃完三個饅頭的任務,一個人可以這個饅頭咬一口,那個饅頭咬一口,這樣交 替進行,最后吃完三個饅頭,這就是并發(fā),因為在三個饅頭上同時發(fā)生了吃的行為,如果只是吃完一個接著吃另一個,這就不是并發(fā)了,是排隊,三個饅頭如果分給 三個人吃,這樣的任務完成形式叫并行,英文單詞是parallel。
          回到計算機概念,并發(fā)應該是單CPU時代或者單核時代的說法,這個時候CPU要同時完成多任務,只能用時間片輪轉(zhuǎn),在邏輯上同時發(fā)生,但在物理上是串行的。現(xiàn)在大多數(shù)計算機都是多核或者多CPU,那么現(xiàn)在的多任務執(zhí)行方式就是物理上并行的。
          為了從物理上支持并發(fā)編程,CPU提供了相應的特殊指令,比如原子化的讀改寫,比較并交換。
          并發(fā)編程的Java抽象

          posted @ 2011-10-04 16:08 leekiang 閱讀(703) | 評論 (0)編輯 收藏

          僅列出標題
          共54頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 宁陕县| 彰化县| 凤山县| 博湖县| 沧州市| 乳山市| 辰溪县| 丹棱县| 苗栗市| 澎湖县| 双流县| 邵阳县| 陆丰市| 云和县| 遂溪县| 石狮市| 山西省| 高台县| 乌苏市| 堆龙德庆县| 碌曲县| 贵港市| 桦南县| 千阳县| 丹阳市| 平山县| 三门峡市| 富阳市| 榕江县| 拜泉县| 广水市| 汉中市| 辉南县| 湘乡市| 镇宁| 屯留县| 乌拉特前旗| 化州市| 华容县| 澄迈县| 内黄县|