海水正藍

          面朝大海,春暖花開
          posts - 145, comments - 29, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          是自己編寫的一個jar文件,每次添加單個jar到maven本地倉庫的操作如下:

          1.建立一個新的文件夾,將jar文件存放在該文件夾下。
            注意文件夾下最好只存放該文件。
          2.在該文件夾下建立一個pom.xml文件,在pom文件中定義其maven坐標。
          3.在cmd窗口中執(zhí)行以下命令:
            mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

          例如
          mvn install:install-file -Dfile=/home/xx.jar -DgroupId=xx -DartifactId=xx -Dversion=1.0 -Dpackaging=jar

          posted @ 2012-08-03 16:51 小胡子 閱讀(4532) | 評論 (1)編輯 收藏

               摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  1 using System;  2 using System.Collections.Generic; &n...  閱讀全文

          posted @ 2012-08-01 22:52 小胡子 閱讀(510) | 評論 (0)編輯 收藏

          http://hb.qq.com/a/20110624/001008.htm
          http://blog.163.com/popfei3707@126/blog/static/12297648420107542344500/
          http://www.iteye.com/problems/30192
          http://hi.baidu.com/guorabbit/item/dddca00b7521eb813d42e279

          posted @ 2012-07-31 13:03 小胡子 閱讀(224) | 評論 (0)編輯 收藏

          修改
          apache-tomcat-6.0.33\bin\catalina.bat 文件

          @echo   off
          if   "%OS% "   ==   "Windows_NT "   setlocal
          rem   ---------------------------------------------------------------------------
          rem   Start   script   for   the   CATALINA   Server
          rem
          rem   $Id:   startup.bat,v   1.4   2002/08/04   18:19:43   patrickl   Exp   $
          rem   ---------------------------------------------------------------------------
          set   JAVA_HOME=c:\jdk
          set   CATALINA_HOME=c:\apache-tomcat-6.0.33

          rem   Guess   CATALINA_HOME   if   not   defined
          if   not   "%CATALINA_HOME% "   ==   " "   goto   gotHome

          JAVA_HOME=c:\jdk
          set   CATALINA_HOME=c:\apache-tomcat-6.0.33   中
          c:\jdk   是你jdk工具包的目錄,
          c:\apache-tomcat-6.0.33  是tomcat 安裝目錄

          posted @ 2012-07-31 10:49 小胡子 閱讀(274) | 評論 (0)編輯 收藏

           表單是網(wǎng)站中重要的交互元素,用最直接有效的方式取得用戶的輸入數(shù)據(jù)。但多數(shù)表單都不是友好的,代表著繁重的輸入工作,表單切換,煩人的格式提醒,漏填警告等。如何讓表單變得更為別致和友好,讓用戶減少反感和枯燥感。本文選擇了一些希望可以帶給你靈感的應用。

          Awesome

          forms06

          forms07

          Foundation Six

          forms09
          forms10

          Wanken

          forms13
          forms14

          Visual Republic

          forms15
          forms16

          Andrew McClintock

          forms17

          Chris Woods

          forms18

          bio-bak

          forms19

          Vincent Mazza

          forms20

          Ed Peixoto

          forms21

          Christian Sparrow

          forms22

          olga designs

          forms23

          Krista Ganelon

          forms24

          Forever Heavy

          forms25

          Cornerd

          forms26
          forms27

          Justdot

          forms28
          forms29

          sikbox

          forms30

          Justalab

          forms31
          forms32

          Buffalo

          forms33
          forms34

          Sprocket House

          forms35

          Gardener & Marks

          forms36

          Pentagon

          forms11
          forms12

          Gams

          forms08

          All Creative

          forms01

          forms02

          Creditable

          forms03

          Gowalla

          forms04

          forms05

          原文:http://webdesignledger.com/inspiration/25-excellent-examples-of-forms-in-web-design

           

          作   者:孟晨
          出   處:http://www.cnblogs.com/xiaoyao2011/
          個人站:  http://www.coderidea.com/
          歡迎任何形式的轉載,但請務必注明出處。

          posted @ 2012-07-30 13:02 小胡子 閱讀(141) | 評論 (0)編輯 收藏

          jquery的功能總是那么的強大,用他可以開發(fā)任何web和移動框架,在瀏覽器市場,他一直是占有重要的份額,今天,就給大家分享20驚人的jQuery插件為設計師和開發(fā)人員。 比方說The-M-Project 可能就是你正在等待的一個開源的手機的 HTML5 的 JavaScript 框架,通過它可編寫 HTML5/CSS3/SVG 應用,并支持多數(shù)數(shù)據(jù)平臺,包括 iOS, Android, Palm webOS, 和 Blackberry OS。

           

           jShowOff:jQuery的內容肩 - jQuery插件

          ShowOff 是一個基于 jQuery 的內容幻燈插件,之所以叫內容插件而不是圖片幻燈插件,是因為jShowOff不僅支持圖片,同時也支持任何HTML代碼。jShowOff很易于使用, 對HTML結構的要求很簡單,有一個父元素包裹的元素集合就可以了,并且jShowOff提供了豐富實用的配置參數(shù)。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          下載jQuery的內容肩插件

          要求: jQuery的兼容性:所有主要瀏覽器下載:http://github.com/ekallevig/jShowOff

          使用jQuery - Zoomy快速和方便的縮放

          zoomy是簡單的。zoomy是很容易實現(xiàn)和定制。Zoomy是一個快速簡便的插件,使圖片放大或縮小。你只需要兩個副本圖像和一個大的圖像顯示,然后縮放圖像。大多數(shù)CMS系統(tǒng)保存或創(chuàng)建多個大小的圖像,所以它很容易成立。只是鏈接上顯示圖片的放大圖片,并告訴插件使用變焦時的鏈接。只需點點的腳本。Zoomy是一個很容易實現(xiàn)的jQuery插件,它可以幫助創(chuàng)建圖像放大功能

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的下載:http://redeyeoperations.com/plugins/zoomy/zoomy0.5.zip

          使用php /jquery /image 圖像裁剪插件

          jQuery上傳/圖像上傳工具的使用和作物不同類型的圖像,JPG,GIF和PNG和你現(xiàn)在可以上傳圖片,并有一個隨機的文件名 (此修復一些有緩存的問題)你需要“ 圖片區(qū)選擇 “插件。

          我們需要的是一種方式來上傳一個JPG圖像,調整其大小,如果需要的話,那么裁剪給定的高度和寬度。

          preivew:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求:jQuery的,PHP PHP的GD

          Demo: http://www.webmotionuk.co.uk/jquery/image_upload_crop.php
          Download: http://www.webmotionuk.co.uk/jquery/jquery_upload_crop.zip

          ProcessWire:PHP的CMS的框架與jQuery

          ProcessWire是一個開源的內容管理系統(tǒng)(CMS)Web應用程序框架,針對設計師,開發(fā)人員和他們的客戶的需求。ProcessWire給你更多的控制領域,模板和標記比其他平臺,并提供了強大的模板系統(tǒng),ProcessWire的API使您的內容輕松,愉快的工作。相比,你可以用來管理和發(fā)展在ProcessWire的網(wǎng)站是驚人的簡單。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: PHP 5.2.4 +的MySQL 5.0.15 + 

          演示:http://processwire.com/demo/ 

          下載:https://github.com/ryancramerdesign/ProcessWire

          jRating - 靈活的jQuery的Ajax評分插件

          jRating是一個非常靈活的jQuery插件,用于快速創(chuàng)建一個Ajaxed星級評級制度。它是可以配置的每一個細節(jié),從“數(shù)星星”,“如果星星可以代表小數(shù)或不”。還有一個選項,以顯示大或小的恒星和圖像可以很容易改變的任何其他文件。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的兼容性:所有主要


          The-M-Project HTML5的跨平臺移動應用的JavaScript框架

          The-M-Project 可能就是你正在等待的一個開源的手機的 HTML5 的 JavaScript 框架,通過它可編寫 HTML5/CSS3/SVG 應用,并支持多數(shù)數(shù)據(jù)平臺,包括 iOS, Android, Palm webOS, 和 Blackberry OS。The-M-Project是一個令人興奮的HTML5的JavaScript框架建立跨平臺的移動網(wǎng)絡應用程序(IOSAndroid,Palm的webOS,黑莓)。它使用jquery的JavaScript部分,并包含所有UI +像脫機支持,國際化和功能的核心文件。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: Git的nodeJS 兼容性:所有主要的移動


          arbor.js:使用Web和jQuery的圖形可視化圖書館

          arbor.js 是一個利用 Web Works 和 jQuery 創(chuàng)建的可視化圖形庫,它為圖形組織和屏幕刷新處理提供了一個高效的、力導向的布局算法。

           

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的兼容性:所有現(xiàn)代瀏覽器下載:https://github.com/samizdatco/arbor

          jQuery.validval插件簡化定制的表單驗證

          jQuery.validVal是一個插件,旨在簡化和定制的驗證形式。它是高度可定制,功能非常豐富,可以很容易地在任何類型的HTML形式(甚至AJAX的形式),。它可用于任何一種HTML表單(包括Ajaxed)的驗證,并通過在類名定義的規(guī)則。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的兼容性:所有主要瀏覽器演示:http://validval.frebsite.nl/examples.php

          FancyMoves Jquery的產(chǎn)品滑塊

          FancyMoves 是一個漂亮的產(chǎn)品圖片滾動展播jQuery插件。支持鍵盤或點擊圖片導航瀏覽,當點擊具體圖片會彈出一個Lightbox模式對話框來顯示原始圖片。他有三種展現(xiàn)方式:使用鍵盤箭頭,使用滑塊兩側的左,右箭頭,或在滑塊只需點擊下一個或最后一個項目。

          FancyMoves,為您的網(wǎng)站或博客的一個新的jQuery滑塊產(chǎn)品

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求:
          Demo: 
          http://webdesignandsuch.com/posts/jquery-product-slider/jQuery-productSlider/index.html
          Download: http://webdesignandsuch.com/posts/jquery-product-slider/jQuery-productSlider/FancyMoves.zip

          jquery  自動復制插件sheepIt

          SheepIt!是一個能夠動態(tài)復制表單元素的jQuery插件,可以批量增加、刪除某一個表單元素。在增加表單元素前/后都可以添加回調函數(shù)。

          有時候,一個靜態(tài)的形式是不夠的,因為我們可能希望使人們有可能為用戶定義靈活的地址,電話,電子郵件等

          這是SheepIt! 

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的1.4 + 的兼容性:所有主要


           jquery Overlay Effect Menu

          Overlay Effect Menu是一款基于jquery的菜單插件,當鼠標經(jīng)過菜單時候,將會產(chǎn)生遮罩,遮擋除了菜單的任何部分,并且展開子菜單.

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的兼容性:所有主要的瀏覽器演示:

          http://tympanus.net/Tutorials/OverlayEffectMenu/
          Download: http://tympanus.net/Tutorials/OverlayEffectMenu/OverlayEffectMenu.zip

          File Download jQuery Plugin: jDownload

          jDownload是一個jQuery插件,其目的是要下載有關文件的說明

          一旦下載鏈接被點擊時,它發(fā)送一個Ajax查詢到一個PHP文件,它返回一個模態(tài)窗口中的文件的名稱,類型和大小。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的jQuery UI的兼容性:所有主要瀏覽器下載:http://code.google.com/p/jquery-jdownload/downloads/list

          創(chuàng)意與jQuery自由基Web版式 - Lettering.js

          lettering.js,重量輕,易于使用JavaScript <SPAN>插件用來實現(xiàn)比較激進的網(wǎng)頁排版。

          它只是簡單地劃分成片<SPAN>小號的任何給定的元素包裝一個自定義類的每個字母。

          preivew:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的兼容性:所有主要瀏覽器下載:http://github.com/davatron5000/Lettering.js

          SlideNote:滑動通知的jQuery插件

          SlideNote是一個可定制的,靈活jquery插件,可以很容易地顯示在您的網(wǎng)站或在你的web應用滑動通知。欲了解更多信息或看到一個演示中,向下滾動。插件顯示任何URL的內容,可選它可以顯示該網(wǎng)址內的元素的內容。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的兼容性:所有主要瀏覽器下載:http://github.com/tommcfarlin/slidenote~~V

          jQuery的水平手風琴 -Easy Accordion

          Easy Accordion是一個高度靈活的jQuery插件用于快速創(chuàng)建水平可折疊手風琴(Accordion),它支持在同一個頁面中創(chuàng)建多個實例。可折疊任意內容如:圖片、列表、Flash等,外觀也完全可以通過CSS自定義。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的兼容性:所有主要


          carouFredSel - 無限的jQuery傳送帶滾動水平和垂直插件

          carouFredSel是一個內容無限循環(huán)播放容器jQuery,可以展示任何類型的HTML元素。支持水平和垂直兩個方向。項目的高度和寬度可以不相同。可以動態(tài)從容器中刪除/添加項目,可以利用向前/向后按紐播放項目或設置成自動播放。

          Slick jQuery Image Slider Plugin “Orbit”

           

          Orbit是一個設計良好并且容易使用的jQuery圖片滑動幻燈片插件,它除了支持圖片滾動切換展示外,還支持針對內容的滾動。插件的定制性相當高,它提供了多個參數(shù)的設置,通過設置你可以將它打造成完全符合你要求的樣式。

          預覽:
          jQuery插件 -  20驚人的jQuery插件和100 +優(yōu)秀的jQuery資源

          要求: jQuery的兼容性:所有主要瀏覽器網(wǎng)址:http://www.zurb.com/playground/jquery-image-slider-plugin/Orbit_Kit.zip


          轉自:http://www.cnblogs.com/web8cn/archive/2012/07/30/2614795.html

          posted @ 2012-07-30 13:00 小胡子 閱讀(1308) | 評論 (0)編輯 收藏

               摘要: 今天在網(wǎng)上看到了一篇關于JAVA圖像處理的文章,博主貼出了一個處理類:特點是高品質縮小,具體代碼如下: import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import&n...  閱讀全文

          posted @ 2012-07-27 15:29 小胡子 閱讀(170) | 評論 (0)編輯 收藏

          一、需要用到的類

          java.awt.image.BufferedImage;

          javax.imageio.ImageIO;

          java.io.*;

           

          二、為什么要將BufferedImage轉為byte數(shù)組

           

          在傳輸中,圖片是不能直接傳的,因此需要把圖片變?yōu)樽止?jié)數(shù)組,然后傳輸比較方便;只需要一般輸出流的write方法即可;

          而字節(jié)數(shù)組變成BufferedImage能夠還原圖像;

           

          三、如何取得BufferedImage

           

          BufferedImage image = ImageIO.read(new File("1.gif"));

           

          四、BufferedImage  ---->byte[]

           

          ImageIO.write(BufferedImage image,String format,OutputStream out);方法可以很好的解決問題;

          參數(shù)image表示獲得的BufferedImage;

          參數(shù)format表示圖片的格式,比如“gif”等;

          參數(shù)out表示輸出流,如果要轉成Byte數(shù)組,則輸出流為ByteArrayOutputStream即可;

          執(zhí)行完后,只需要toByteArray()就能得到byte[];

           

          五、byte[] ------>BufferedImage

           

          ByteArrayInputStream in = new ByteArrayInputStream(byte[]b);    //將b作為輸入流;

          BufferedImage image = ImageIO.read(InputStream in);     //將in作為輸入流,讀取圖片存入image中,而這里in可以為ByteArrayInputStream();

           

          六、顯示BufferedImage

           

          public void paint(Graphics g){

          super.paint(g);

          g.drawImage(image);    //image為BufferedImage類型

          }

           

          七、實例

           

          要求:編寫一個網(wǎng)絡程序,通過Socket將圖片從服務器端傳到客戶端,并存入文件系統(tǒng);

          Server端:

          package org.exam3;

          import java.awt.image.BufferedImage;
          import java.io.ByteArrayOutputStream;
          import java.io.DataOutputStream;
          import java.io.File;
          import java.net.ServerSocket;
          import java.net.Socket;

          import javax.imageio.ImageIO;

          public class T6Server {

          public static void main(String[] args) throws Exception {
          ServerSocket server = new ServerSocket(8888);
          Socket s = server.accept();
          DataOutputStream dout = new DataOutputStream(s.getOutputStream());
          BufferedImage image = ImageIO.read(new File("1.gif"));
          ByteArrayOutputStream out = new ByteArrayOutputStream();
          boolean flag = ImageIO.write(image, "gif", out);
          byte[] b = out.toByteArray();
          dout.write(b);
          s.close();
          }

          }



          Client端:

           

          package org.exam3;

          import java.awt.BorderLayout;
          import java.awt.Graphics;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.awt.image.BufferedImage;
          import java.io.ByteArrayInputStream;
          import java.io.DataInputStream;
          import java.io.File;
          import java.io.PrintWriter;
          import java.net.Socket;

          import javax.imageio.ImageIO;
          import javax.swing.JButton;
          import javax.swing.JFrame;
          import javax.swing.JPanel;

          public class T6Client extends JFrame {
          JButton button;
          MyPanel panel;
          public T6Client() {
          setSize(300, 400);
          button = new JButton("獲取圖像");
          add(button,BorderLayout.NORTH);
          button.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {
          try {
          Socket s = new Socket("localhost",8888);
          PrintWriter out = new PrintWriter(s.getOutputStream());
          out.print("a");
          DataInputStream in = new DataInputStream(s.getInputStream());
          byte[]b = new byte[1000000];
          in.read(b);
          ByteArrayInputStream bin = new ByteArrayInputStream(b);
          BufferedImage image = ImageIO.read(bin);
          ImageIO.write(image, "gif", new File("2.gif"));
          s.close();
          } catch (Exception e) {
          }
          }
          });
          panel = new MyPanel();
          add(panel);

          }
          public static void main(String[] args) throws Exception {
          T6Client frame = new T6Client();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setVisible(true);
          }

          }
          轉自:

          posted @ 2012-07-27 15:28 小胡子 閱讀(896) | 評論 (0)編輯 收藏

          這兩個概念是早些時候Martin Fowler總結出來的兩種常見模型設計類型,沒有說誰好誰不好,為不同的模型類別選擇合適的場景是設計者的工作。沒有工具本身的問題,只有工具使用者的問題。

           

           

          貧血模型是指領域對象里只有get和set方法(POJO),所有的業(yè)務邏輯都不包含在內而是放在Business Logic層。

           


           

          優(yōu)點是系統(tǒng)的層次結構清楚,各層之間單向依賴,Client->(Business Facade)->Business Logic->Data Access Object。可見,領域對象幾乎只作傳輸介質之用,不會影響到層次的劃分。

           

          該模型的缺點是不夠面向對象,領域對象只是作為保存狀態(tài)或者傳遞狀態(tài)使用,它是沒有生命的,只有數(shù)據(jù)沒有行為的對象不是真正的對象,在Business Logic里面處理所有的業(yè)務邏輯,對于細粒度的邏輯處理,通過增加一層Facade達到門面包裝的效果。

           

          在使用Spring的時候,通常暗示著你使用了貧血模型,我們把Domain類用來單純地存儲數(shù)據(jù),Spring管不著這些類的注入和管理,Spring關心的邏輯層(比如單例的被池化了的Business Logic層)可以被設計成singleton的bean。

           

          假使我們這里逆天而行,硬要在Domain類中提供業(yè)務邏輯方法,那么我們在使用Spring構造這樣的數(shù)據(jù)bean的時候就遇到許多麻煩,比如:bean之間的引用,可能引起大范圍的bean之間的嵌套構造器的調用。

           

          貧血模型實施的最大難度在于如何梳理好Business Logic層內部的劃分關系,由于該層會比較龐大,邊界不易控制,內部的各個模塊之間的依賴關系不易管理,可以考慮這樣這樣的實現(xiàn)思路:

          (1)鋪設扁平的原子業(yè)務邏輯層,即簡單的CRUD操作(含批量數(shù)據(jù)操作);

          (2)特定業(yè)務清晰的邏輯通過Facade層來組裝原子操作實現(xiàn)。

          (3)給業(yè)務邏輯層實施模塊劃分,保持模塊之間的松耦合的關系。

           

          舉例說明:

          原子業(yè)務邏輯層(Service)提供了用戶模型的條件查詢方法:

          List<User> queryUser(Condition con)

          Facade層則提供了一種特定的業(yè)務場景的分子接口,滿足18歲的中國公民,內部實現(xiàn)調用的正是上述的原子接口:

          List<User> queryAdultChinese()

          Facade、Service層縱向劃分為幾個大的領域包:用戶、內容和產(chǎn)品。

           

           

          充血模型層次結構和上面的差不多,不過大多業(yè)務邏輯和持久化放在 Domain Object里面,Business Logic只是簡單封裝部分業(yè)務邏輯以及控制事務、權限等,這樣層次結構就變成Client->(Business Facade)->Business Logic->Domain Object->Data Access Object。

           


           

          它的優(yōu)點是面向對象,Business Logic符合單一職責,不像在貧血模型里面那樣包含所有的業(yè)務邏輯太過沉重。

           

          缺點是如何劃分業(yè)務邏輯,什么樣的邏輯應該放在Domain Object中,什么樣的業(yè)務邏輯應該放在Business Logic中,這是很含糊的。即使劃分好了業(yè)務邏輯,由于分散在Business Logic和Domain Object層中,不能更好的分模塊開發(fā)。熟悉業(yè)務邏輯的開發(fā)人員需要滲透到Domain Logic中去,而在Domian Logic又包含了持久化,對于開發(fā)者來說這十分混亂。  其次,如果Business Logic要控制事務并且為上層提供一個統(tǒng)一的服務調用入口點,它就必須把在Domain Logic里實現(xiàn)的業(yè)務邏輯全部重新包裝一遍,完全屬于重復勞動。

           

          使用RoR開發(fā)時, 每一個領域模型對象都可以具備自己的基礎業(yè)務方法,通常滿足充血模型的特征。充血模型更加適合較復雜業(yè)務邏輯的設計開發(fā)。

           

          充血模型的層次和模塊的劃分是一門學問,對開發(fā)人員要求亦較高,可以考慮定義這樣的一些規(guī)則:

          (1)事務控制不要放在領域模型的對象中實現(xiàn),可以放在facade中完成。

          (2)領域模型對象中只保留該模型驅動的一般方法,對于業(yè)務特征明顯的特異場景方法調用放在facade中完成。

           

           

          萬事都不是絕對的,也有一些看起來不易解決的問題。例如,考慮到性能的需要,我需要一次查詢出滿足某種條件的用戶和某種條件的產(chǎn)品,他們二者之間通過訂購關系關聯(lián)起來,可能發(fā)現(xiàn)這種情形下,上述的模型層次劃分變得無解了……

           

          怎么辦呢?包括以上種種,歡迎大家討論。


          轉自:

          http://raychase.iteye.com/blog/1328224

          posted @ 2012-07-26 14:03 小胡子 閱讀(174) | 評論 (0)編輯 收藏

          簡介: EhCache 是一個純 Java 的進程內緩存框架,具有快速、精干等特點,是 Hibernate 中默認的 CacheProvider。本文充分的介紹了 EhCache 緩存系統(tǒng)對集群環(huán)境的支持以及使用方法。

          本文的標簽:  java, 不錯, 緩存

          發(fā)布日期: 2010 年 4 月 01 日
          級別: 初級
          訪問情況 : 13809 次瀏覽
          評論: 1 (查看 | 添加評論 - 登錄)

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

          EhCache 緩存系統(tǒng)簡介

          EhCache 是一個純 Java 的進程內緩存框架,具有快速、精干等特點,是 Hibernate 中默認的 CacheProvider。

          下圖是 EhCache 在應用程序中的位置:


          圖 1. EhCache 應用架構圖
          圖 1. EhCache 應用架構圖

          EhCache 的主要特性有:

          1. 快速;
          2. 簡單;
          3. 多種緩存策略;
          4. 緩存數(shù)據(jù)有兩級:內存和磁盤,因此無需擔心容量問題;
          5. 緩存數(shù)據(jù)會在虛擬機重啟的過程中寫入磁盤;
          6. 可以通過 RMI、可插入 API 等方式進行分布式緩存;
          7. 具有緩存和緩存管理器的偵聽接口;
          8. 支持多緩存管理器實例,以及一個實例的多個緩存區(qū)域;
          9. 提供 Hibernate 的緩存實現(xiàn);
          10. 等等 …

          由于 EhCache 是進程中的緩存系統(tǒng),一旦將應用部署在集群環(huán)境中,每一個節(jié)點維護各自的緩存數(shù)據(jù),當某個節(jié)點對緩存數(shù)據(jù)進行更新,這些更新的數(shù)據(jù)無法在其它節(jié)點中共享, 這不僅會降低節(jié)點運行的效率,而且會導致數(shù)據(jù)不同步的情況發(fā)生。例如某個網(wǎng)站采用 A、B 兩個節(jié)點作為集群部署,當 A 節(jié)點的緩存更新后,而 B 節(jié)點緩存尚未更新就可能出現(xiàn)用戶在瀏覽頁面的時候,一會是更新后的數(shù)據(jù),一會是尚未更新的數(shù)據(jù),盡管我們也可以通過 Session Sticky 技術來將用戶鎖定在某個節(jié)點上,但對于一些交互性比較強或者是非 Web 方式的系統(tǒng)來說,Session Sticky 顯然不太適合。所以就需要用到 EhCache 的集群解決方案。

          EhCache 從 1.7 版本開始,支持五種集群方案,分別是:

          • Terracotta
          • RMI
          • JMS
          • JGroups
          • EhCache Server

          本文主要介紹其中的三種最為常用集群方式,分別是 RMI、JGroups 以及 EhCache Server 。

          回頁首

          RMI 集群模式

          RMI 是 Java 的一種遠程方法調用技術,是一種點對點的基于 Java 對象的通訊方式。EhCache 從 1.2 版本開始就支持 RMI 方式的緩存集群。在集群環(huán)境中 EhCache 所有緩存對象的鍵和值都必須是可序列化的,也就是必須實現(xiàn) java.io.Serializable 接口,這點在其它集群方式下也是需要遵守的。

          下圖是 RMI 集群模式的結構圖:


          圖 2. RMI 集群模式結構圖
          圖 2. RMI 集群模式結構圖

          采用 RMI 集群模式時,集群中的每個節(jié)點都是對等關系,并不存在主節(jié)點或者從節(jié)點的概念,因此節(jié)點間必須有一個機制能夠互相認識對方,必須知道其它節(jié)點的信息,包括 主機地址、端口號等。EhCache 提供兩種節(jié)點的發(fā)現(xiàn)方式:手工配置和自動發(fā)現(xiàn)。手工配置方式要求在每個節(jié)點中配置其它所有節(jié)點的連接信息,一旦集群中的節(jié)點發(fā)生變化時,需要對緩存進行重 新配置。

          由于 RMI 是 Java 中內置支持的技術,因此使用 RMI 集群模式時,無需引入其它的 Jar 包,EhCache 本身就帶有支持 RMI 集群的功能。使用 RMI 集群模式需要在 ehcache.xml 配置文件中定義 cacheManagerPeerProviderFactory 節(jié)點。假設集群中有兩個節(jié)點,分別對應的 RMI 綁定信息是:

          節(jié)點 1 192.168.0.11 4567 /oschina_cache
          節(jié)點 2 192.168.0.12 4567 /oschina_cache
          節(jié)點 3 192.168.0.13 4567 /oschina_cache

          那么對應的手工配置信息如下:


          <cacheManagerPeerProviderFactory      
             
          class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"      
             properties
          ="hostName=localhost,     
             port=4567,     
             socketTimeoutMillis
          =2000,     
             peerDiscovery
          =manual,     
             rmiUrls
          =//192.168.0.12:4567/oschina_cache|//192.168.0.13:4567/oschina_cache" />

          其它節(jié)點配置類似,只需把 rmiUrls 中的兩個 IP 地址換成另外兩個節(jié)點對應的 IP 地址即可。

          接下來在需要進行緩存數(shù)據(jù)復制的區(qū)域(Region)上配置如下即可:


          <cache name="sampleCache2"     
           maxElementsInMemory
          ="10"     
           eternal
          ="false"     
           timeToIdleSeconds
          ="100"     
           timeToLiveSeconds
          ="100"     
           overflowToDisk
          ="false">     
          <cacheEventListenerFactory         
           
          class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"         
           properties
          ="replicateAsynchronously=true,      
           replicatePuts=true,      
           replicateUpdates
          =true,         
           replicateUpdatesViaCopy
          =false,      
           replicateRemovals
          =true "/> 
          </cache>

          具體每個參數(shù)代表的意義請參考 EhCache 的手冊,此處不再詳細說明。

          EhCache 的 RMI 集群模式還有另外一種節(jié)點發(fā)現(xiàn)方式,就是通過多播( multicast )來維護集群中的所有有效節(jié)點。這也是最為簡單而且靈活的方式,與手工模式不同的是,每個節(jié)點上的配置信息都相同,大大方便了節(jié)點的部署,避免人為的錯漏出現(xiàn)。

          在上述三個節(jié)點的例子中,配置如下:


          <cacheManagerPeerProviderFactory     
           
          class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
           properties
          ="peerDiscovery=automatic, 
           multicastGroupAddress=230.0.0.1,    
           multicastGroupPort
          =4446, timeToLive=32" />

          其中需要指定節(jié)點發(fā)現(xiàn)模式 peerDiscovery 值為 automatic 自動;同時組播地址可以指定 D 類 IP 地址空間,范圍從 224.0.1.0 到 238.255.255.255 中的任何一個地址。

          回頁首

          JGroups 集群模式

          EhCache 從 1.5. 版本開始增加了 JGroups 的分布式集群模式。與 RMI 方式相比較, JGroups 提供了一個非常靈活的協(xié)議棧、可靠的單播和多播消息傳輸,主要的缺點是配置復雜以及一些協(xié)議棧對第三方包的依賴。

          JGroups 也提供了基于 TCP 的單播 ( Unicast ) 和基于 UDP 的多播 ( Multicast ) ,對應 RMI 的手工配置和自動發(fā)現(xiàn)。使用單播方式需要指定其它節(jié)點的主機地址和端口,下面是兩個節(jié)點,并使用了單播方式的配置:


          <cacheManagerPeerProviderFactory     
           
          class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory" 
           properties
          ="connect=TCP(start_port=7800):         
           TCPPING(initial_hosts=host1[7800],host2[7800]; port_range=10;timeout=3000;     
           num_initial_members
          =3;up_thread=true;down_thread=true):         
           VERIFY_SUSPECT(timeout
          =1500;down_thread=false;up_thread=false):         
           pbcast.NAKACK(down_thread
          =true;up_thread=true;gc_lag=100;     
           retransmit_timeout
          =3000):         
           pbcast.GMS(join_timeout
          =5000;join_retry_timeout=2000;shun=false;         
           print_local_addr
          =false;down_thread=true;up_thread=true)" propertySeparator="::" />

          使用多播方式配置如下:


          <cacheManagerPeerProviderFactory     
           
          class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"     
           properties
          ="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;):PING:MERGE2:FD_SOCK:VERIFY_SUSPECT:pbcast.NAKACK:UNICAST:pbcast.STABLE:FRAG:pbcast.GMS"     propertySeparator="::" />

          從上面的配置來看,JGroups 的配置要比 RMI 復雜得多,但也提供更多的微調參數(shù),有助于提升緩存數(shù)據(jù)復制的性能。詳細的 JGroups 配置參數(shù)的具體意義可參考 JGroups 的配置手冊。

          JGroups 方式對應緩存節(jié)點的配置信息如下:


          <cache name="sampleCache2"     
           maxElementsInMemory
          ="10"     
           eternal
          ="false"     
           timeToIdleSeconds
          ="100"     
           timeToLiveSeconds
          ="100"     
           overflowToDisk
          ="false">     
          <cacheEventListenerFactory
           
          class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
           properties
          ="replicateAsynchronously=true, 
           replicatePuts=true,        
           replicateUpdates
          =true
           replicateUpdatesViaCopy
          =false, replicateRemovals=true" /> 
          </cache>

          使用組播方式的注意事項

          使用 JGroups 需要引入 JGroups 的 Jar 包以及 EhCache 對 JGroups 的封裝包 ehcache-jgroupsreplication-xxx.jar 。

          在一些啟用了 IPv6 的電腦中,經(jīng)常啟動的時候報如下錯誤信息:

          java.lang.RuntimeException: the type of the stack (IPv6) and the user supplied addresses (IPv4) don't match: /231.12.21.132.

          解決的辦法是增加 JVM 參數(shù):-Djava.net.preferIPv4Stack=true。如果是 Tomcat 服務器,可在 catalina.bat 或者 catalina.sh 中增加如下環(huán)境變量即可:


          SET CATALINA_OPTS=-Djava.net.preferIPv4Stack=true 

          經(jīng)過實際測試發(fā)現(xiàn),集群方式下的緩存數(shù)據(jù)都可以在 1 秒鐘之內完成到其節(jié)點的復制。

          回頁首

          EhCache Server

          與前面介紹的兩種集群方案不同的是, EhCache Server 是一個獨立的緩存服務器,其內部使用 EhCache 做為緩存系統(tǒng),可利用前面提到的兩種方式進行內部集群。對外提供編程語言無關的基于 HTTP 的 RESTful 或者是 SOAP 的數(shù)據(jù)緩存操作接口。

          下面是 EhCache Server 提供的對緩存數(shù)據(jù)進行操作的方法:

          OPTIONS /{cache}}

          獲取某個緩存的可用操作的信息。

          HEAD /{cache}/{element}

          獲取緩存中某個元素的 HTTP 頭信息,例如:


          curl --head  http://localhost:8080/ehcache/rest/sampleCache2/2 

          EhCache Server 返回的信息如下:


          HTTP/1.1 200 OK  X-Powered-By: Servlet/2.5  
          Server: GlassFish
          /v3  Last-Modified: Sun, 27 Jul 2008 08:08:49 GMT  
          ETag: 
          "1217146129490" Content-Type: text/plain; charset=iso-8859-1  
          Content
          -Length: 157  Date: Sun, 27 Jul 2008 08:17:09 GMT 

          GET /{cache}/{element}

          讀取緩存中某個數(shù)據(jù)的值。

          PUT /{cache}/{element}

          寫緩存。

          由于這些操作都是基于 HTTP 協(xié)議的,因此你可以在任何一種編程語言中使用它,例如 Perl、PHP 和 Ruby 等等。

          下圖是 EhCache Server 在應用中的架構:


          圖 3. EhCache Server 應用架構圖
          圖 3. EhCache Server 應用架構圖

          EhCache Server 同時也提供強大的安全機制、監(jiān)控功能。在數(shù)據(jù)存儲方面,最大的 Ehcache 單實例在內存中可以緩存 20GB。最大的磁盤可以緩存 100GB。通過將節(jié)點整合在一起,這樣緩存數(shù)據(jù)就可以跨越節(jié)點,以此獲得更大的容量。將緩存 20GB 的 50 個節(jié)點整合在一起就是 1TB 了。

          回頁首

          總結

          以上我們介紹了三種 EhCache 的集群方案,除了第三種跨編程語言的方案外,EhCache 的集群對應用程序的代碼編寫都是透明的,程序人員無需考慮緩存數(shù)據(jù)是如何復制到其它節(jié)點上。既保持了代碼的輕量級,同時又支持龐大的數(shù)據(jù)集群。 EhCache 可謂是深入人心。

          2009 年年中,Terracotta 宣布收購 EhCache 產(chǎn)品。Terracotta 公司的產(chǎn)品 Terracotta 是一個 JVM 級的開源群集框架,提供 HTTP Session 復制、分布式緩存、POJO 群集、跨越集群的 JVM 來實現(xiàn)分布式應用程序協(xié)調。最近 EhCache 主要的改進都集中在跟 Terracotta 框架的集成上,這是一個真正意義上的企業(yè)級緩存解決方案。


          參考資料

          學習

          獲得產(chǎn)品和技術

          討論

          關于作者

          劉柄成,開源中國社區(qū)(http://www.oschina.net)站長,DLOG4J 作者,十年的 Java 開發(fā)經(jīng)驗,熱衷于開源軟件的開發(fā)和應用。


          http://www.ibm.com/developerworks/cn/java/j-lo-ehcache/

          posted @ 2012-07-26 13:09 小胡子 閱讀(172) | 評論 (0)編輯 收藏

          僅列出標題
          共15頁: First 上一頁 6 7 8 9 10 11 12 13 14 下一頁 Last 
          主站蜘蛛池模板: 建宁县| 晋中市| 宁都县| 白山市| 长岛县| 根河市| 外汇| 绥中县| 子洲县| 焉耆| 游戏| 利川市| 莫力| 洛阳市| 孝感市| 青神县| 泾川县| 包头市| 樟树市| 建瓯市| 都匀市| 崇义县| 抚宁县| 斗六市| 罗甸县| 来安县| 阿坝| 拜城县| 新泰市| 晋州市| 县级市| 安丘市| 南皮县| 达拉特旗| 鄯善县| 杭锦旗| 德格县| 边坝县| 夏津县| 饶平县| 靖远县|