1. 程式人生 > >Oracle資料庫關於大資料的處理

Oracle資料庫關於大資料的處理

從網上查詢關於資料庫大資料處理的方案,有很多不錯的Blog,提出很多的解決方案,所以呢自己也想整理一下關於這方面的內容,如果只是把別人整理的總結Copy到這就沒什麼意思了,甚至在面試的時候會經常被問到怎麼樣來處理大資料和高併發的解決方案,再說了網上也有很多重複的內容,把一篇文章Copy來Copy去的!來點個人見解吧!

現在的做的Java WEB專案有幾個算得上是大資料的,很少的,基本上整個資料庫加起來也就幾十萬條的資料量,像那些資料量相當大的網站或是系統基本上都是有很多伺服器或是配置很高的伺服器來支援的,最近做了一個專案資料量在千萬級別,資料庫表空間實際用到的也就3GB左右,這種資料量算不上是什麼大資料,但是在開發的過程自己花了不少的功夫,根據自己的經驗分享一下關於這種大資料處理的方案,這只是個人經驗!

第一、首先解決SQL的問題

首先不考慮使用什麼其它的第三方的,就單純的SQL,寫出查詢效率高的SQL語句,一個數據庫報表,可以使用不同的關鍵字和不同的SQL來實現,寫出不同的SQL比較一下,哪一種查詢效率高、哪一種查詢效率快,這種是最直接的!

第二、建立分割槽表或是歷史資料表

對於資料量特別大的表建立分割槽表或是歷史資料表,比如像訂單表、交易流水錄表等等,這個可能根據資料量的大小來定,比如我在做上一個專案的時候,一天的交易流水最多也就不到1萬條,按照這種資料量的增加,按一年建立一張分割槽表,一年下來差不多一張表的資料量也就在300萬左右。或者是再加上一個查詢歷史交易的功能,還或者是限定查詢的時間,比如只能查詢一個月或是一個季度內的資料,許多大網站都是這麼幹的!

第三、通過建立定時任務或是跑批做出統計資料,即建立資料統計表

以前,在專案裡增加定時任務,比如在夜裡1點左右通過定時任務對當天的交易做出統計並將資料單獨儲存在一張表,統計的資料如當天消費有多少筆,消費的總金額是多少,當天退貨有多少筆和當天退貨的總金額是多少;做出月統計表、季度統計表、年統計表;這樣的話,一張表的資料量也就相當的少了,這其實就是靜態資料!同時這種方式也會解決所謂高併發帶來的伺服器壓力和訪問慢的問題!

但是這種方式會有問題,問題不在於統計的資料,而是在於定時任務,曾經因為定時任務也的過多、執行的過多導致對事個系統的影響,那時不得不重啟伺服器;所以有一個很好的方式就是將定時任務獨立出來,寫一個jar包,然後在Linux上寫一個定時執行jar包的SHELL指令碼,把這個jar包部署到Linux伺服器上就可以;而且使用Linux SHELL寫一個定時任務是很簡單的,不過我覺得這種方式相對來說比較好一點,不過呢一定要做好日誌的處理;我做的方式就是在jar包裡通過Log4j日誌跟蹤,同時又建立一張跑批的歷史表來記錄是否跑批成功,如果跑批失敗,我又在jar寫了一個郵件處理功能,即會像指定的郵箱裡傳送郵件通知!

第四、建立靜態的HTML頁面

可以使用這種方式,比如像按年度統計的這種資料基本上來說就是不會變的,然後把年度資料直接寫在HTML中,直接訪問HTML靜態頁面,也就是按年做每一年資料的靜態頁面,做出每一年每一個季度甚至是每一個月的靜態資料,而且這種方式會減輕伺服器和資料庫很大的壓力。

只不過這種方式是手動建立靜態頁面,其實也可以通過一些模板技術來像FreeMarker和Velocity建立靜態頁面;

不過,在我的專案中我沒有采用這種方式來處理,原因肯定是有的:1、統計表的資料量很小,而且這些資料都已經是處理好的,直接的一個簡單查詢就可以完成,沒有必要再去建立一個靜態頁面;2、不想採用兩種方式做一樣的事情,就是很多歷史資料我是需要作對比的,比如同比,即今年的某一月份和去年同時期的消費對比,今年的營業總額和去或是前年的總額的對比;3、系統的訪問量也不是很大就幾十個,沒必要那麼做。綜合一下,沒有采用種方式!

第五、不要過於依賴於JavaWEB框架

像這種大資料量,不要過於依賴於,甚至可以說不要使用Struts、Hibernate、Spring MVC、Spring、IBatis等JavaWEB框架,真的,我覺得使用這些框架也真不比使用純的JDBC強到哪去,除非你有很好的例子來證明這些框架在處理大資料來說一個很好的工具,之前,我在上家公司做的外包專案,使用使用Spring MVC、Spring、Hibernate,區區50萬條的資料量,系統運營起來就有那麼點吃力了,壓力測試就更是個問題了!

當然在這個專案中沒有使用SSH框架,是使用我們公司一個牛人寫的一個簡單易懂的框架!

除了以上這五種方式外,還有其它很多細節上的,簡單的再說幾個:1、可以建立表的索引欄位、但不能建立太多的索引,太多的話就沒什麼效果了;2、不使用Oracle的Sequence方式建立主鍵;3、主鍵使用CHAR型別比使用VARCHAR2型別查詢效率要高等等。

==================== 無聊的分隔線 =====================

以上我所說的幾點是不需要使用任何其它第三方面的技術就可以解決的,以下這幾種方式不是那麼簡單的啦,不過這幾種都沒有在我的專案中使用到:

第六、使用第三方的大資料處理工具

關於大資料處理工具,應該有很多的

第七、分散式應用

這個目前正在學習研究中

第八、伺服器叢集

這個也一樣,之前沒有使用過這種方式處理

第九、買好的伺服器

這個就是看老闆的意思了。

以上是個人在處理大資料(談不上是大資料,請見諒啊)時常用的方式,如果有什麼好的意見或是有什麼不妥的地方,我們可以相互交流學習。

更新日期:2013-07-05