<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-179  評論-666  文章-29  trackbacks-0
     
    阿里云服務(wù)器優(yōu)惠券

    配置rsync 同步數(shù)據(jù)     rpm包安裝rsync及配置

    [root@Hammer home]# rpm -qa |grep rsync                 #檢查系統(tǒng)是否安裝了rsync軟件包
    rsync-2.6.8-3.1
    [root@Hammer CentOS]# rpm -ivh rsync-2.6.8-3.1.i386.rpm # 如果沒有安裝則手動安裝

    [root@test rsync-3.0.4]# vim /etc/xinetd.d/rsync


    1 配置rsync servervi /etc/xinetd.d/rsync
    將disable=yes改為no

    service rsync
    {
            disable = no
            socket_type     = stream
            wait            = no
            user            = root
            server          = /usr/bin/rsync
            server_args     = --daemon
            log_on_failure  += USERID
    }

    2 配置rsync自動啟動
    [root@test etc]# chkconfig rsync on
    [root@test etc]# chkconfig rsync --list
    rsync           on

    3 配置rsyncd.conf
    [root@test etc]# vim rsyncd.conf

    uid = root
    gid = root
    use chroot = no
    max connections = 4
    strict modes = yes
    port = 873
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log

    [backup]
    path = /srv
    comment = This is test
    auth users = scihoo
    uid = root
    gid = root
    secrets file = /home/rsync.ps
    read only = no
    list = no


    4 確保etc/services中rsync端口號正確
    [root@test etc]# vim /etc/services
    rsync           873/tcp                         # rsync
    rsync           873/udp                         # rsync

    5 配置rsync密碼(在上邊的配置文件中已經(jīng)寫好路徑)/home/rsync.ps(名字隨便寫,只要和上邊配置文件里的一致即可),格式(一行一個用戶)
    [root@test etc]# vi /home/rsync.ps
    scihoo:scihoo

    6 配置rsync密碼文件權(quán)限
    [root@test home]# chown root.root rsync.ps
    [root@test home]# chmod 400 rsync.ps

    7 啟動配置
    [root@test home]# /etc/init.d/xinetd restart
    Stopping xinetd:                                           [  OK  ]
    Starting xinetd:                                           [  OK  ]

    8 如果xinetd沒有的話,需要安裝一下
    [root@test home]# yum -y install xinetd


     啟動rsync server
      RSYNC服務(wù)端啟動的兩種方法
    9、啟動rsync服務(wù)端(獨立啟動)
    [root@test home]# /usr/bin/rsync --daemon

    10、啟動rsync服務(wù)端 (有xinetd超級進(jìn)程啟動)
    [root@test home]# /etc/init.d/xinetd reload

    11  加入rc.local
    在各種操作系統(tǒng)中,rc文件存放位置不盡相同,可以修改使系統(tǒng)啟動時把rsync --daemon加載進(jìn)去。
    [root@test home]# vi /etc/rc.local
    /usr/local/rsync –daemon           #加入一行

    12 檢查rsync是否啟動
    [root@test home]# lsof -i :873
    COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
    xinetd  4396 root    5u  IPv4 633387       TCP *:rsync (LISTEN)




    客戶端配置
    1 配置三個過程就可以了
      1.1 設(shè)定密碼文件
      1.2 測試rsync執(zhí)行指令
      1.3 將rsync指令放入工作排程(crontab)
    [root@aj1 home]# vi /etc/xinetd.d/rsync

    # default: off
    # description: The rsync server is a good addition to an ftp server, as it \
    #       allows crc checksumming etc.
    service rsync
    {
            disable = yes
            socket_type     = stream
            wait            = no
            user            = root
            server          = /usr/bin/rsync
            server_args     = --daemon
            log_on_failure  += USERID
    }

    1.1  配置密碼文件  (注:為了安全,設(shè)定密碼檔案的屬性為:600。rsync.ps的密碼一定要和Rsync Server密碼設(shè)定案里的密碼一樣)
    [root@aj1 home]# vi rsync.ps
    sciooo

    [root@aj1 home]# chown root.root .rsync.ps   # 注意必須給權(quán)限
    [root@aj1 home]# chmod 600 .rsync.ps         # 必須修改權(quán)限

    1.2 從服務(wù)器上下載文件
    [root@aj1 rsync-3.0.4]# rsync -avz --password-file=/home/rsync.ps scihoo@192.168.0.206::backup /home/

       從本地上傳到服務(wù)器上去
    [root@aj1 rsync-3.0.4]# rsync -avz --password-file=/home/rsync.ps /home scihoo@192.168.0.206::backup

    http://www.linuxsir.org/main/?q=node/256#5.1

    http://os.51cto.com/art/201101/243374.htm

    阿里云服務(wù)器優(yōu)惠券
    posted @ 2011-06-30 15:04 Alpha 閱讀(15715) | 評論 (3)編輯 收藏

    前些時間在VMware上安裝了Gentoo Linux,用了當(dāng)前最新版的Gentoo,安裝過程記錄下來了,但一直沒有整理到blog上。今天重新整理一下,寫出來與大家分享和備用。接觸Gentoo不久,對這個版本還不是很熟。

    與其他Linux發(fā)行版相比,Gentoo確實有其優(yōu)勢的地方,如內(nèi)核基于源代碼編譯,可以自動優(yōu)化與定制,升級方便等!

    關(guān)于Gentoo發(fā)行版的介紹請看:全球最受歡迎的十大Linux發(fā)行版(圖)

    Host機(jī)環(huán)境:Win2008 + VMware 7.1

    下載安裝包

    下載安裝 CD 和 stage3 包:

    http://www.gentoo.org/main/en/where.xml

    我用的是 x86平臺的:

    http://distfiles.gentoo.org/releases/x86/autobuilds/current-iso/

    wget -c http://distfiles.gentoo.org/releases/x86/autobuilds/current-iso/install-x86-minimal-20100216.iso

    wget -c http://distfiles.gentoo.org/releases/x86/autobuilds/current-iso/stage3-i686-20100216.tar.bz2

    wget -c http://distfiles.gentoo.org/snapshots/portage-20100617.tar.bz2

    最新的stage3包在這里:http://distfiles.gentoo.org/releases/x86/autobuilds/current-stage3/

    開始安裝

    將安裝 CD 插入虛擬機(jī),默認(rèn)引導(dǎo)進(jìn)入終端。

    先配置好網(wǎng)絡(luò),之后的操作可以全部通過 ssh 連接來操作。

    ifconfig eth0 192.168.80.133(我這里VM已經(jīng)自動分配了這個內(nèi)網(wǎng)IP了。)
    echo nameserver 8.8.8.8 > /etc/resolv.conf
    echo nameserver 8.8.4.4 > /etc/resolv.conf

    設(shè)置 root 用戶密碼:

    passwd root

    啟動 sshd 服務(wù):

    /etc/init.d/sshd start

    windows上用SecureCRT或PuTTY連接虛擬機(jī)操作。

    磁盤分區(qū)

    先分區(qū),建議使用cfdisk,先查看分區(qū)情況:

    cfdisk /dev/sda

    我的分區(qū)表(/boot分區(qū)我單獨分出來),/dev/sda2是/根分區(qū),/dev/sda3是swap分區(qū):

    格式化分區(qū):

    mkfs.ext3 /dev/sda1
    mkfs.ext3 /dev/sda2
    mkswap /dev/sda3

    激活swap交換分區(qū):

    swapon /dev/sda3

    將分區(qū)信息寫入fstab配置文件:(注:gentoo-minimal沒帶vi編輯器,只帶有nano編輯器。)

    nano -w /etc/fstab

    寫入下面的分區(qū)信息:

    /dev/sda1 /boot ext3 noauto,noatime 1 2
    /dev/sda2 / ext3 noatime 0 1
    /dev/sda3 none swap sw 0 0

    解壓 stage3 和 portage

    創(chuàng)建基本目錄結(jié)構(gòu):

    mount /dev/sda2 /mnt/gentoo
    mkdir /mnt/gentoo/boot
    mount /dev/sda1 /mnt/gentoo/boot
    cd /mnt/gentoo

    使用WinSCP或CuteFTP 上傳 stage3 軟件包到 /mnt/gentoo下,然后解壓:

    (注:上面標(biāo)簽的地址之前沒改過來,實際地址是192.168.80.133)

    tar jxvf stage3-i686-20100608.tar.bz2
    rm -f stage3-i686-20100608.tar.bz2

    上傳 portage 包到 /mnt/gentoo/usr,然后解壓:

    tar jxvf portage-20100617.tar.bz2
    rm -f portage-20100617.tar.bz2

    切換系統(tǒng)

    cd /
    mount -t proc proc /mnt/gentoo/proc
    mount -o bind /dev /mnt/gentoo/dev
    cp -L /etc/resolv.conf /mnt/gentoo/etc/
    chroot /mnt/gentoo /bin/bash
    env-update && source /etc/profile

    主機(jī)域名設(shè)置

    cd /etc
    echo “127.0.0.1 gentoo.at.home gentoo localhost” > hosts
    sed -i -e ’s/HOSTNAME.*/HOSTNAME=”gentoo”/’ conf.d/hostname
    hostname gentoo

    編譯安裝內(nèi)核

    lsmod

    找到網(wǎng)卡驅(qū)動模塊:

    floppy 55736 0
    rtc 7960 0
    tg3 103228 0
    libphy 24952 1 tg3
    e1000 114636 0
    fuse 59344 0
    jfs 153104 0
    raid10 20648 0

    下載源碼,配置內(nèi)核:

    emerge –sync
    emerge gentoo-sources
    cd /usr/src/linux
    make menuconfig

    在配置界面輸入/e1000,搜索 e1000,找到驅(qū)動所在位置:

    | Symbol: E1000 [=y]
    | Prompt: Intel(R) PRO/1000 Gigabit Ethernet support
    | Defined at drivers/net/Kconfig:2020
    | Depends on: NETDEVICES && NETDEV_1000 && PCI
    | Location:
    | -> Device Drivers
    | -> Network device support (NETDEVICES [=y])
    | -> Ethernet (1000 Mbit) (NETDEV_1000 [=y])

    這里一定要注意,選對內(nèi)核的網(wǎng)卡驅(qū)動!

    虛擬機(jī)的硬盤使用的 SCSI 適配器為 LSI Logic。

    需要增加對 Fusion MPT base driver 的支持(見 dmesg 日志):

    Device Drivers —>
    — Fusion MPT device support
    <*> Fusion MPT ScsiHost drivers for SPI
    <*> Fusion MPT ScsiHost drivers for FC
    <*> Fusion MPT ScsiHost drivers for SAS
    (128) Maximum number of scatter gather entries (16 – 128)
    <*> Fusion MPT misc device (ioctl) driver

    必須添加這個驅(qū)動,否則系統(tǒng)啟動時可能出現(xiàn)類似以下錯誤:

    VFS: Unable to mount root fs via NFS, trying floppy.
    VFS: Cannot open root device “sda2”or unknown-block(2,0)
    Please append a correct “root=” boot option; here are the available partitions:
    0b00 1048575 sr0 driver: sr
    Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

    增加對 ext4文件系統(tǒng)的支持:

    File systems —>
    <*> Second extended fs support
    [*] Ext4 extended attributes
    [*] Ext4 POSIX Access Control Lists
    [*] Ext4 Security Labels
    [*] Ext4 debugging support

    開始編譯內(nèi)核:

    make -j2
    make modules_install
    cp arch/x86/boot/bzImage /boot/kernel

    安裝配置 grub

    emerge grub

    grub
    > root (hd0,0)
    > setup (hd0)
    > quit

    編輯啟動配置文件grub.conf:

    nano -w /boot/grub/grub.conf

    grub.conf 內(nèi)容如下:

    default 0
    timeout 9

    title Gentoo
    root (hd0,0)
    kernel /boot/kernel root=/dev/sda2

    系統(tǒng)配置

    文件系統(tǒng)掛載點:

    nano -w /etc/fstab
    /dev/sda1 /boot ext3 noauto,noatime 1 2
    /dev/sda2 / ext3 noatime 0 1
    /dev/sda3 none swap sw 0 0

    網(wǎng)絡(luò)設(shè)置:

    echo ‘config_eth0=( “192.168.80.133″ )’ >> /etc/conf.d/net
    echo ‘routes_eth0=( “default via 192.168.80.2″ )’ >> /etc/conf.d/net

    SSH服務(wù)設(shè)置:

    rc-update add sshd default

    時區(qū)設(shè)置:

    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    nano -w /etc/conf.d/clock

    設(shè)置 root 密碼:

    passwd root

    重啟,完成安裝

    exit
    umount /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo/boot /mnt/gentoo
    reboot

    如圖,Gentoo啟動成功:

    OK,完成!

    附 make.conf

    CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer -mmmx -msse -msse2"
    CXXFLAGS
    ="${CFLAGS}"
    MAKEOPTS
    ="-j5"
    CHOST
    ="x86_64-pc-linux-gnu"
    USE="jpeg ssl nls unicode cjk zh nptl nptlonly mmx sse sse2 -X -gtk -gnome \
         sasl maildir imap libwww mysql xml sockets vhosts snmp \
         -lvm -lvm1 -kde -qt -cups -alsa -apache
    "
    ACCEPT_KEYWORDS
    ="~amd64"
    LINGUAS
    ="zh_CN"
    SYNC
    ="rsync://rsync.asia.gentoo.org/gentoo-portage"
    GENTOO_MIRRORS
    ="http://mirrors.163.com/gentoo ftp://gg3.net/pub/linux/gentoo"

    VIDEO_CARDS
    ="vesa"

    ALSA_CARDS
    =""
    ALSA_PCM_PLUGINS
    =""
    APACHE2_MODULES
    =""
    QEMU_SOFTMMU_TARGETS
    ="i386 x86_64"
    QEMU_USER_TARGETS
    ="i386 x86_64"


    參考文檔  http://www.gentoo.org/doc/zh_cn/handbook/handbook-amd64.xml

    參考:http://www.ha97.com/





    posted @ 2011-06-28 16:03 Alpha 閱讀(3993) | 評論 (1)編輯 收藏

    在頁面中使用gzip可以有效的減低頁面的大小,加快網(wǎng)頁的下載速度。在lighttpd中對php頁面進(jìn)行壓縮,需要兩個步驟:

    1. 編輯 lighttpd.conf

    將 “mod_compress” 設(shè)為啟用

    接著找到

    ## compress module

    在下面加入

    compress.cache-dir         = “/var/tmp/lighttpd/cache/”
    compress.filetype          = (”text/plain”, “text/html”, “text/css”, “text/javascript”)
     

    做完上面的動作后,
    基本上 .txt .html .css .js 的文件都會被Gzip壓縮了。但php此時還沒有壓縮

    對于動態(tài)的php文件,還需要在php.ini中做相關(guān)設(shè)置,否則.php頁面還是不使用壓縮模式
    2. 編輯 php.ini
    修改
    zlib.output_compression = On
    zlib.output_handler = On

    重新啟動Lighttpd。
    這樣php也壓縮了

    posted @ 2011-06-22 23:25 Alpha 閱讀(811) | 評論 (0)編輯 收藏

    Lighttpd 作為新一代的web server,以小巧(不到1M的大小)、快速而著稱,因為服務(wù)器上安裝了rails、java,并以lighttpd為前端代理服務(wù)器,不想再部署apache了,所以直接使用lighttpd來部署,順便看一下性能如何。

    本文主要介紹在CentOS下,配置一套用lighttp作為web server的php環(huán)境

    · 安裝Lighttpd
    從http://www.lighttpd.net/download/下載源碼
    安裝前先檢查pcre是否安裝,需要pcre和pcre-devel兩個包。 用yum search pcre\*檢查,如果都是installed就是都安裝了。否則安裝缺少的包。

    yum install pcre-devel

     

    tar xzvf lighttpd-1.4.23.tar.gz
    cd lighttpd-1.4.23
    ./configure –prefix=/usr/local/lighttpd
     

    configure完畢以后,會給出一個激活的模塊和沒有激活模塊的清單,可以檢查一下,是否自己需要的模塊都已經(jīng)激活,在enable的模塊中一定要有“mod_rewrite”這一項,否則重新檢查pcre是否安裝。然后編譯安裝:

    make && make install

    編譯后配置:

    cp doc/sysconfig.lighttpd /etc/sysconfig/lighttpd
    mkdir /etc/lighttpd
    cp doc/lighttpd.conf /etc/lighttpd/lighttpd.conf
     

    如果你的Linux是RedHat/CentOS,那么:

    cp doc/rc.lighttpd.redhat /etc/init.d/lighttpd
     

    如果你的Linux是SuSE,那么:

    cp doc/rc.lighttpd /etc/init.d/lighttpd
     

    其他Linux發(fā)行版本可以自行參考該文件內(nèi)容進(jìn)行修改。然后修改/etc/init.d/lighttpd,把

    lighttpd="/usr/sbin/lighttpd"
     

    改為

    lighttpd="/usr/local/lighttpd/sbin/lighttpd"
     

    此腳本用來控制lighttpd的啟動關(guān)閉和重起:

    /etc/init.d/lighttpd start
    /etc/init.d/lighttpd stop
    /etc/init.d/lighttpd restart
     

    如果你希望服務(wù)器啟動的時候就啟動lighttpd,那么:

    chkconfig lighttpd on
     

    這樣lighttpd就安裝好了,接下來需要配置lighttpd。

    配置Lighttpd

    修改/etc/lighttpd/lighttpd.conf
    1)server.modules
    取消需要用到模塊的注釋,mod_rewrite,mod_access,mod_fastcgi,mod_simple_vhost,mod_cgi,mod_compress,mod_accesslog是一般需要用到的。

    2)server.document-root, server.error-log,accesslog.filename需要指定相應(yīng)的目錄

    3)用什么權(quán)限來運行l(wèi)ighttpd
    server.username = “nobody”
    server.groupname = “nobody”
    從安全角度來說,不建議用root權(quán)限運行web server,可以自行指定普通用戶權(quán)限。

    4)靜態(tài)文件壓縮
    compress.cache-dir = “/tmp/lighttpd/cache/compress”
    compress.filetype = (“text/plain”, “text/html”,”text/javascript”,”text/css”)
    可以指定某些靜態(tài)資源類型使用壓縮方式傳輸,節(jié)省帶寬,對于大量AJAX應(yīng)用來說,可以極大提高頁面加載速度。

    5)配置ruby on rails

    最簡單的配置如下:

    $HTTP["host"] == "www.xxx.com" {
     server.document-root = "/yourrails/public"
     server.error-handler-404 = "/dispatch.fcgi"
     fastcgi.server = (".fcgi" =>
        ("localhost" =>
          ("min-procs" => 10,
           "max-procs" => 10,
           "socket" => "/tmp/lighttpd/socket/rails.socket",
           "bin-path" => "/yourrails/public/dispatch.fcgi",
           "bin-environment" => ("RAILS_ENV" => "production")
          )
        )
     )
    }
     

    即由lighttpd啟動10個FCGI進(jìn)程,lighttpd和FCGI之間使用本機(jī)Unix Socket通信。

    如果想指定www.abc.com以及所有二級域名,則需要把第一行改為
    $HTTP[”host”] =~ “(^|\.)abc\.com” {

    }

    如果要設(shè)置代理,比如lighttpd和tomcat整合,tomcat放在lighttpd后面,則需要通過代理訪問tomcat

    $HTTP["host"] =~ “www.domain.cn” {
    proxy.server = ( “” => ( “localhost” => ( “host”=> “127.0.0.1″, “port”=> 8080 ) ) )
    }

    則www.domain.cn為主機(jī)的網(wǎng)址都交給tomcat處理,tomcat的端口號為8080. 在tomcat的虛擬主機(jī)中,需要捕獲www.domain.cn這個主機(jī)名,設(shè)置這個虛擬主機(jī)。這里的host都是跟tomcat里面的虛擬主機(jī)對應(yīng)的。

    · 安裝支持fastcgi的PHP
    安裝PHP所需的相關(guān)類庫
    curl

    wget http://curl.cs.pu.edu.tw/download/curl-7.19.5.tar.bz2

     

    tar xvjf curl-7.19.5.tar.bz2
    cd curl-7.19.5
    ./configure –prefix=/usr/local/curl
    make
    make
    install
     

    gettext

    wget ftp://ftp.ntu.edu.tw/pub/gnu/gnu/gettext/gettext-0.17.tar.gz
    tar xvzf gettext-0.17.tar.gz
    cd gettext-0.17
    ./configure –prefix=/usr/local/gettext
    make
    make
    install
     

    zlib

    wget http://kent.dl.sourceforge.net/sourceforge/libpng/zlib-1.2.3.tar.gz
    tar xvzf zlib-1.2.3.tar.gz
    cd zlib-1.2.3
    ./configure –prefix=/usr/local/zlib
    make && make install
     

    libpng

    wget http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/l/li/libpng/libpng-1.2.9.tar.gz
    tar xvzf libpng-1.2.9.tar.gz
    cd libpng-1.2.9
    ./configure –prefix=/usr/local/libpng
    make && make install
     

    jpeg

    wget http://www.ijg.org/files/jpegsrc.v6b.tar.gz
    tar xvzf jpegsrc.v6b.tar.gz
    cd jpeg-6b/
    ./configure –prefix=/usr/local/jpeg6
    make

     

    mkdir /usr/local/jpeg6/bin
    mkdir -p /usr/local/jpeg6/bin
    mkdir -p /usr/local/jpeg6/man/man1
    mkdir -p /usr/local/jpeg6/lib
    mkdir -p /usr/local/jpeg6/include
    make install-lib
    make install
     

    freetype

    wget http://download.savannah.gnu.org/releases/freetype/freetype-2.3.9.tar.gz
    tar xvzf freetype-2.3.9.tar.gz
    cd freetype-2.3.9
    ./configure –prefix=/usr/local/freetype2
    make
    make
    install
     

    gd

    wget http://www.libgd.org/releases/gd-2.0.35.tar.gz
    tar xvzf gd-2.0.35.tar.gz
    cd gd-2.0.35
    ./configure –prefix=/usr/local/gd2 –with-zlib=/usr/local/zlib/ –with-png=/usr/local/libpng/ –with-jpeg=/usr/local/jpeg6/ –with-freetype=/usr/local/freetype2/
    make
    如果第一次make出錯,試著再make一次,我就是這樣,第二次就對了。
    make install
     

    PHP

    tar xvzf php-5.2.10.tar.gz
    cd php-5.2.10
    ./configure –prefix=/usr/local/php –with-mysql=/usr/local/mysql –with-pdo-mysql=/usr/local/mysql –with-jpeg-dir=/usr/local/jpeg6/ –with-png-dir=/usr/local/libpng/ –with-gd=/usr/local/gd2/ –with-freetype-dir=/usr/local/freetype2/  –with-zlib-dir=/usr/local/zlib –with-curl=/usr/local/curl –with-gettext=/usr/local/gettext –enable-fastcgi –enable-zend-multibyte –with-config-file-path=/etc –enable-discard-path –enable-force-cgi-redirect
    make
    make
    install
    cp
    php.ini-dist /etc/php.ini

     

    可以使用php -m查看你安裝的模塊
     

    eAccelerator
    eAccelerator是一個開源的PHP加速器

    wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
    tar xjvf eaccelerator-0.9.5.3.tar.bz2
    cd eaccelerator-0.9.5.3
    export PHP_PREFIX="/usr/local/php"
    $PHP_PREFIX/bin/phpize
    ./configure –enable-eaccelerator=shared –with-php-config=$PHP_PREFIX/bin/php-config
    make
    make
    install
     

    執(zhí)行好后,會提示安裝到的路徑,下面會用到,如我的被安裝到這里
    /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613
    編輯php.ini中的內(nèi)容
    vim /etc/php.ini

    cgi.fix_pathinfo = 1

     

    zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
    eaccelerator.shm_size="16"
    eaccelerator.cache_dir="/tmp/eaccelerator"
    eaccelerator.enable="1"
    eaccelerator.optimizer="1"
    eaccelerator.check_mtime="1"
    eaccelerator.debug="0"
    eaccelerator.filter=""
    eaccelerator.shm_max="0"
    eaccelerator.shm_ttl="0"
    eaccelerator.shm_prune_period="0"
    eaccelerator.shm_only="0"
    eaccelerator.compress="1"
    eaccelerator.compress_level="9"
     

    如果一切順利,你可以通過下面命令來驗證是否安裝成功

    $ php -v
    PHP 5.2.10 (cli) (built: Jun 20 2009 23:32:09)
    Copyright (c) 1997-2009 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
        with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
     

    修改/etc/lighttpd/lighttpd.conf文件,添加下面的配置
    vim /etc/lighttpd/lighttpd.conf

    fastcgi.server             = ( ".php" =>
                                   ( "localhost" =>
                                     (
                                       "socket" => "/tmp/php-fastcgi.socket",
                                       "bin-path" => "/usr/local/php/bin/php-cgi"
                                     )
                                   )
                                )
     

    重啟lighttpd

    /etc/init.d/lighttpd restart
     

    寫一個php測試文件在lighttpd的網(wǎng)站目錄里,測試php是否安裝成功

    http://blog.prosight.me/

    posted @ 2011-06-22 23:24 Alpha 閱讀(1792) | 評論 (0)編輯 收藏

    使用proxy可以使lighttpd成為一個代理服務(wù)器。例如將java的請求全都轉(zhuǎn)向給jboss來處理
    mod_proxy有三個標(biāo)簽:
    proxy.debug,0或者1. 表示是否啟動調(diào)試模式。 1表示啟動
    proxy.balance,使用負(fù)載均衡的模式。可以使“hash”,“round-robin”,”fair”三種模式之一。
    ’round-robin’ 交替輪訓(xùn), ‘hash’ 根據(jù)請求的url產(chǎn)生一個 hash值,來確保同樣的請求的url都訪問同樣的主機(jī)
    ‘fair’ is the normal load-based, passive balancing.

    語法結(jié)構(gòu)

     ( <extension> =>
          ( [ <name> => ]
            ( "host" => <string> ,
              "port" => <integer> ),
            ( "host" => <string> ,
              "port" => <integer> )
          ),
          <extension> => …
        )
     

    * : 表示請求url的文件擴(kuò)展名或者文件前綴 (如果以”/”開始); 可以是空 (“”) 表示所有的請求
    * : 可選名稱
    * “host”: 被代理的服務(wù)器的ip
    * “port”: 被代理服務(wù)器的端口,默認(rèn)是80

    如:

    proxy.server = ( ".jsp" =>
                           ( (
                               "host" => "10.0.0.242",
                               "port" => 8080
                             ) )
                         )
     

    再如:

    $HTTP["host"] == "www.domain.me" {
            proxy.server  = ( "" =>
            ( (
                    "host" => "127.0.0.1",
                    "port"=>"8080"  
            ) )
            )
    }
     

    負(fù)載均衡的例子,例如有8個squid緩存,需要用lighttpd做負(fù)載均衡

      $HTTP["host"] == "www.example.org" {
        proxy.balance = "hash"
        proxy.server  = ( "" => ( ( "host" => "10.0.0.10" ),
                                  ( "host" => "10.0.0.11" ),
                                  ( "host" => "10.0.0.12" ),
                                  ( "host" => "10.0.0.13" ),
                                  ( "host" => "10.0.0.14" ),
                                  ( "host" => "10.0.0.15" ),
                                  ( "host" => "10.0.0.16" ),
                                  ( "host" => "10.0.0.17" ) ) )
      }
     

    當(dāng)一個服務(wù)器宕機(jī)后,它上面的請求將被轉(zhuǎn)移給其他設(shè)備server

    posted @ 2011-06-22 23:20 Alpha 閱讀(2338) | 評論 (0)編輯 收藏
         摘要: 花了一個上午的時間研究nginx+tomcat的負(fù)載均衡測試,集群環(huán)境搭建比較順利,但是session同步的問題折騰了幾個小時才搞定,現(xiàn)把我的過程貼上來,以備用。 軟件及環(huán)境是: 虛擬機(jī)上裝centos 5.5 IP為:192.168.0.51 裝上nginx和tomcat  6.0.32 命名為 Tomcat1 一臺win7上裝tomcat  6.0.32 ...  閱讀全文
    posted @ 2011-06-21 15:38 Alpha 閱讀(20447) | 評論 (5)編輯 收藏
    CATALINA_BASE D:\tomcat
    CATALINA_HOME D:\tomcat
    CLASSPATH .;D:\Java\jdk1.6.0_24\lib;D:\Java\jdk1.6.0_24\lib\dt.jar;D:\Java\jdk1.6.0_24\lib\tools.jar;D:\tomcat\lib\servlet-api.jar
    JAVA_HOME D:\Java\jdk1.6.0_24
    Path ;D:\Java\jdk1.6.0_24\bin
    TOMCAT_HOME D:\tomcat
    posted @ 2011-05-09 16:29 Alpha 閱讀(594) | 評論 (0)編輯 收藏

    數(shù)據(jù)的唯一性是所有應(yīng)用程序非常基本的要求,由開發(fā)者或者用戶來維護(hù)這種唯一性存在著較大的風(fēng)險,因此,由系統(tǒng)自動產(chǎn)生唯一標(biāo)識是一種常見的做法。OpenJPA 中支持四種不同的實體標(biāo)識自動生成策略:

    • 容器自動生成的實體標(biāo)識;
    • 使用數(shù)據(jù)庫的自動增長字段生成實體標(biāo)識;
    • 根據(jù)數(shù)據(jù)庫序列號(Sequence)技術(shù)生成實體標(biāo)識;
    • 使用數(shù)據(jù)庫表的字段生成實體標(biāo)識;

    這四種方式各有優(yōu)缺點,開發(fā)者可以根據(jù)實際情況進(jìn)行選擇。

    可選擇的注釋

    要讓容器和數(shù)據(jù)庫結(jié)合管理實體標(biāo)識的自動生成,根據(jù)實際情況的不同,開發(fā)者可以選擇 javax.persistence.*包下面的 GeneratedValueSequenceGeneratorTableGenerator三個注釋來描述實體的標(biāo)識字段。

    @javax.persistence.GeneratedValue

    每一個需要自動生成實體標(biāo)識的實體都需要為它的實體標(biāo)識字段提供 GeneratedValue注釋和相應(yīng)的參數(shù),OpenJPA 框架會根據(jù)注釋和參數(shù)來處理實體標(biāo)識的自動生成。

    使用 GeneratedValue注釋自動生成的實體標(biāo)識可以是數(shù)值類型字段如 byteshortintlong等,或者它們對應(yīng)的包裝器類型 ByteShortIntegerLong等,也可以是字符串類型。

    GeneratedValue注釋可以支持兩個屬性 strategygenerator

    • strategy

      strategyGenerationType類型的枚舉值,它的內(nèi)容將指定 OpenJPA 容器自動生成實體標(biāo)識的方式。strategy屬性可以是下列枚舉值:

      • GeneratorType.AUTO

        表示實體標(biāo)識由 OpenJPA 容器自動生成,這也是 Strategy 屬性的默認(rèn)值。

      • GenerationType.IDENTITY

        OpenJPA 容器將使用數(shù)據(jù)庫的自增長字段為新增加的實體對象賦唯一值,作為實體的標(biāo)識。這種情況下需要數(shù)據(jù)庫提供對自增長字段的支持,常用的數(shù)據(jù)庫中,HSQL、SQL Server、MySQL、DB2、Derby 等數(shù)據(jù)庫都能夠提供這種支持。

      • GenerationType.SEQUENCE

        表示使用數(shù)據(jù)庫的序列號為新增加的實體對象賦唯一值,作為實體的標(biāo)識。這種情況下需要數(shù)據(jù)庫提供對序列號的支持,常用的數(shù)據(jù)庫中,Oracle、PostgreSQL 等數(shù)據(jù)庫都能夠提供這種支持。

      • GenerationType.TABLE

        表示使用數(shù)據(jù)庫中指定表的某個字段記錄實體對象的標(biāo)識,通過該字段的增長為新增加的實體對象賦唯一值,作為實體的標(biāo)識。

    • String generator

      generator屬性中定義實體標(biāo)識生成器的名稱。如果實體的標(biāo)識自動生成策略不是 GenerationType.AUTO或者 GenerationType.IDENTITY,就需要提供相應(yīng)的 SequenceGenerator或者 TableGenerator注釋,然后將 generator屬性值設(shè)置為注釋的 name屬性值。

    @javax.persistence.SequenceGenerator

    如果實體標(biāo)識的自動生策略是 GenerationType.SEQUENCE,開發(fā)者需要為實體標(biāo)識字段提供 SequenceGenerator注釋,它的參數(shù)描述了使用序列號生成實體標(biāo)識的具體細(xì)節(jié)。該注釋支持以下四個屬性:


    表 1. SequenceGenerator 注釋屬性說明
    屬性 說明
    name 該屬性是必須設(shè)置的屬性,它表示了 SequenceGenerator注釋在 OpenJPA 容器中的唯一名稱,將會被 GeneratedValue注釋的 generator屬性使用。將實體標(biāo)識的自動生成委托給數(shù)據(jù)庫的序列號特性時,實體標(biāo)識字段的 GeneratedValue注釋的 generator屬性的值必須和某個 SequenceGenerator注釋的 name屬性值保持一致。
    sequenceName 實體標(biāo)識所使用的數(shù)據(jù)庫序列號的名稱。該屬性是可選的,如果我們沒有為該屬性設(shè)置值,OpenJPA 框架將自動創(chuàng)建名為 OPENJPA_SEQUENCE的序列號。如果一個 OpenJPA 容器中管理的多個實體都選擇使用序列號機(jī)制生成實體標(biāo)識,而且實體類中都沒有指定標(biāo)識字段的 sequenceName屬性,那么這些實體將會共享系統(tǒng)提供的默認(rèn)名為 OPENJPA_SEQUENCE的序列號。這可能引起實體類編號的不連續(xù)。我們可以用下面的這個簡單例子說明這種情況:假設(shè) OpenJPA 容器中存在兩個實體類 Dog 和 Fish,它們的實體標(biāo)識字段都是數(shù)值型,并且都選擇使用序列號生成實體標(biāo)識,但是實體類中并沒有提供 sequenceName屬性值。當(dāng)我們首先持久化一個 Dog 對象時,它的實體標(biāo)識將會是 1,緊接著我們持久化一個 Fish 對象,它的實體標(biāo)識就是 2,依次類推。
    initialValue 該屬性設(shè)置所使用序列號的起始值。
    allocationSize 一些數(shù)據(jù)庫的序列化機(jī)制允許預(yù)先分配序列號,比如 Oracle,這種預(yù)先分配機(jī)制可以一次性生成多個序列號,然后放在 cache 中,數(shù)據(jù)庫用戶獲取的序列號是從序列號 cache 中獲取的,這樣就避免了在每一次數(shù)據(jù)庫用戶獲取序列號的時候都要重新生成序列號。allocationSize屬性設(shè)置的就是一次預(yù)先分配序列號的數(shù)目,默認(rèn)情況下 allocationSize屬性的值是 50。

    @javax.persistence.TableGenerator

    如果實體標(biāo)識的自動生策略是 GenerationType.TABLE,開發(fā)者需要為實體標(biāo)識字段提供 TableGenerator 注釋,它的參數(shù)描述了使用數(shù)據(jù)庫表生成實體標(biāo)識的具體細(xì)節(jié)。該注釋支持下列屬性:


    表 2. TableGenerator 注釋屬性說明
    屬性 說明
    name 該屬性是必須設(shè)置的屬性,它表示了 TableGenerator注釋在 OpenJPA 容器中的唯一名稱,將會被 GeneratedValue注釋的 generator屬性所使用。將實體標(biāo)識的自動生成委托給數(shù)據(jù)庫表時,實體標(biāo)識字段的 GeneratedValue注釋的 generator屬性的值必須和某個 TableGenerator注釋的 name屬性值保持一致。
    table 該屬性設(shè)置的是生成序列號的表的名稱。該屬性并不是必須設(shè)置的屬性,如果開發(fā)者沒有為該屬性設(shè)置值,OpenJPA 容器將會使用默認(rèn)的表名 OPENJPA_SEQUENCES_TABLE
    schema 該屬性設(shè)置的是生成序列號的表的 schema。該屬性并不是必須設(shè)置的屬性,如果開發(fā)者沒有為該屬性設(shè)置值,OpenJPA 容器將會默認(rèn)使用當(dāng)前數(shù)據(jù)庫用戶對應(yīng)的 schema。
    catalog 該屬性設(shè)置的是生成序列號的表的 catalog。該屬性并不是必須設(shè)置的屬性,如果開發(fā)者沒有為該屬性設(shè)置值,OpenJPA 容器將會使用默認(rèn)當(dāng)前數(shù)據(jù)庫用戶對應(yīng)的 catalog。
    pkColumnName 該屬性設(shè)置的是生成序列號的表中的主鍵字段的名稱,該字段將保存代表每個實體對應(yīng)的標(biāo)識值對應(yīng)的特征字符串。該屬性并不是必須設(shè)置的屬性,如果開發(fā)者沒有為該屬性設(shè)置值,OpenJPA 容器將會使用默認(rèn)值 ID
    valueColumnName 該屬性設(shè)置的是生成序列號的表中記錄實體對應(yīng)標(biāo)識最大值的字段的名稱。該屬性并不是必須設(shè)置的屬性,如果開發(fā)者沒有為該 屬性設(shè)置值,OpenJPA 容器將會使用默認(rèn)值 SEQUENCE_VALUE
    pkColumnValue 該屬性設(shè)置的是生成序列號的表中的主鍵字段的特征字符串值 ( 比如 customID ),該字段將保存代表每個實體對應(yīng)的標(biāo)識值對應(yīng)的特征字符串。該屬性并不是必須設(shè)置的屬性,如果開發(fā)者沒有為該屬性設(shè)置值,OpenJPA 容器將會使用默認(rèn)值 DEFAULT。可以為多個實體設(shè)置相同的 pkColumnValue屬性值,這些實體標(biāo)識的生成將通過同一列的值的遞增來實現(xiàn)。
    initialValue 該屬性設(shè)置的是生成序列號的表實體標(biāo)識的初始值。該屬性并不是必須設(shè)置的屬性,如果開發(fā)者沒有為該屬性設(shè)置值,OpenJPA 容器將會使用默認(rèn)值 0 。
    allocationSize 為了降低標(biāo)識生成時頻繁操作數(shù)據(jù)庫造成 的性能上的影響,實體標(biāo)識生成的時候會一次性的獲取多個實體標(biāo)識,該屬性設(shè)置的就是一次性獲取實體標(biāo)識的數(shù)目。該屬性并不是必須設(shè)置的屬性,如果開發(fā)者沒有為該屬性設(shè)置值,OpenJPA 容器將會使用默認(rèn)值 50 。

    實體標(biāo)識自動生成

    在上面的小節(jié)中,我們了解了和實體標(biāo)識自動生成相關(guān)的注釋,接下來我們將結(jié)合一個簡單的例子講述如何分別使用這些實體標(biāo)識自動生成策略實現(xiàn)實體標(biāo)識的自動生成。

    我們首先假設(shè)有一個 Animal實體需要被持久化,它包括 IDNAME屬性,其中 ID是它的主鍵字段。Animal實體的標(biāo)識需要自動生成,我們將分析在這四種不用的情況下,如何使用 OpenJPA 提供的注釋,結(jié)合具體數(shù)據(jù)庫支持的特性,如自增長字段、序列號等來實現(xiàn)實體標(biāo)識的自動生成。

    容器自動生成

    OpenJPA 容器默認(rèn)的實體標(biāo)識自動生成策略是由容器管理實體標(biāo)識的自動生成,容器管理的實體標(biāo)識可以支持?jǐn)?shù)值型和字符型兩種。當(dāng)容器管理的實體標(biāo)識是數(shù)字型時,OpenJPA 容器自動創(chuàng)建一個數(shù)據(jù)庫表 OPENJPA_SEQUENCE_TABLE,用其中的 SEQUENCE_VALUE字段來記錄實體的實體標(biāo)識的增長。

    當(dāng)容器管理的實體標(biāo)識是字符串類型時,OpenJPA 支持使用 uuid-string 和 uuid-hex 兩種方式生成相應(yīng)的實體標(biāo)識。如果我們選擇使用 uuid-string 方式生成實體標(biāo)識時,OpenJPA 框架會自動為實體生成一個 128 位的 UUID,并且將這個 UUID 轉(zhuǎn)化為使用 16 位字符表示的字符串。如果我們選擇使用 uuid-hex 方式生成實體標(biāo)識時,OpenJPA 框架會自動為實體生成一個 128 位的 UUID,并且將這個 UUID 轉(zhuǎn)化為使用 32 位字符表示的 16 進(jìn)制的字符串。

    數(shù)值標(biāo)識

    容器管理的實體標(biāo)識可以是數(shù)值型的,OpenJPA 框架管理的實體標(biāo)識借助于數(shù)據(jù)庫的表來實現(xiàn),在運行時 OpenJPA 框架會自動在數(shù)據(jù)庫中創(chuàng)建表 OPENJPA_SEQUENCE_TABLE。它有兩個字段:IDSEQUENCE_VALUE,這兩個字段都是數(shù)值類型,其中 ID是表的主鍵字段,它的內(nèi)容是查詢當(dāng)前實體標(biāo)識時所使用的關(guān)鍵詞,默認(rèn)值是 0。而 SEQUENCE_VALUE記錄了當(dāng)前 OpenJPA 框架中當(dāng)前實體標(biāo)識的歷史數(shù)據(jù),內(nèi)容是已經(jīng)被獲取實體標(biāo)識的最大數(shù)值加 1。

    我們要使用注釋描述 Animal實體的標(biāo)識由容器自動生成,只需要為它的標(biāo)識字段提供 GeneratedValue注釋,并且把它的 strategy屬性設(shè)置為 GenerationType.AUTO, Animal實體類的代碼片斷如下:


    清單 1. 標(biāo)識由容器自動生成的 Animal 實體類
                1. 	 import javax.persistence.Entity;
                2. 	 import javax.persistence.GeneratedValue;
                3. 	 import javax.persistence.GenerationType;
                4. 	 import javax.persistence.Id;
                5.
                6. 	 @Entity
                7. 	 public class Animal {
                8. 		 @Id
                9. 		 @GeneratedValue(strategy=GenerationType.AUTO)
                10. 		 private long id;
                11. 		 private String name;
                12.
                13. 	  …
                14.
                15. 	 }
                

    保存 Animal實體的第一個實例時,OpenJPA 框架自動調(diào)用 SQL 語句 SELECT SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID=0,從默認(rèn)保存實體標(biāo)識的 OPENJPA_SEQUENCE_TABLE表中獲取實體的標(biāo)識,如果不存在 ID為 0 的記錄,OpenJPA 框架自動將實體的標(biāo)識設(shè)置為 1。

    容器管理實體標(biāo)識的情況下,為了獲得實體標(biāo)識,應(yīng)用程序?qū)⒉坏貌活l繁地和數(shù)據(jù)庫交互,這會影響應(yīng)用程序的運行效率。OpenJPA 中使用實體標(biāo)識緩存機(jī)制解決這個問題。默認(rèn)情況下,當(dāng)應(yīng)用程序第一次獲取實體標(biāo)識時,OpenJPA 框架從數(shù)據(jù)庫中一次性獲取 50 個連續(xù)的實體標(biāo)識緩存起來,當(dāng)下一次應(yīng)用程序需要獲取實體標(biāo)識時,OpenJPA 將首先檢測緩存中是否存在實體標(biāo)識,如果存在,OpenJPA 將直接使用緩存中的實體標(biāo)識,如果不存在,OpenJPA 框架將會從數(shù)據(jù)庫中再次獲取 50 個連續(xù)的實體標(biāo)識緩存起來,如此類推。這樣的處理方式可以大大減少由于獲取實體標(biāo)識而產(chǎn)生的數(shù)據(jù)庫交互,提升應(yīng)用程序的運行效率。

    當(dāng)實體標(biāo)識成功獲取之后,OpenJPA 框架會把當(dāng)前實體標(biāo)識的最大值 +1 后持久化到數(shù)據(jù)庫中。由于實體標(biāo)識緩存的原因,當(dāng)我們第一次獲取實體標(biāo)識后,OpenJPA 會將 OPENJPA_SEQUENCE_TABLE表的 SEQUENCE_VALUE的值設(shè)置為 51,當(dāng) OpenJPA 多次從數(shù)據(jù)庫中獲取實體標(biāo)識后,SEQUENCE_VALUE的值會以 50 為單位遞增,變?yōu)?101、151、201 …。

    OpenJPA 緩存的實體標(biāo)識不是永久存在的,只能在同一個 EntityManagerFactory管理范圍內(nèi)起作用,也就是說,當(dāng)獲取實體標(biāo)識的 EntityManagerFactory對象被關(guān)閉后,這些被獲取的實體標(biāo)識中沒有用掉的那一部分標(biāo)識就丟失了,這會造成實體標(biāo)識的不連續(xù)。由同一個 EntityManagerFactory對象創(chuàng)建的 EntityManager上下文之間則能夠共享 OpenJPA 框架獲取的實體標(biāo)識,這意味著,我們可以使用同一個 EntityManagerFactory對象創(chuàng)建多個 EntityManager對象,用它來持久化實體,然后關(guān)閉它,在持久化過程中所需要的實體表示將會使用同一個實體標(biāo)識的緩存區(qū),因此不會引起實體標(biāo)識的丟失。

    容器管理的實體標(biāo)識還有一個非常重要的特性:所有被容器管理的實體標(biāo)識都是共享的。不管 OpenJPA 容器中存在多少個不同的被容器管理的實體標(biāo)識,它們都會從同一個實體標(biāo)識緩存中獲取實體標(biāo)識。我們可以用下面的例子說明這種情況:假設(shè) OpenJPA 容器中存在兩個實體類 DogFish,它們的實體標(biāo)識字段都是數(shù)值型,并且都由 OpenJPA 管理。當(dāng)我們首先持久化一個 Dog對象時,它的實體標(biāo)識將會是 1,緊接著我們持久化一個 Fish對象,它的實體標(biāo)識就是 2,依次類推。

    uuid-string

    要使用 uuid-string 機(jī)制自動生成實體標(biāo)識,我們需要將實體主鍵字段的 GeneratedValue注釋的 strategy屬性設(shè)置為 GenarationType.AUTO,然后將 GeneratedValue注釋的 generator屬性設(shè)置為 uuid-string。以 Animal 實體類為例,我們只需要將 Animal 實體修改為如下內(nèi)容:


    清單 2. 使用 uuid-string 機(jī)制自動生成實體標(biāo)識
                1. 	 import javax.persistence.Entity;
                2. 	 import javax.persistence.GeneratedValue;
                3. 	 import javax.persistence.GenerationType;
                4. 	 import javax.persistence.Id;
                5.
                6. 	 @Entity
                7. 	 public class Animal {
                8. 		 @Id
                9. 		 @GeneratedValue(strategy=GenerationType.AUTO, generator = "uuid-string")
                10. 		 private String id;
                11. 		 private String name;
                12.
                13. 	  …
                14.
                15. 	 }
                

    uuid-hex

    要使用 uuid-hex 機(jī)制自動生成實體標(biāo)識,我們必須將實體主鍵字段的 GeneratedValue注釋的 strategy屬性設(shè)置為 GenarationType.AUTO,然后將 GeneratedValue注釋的 generator屬性設(shè)置為 uuid-hex。以 Animal 實體類為例,我們只需要將 Animal 實體修改為如下內(nèi)容:


    清單 3. 使用 uuid-hex 機(jī)制自動生成實體標(biāo)識
                1. 	 import javax.persistence.Entity;
                2. 	 import javax.persistence.GeneratedValue;
                3. 	 import javax.persistence.GenerationType;
                4. 	 import javax.persistence.Id;
                5.
                6. 	 @Entity
                7. 	 public class Animal {
                8. 		 @Id
                9. 		 @GeneratedValue(strategy=GenerationType.AUTO, generator = "uuid-hex")
                10. 		 private String id;
                11. 		 private String name;
                12.
                13. 	  …
                14.
                15. 	 }
                

    自增長字段

    自增長字段是 HSQL、SQL Server、MySQL、DB2、Derby 等數(shù)據(jù)庫提供的一種特性,用于為數(shù)據(jù)庫的記錄提供自動增長的編號,應(yīng)用程序的設(shè)計者通常期望將實體標(biāo)識的自動生成委托給數(shù)據(jù)庫的這種特性,OpenJPA 框架中的實體標(biāo)識能夠滿足應(yīng)用程序設(shè)計者的要求,使用數(shù)據(jù)庫的自增長字段為實體自動生成標(biāo)識。

    要將實體標(biāo)識的自動生成委托給數(shù)據(jù)庫的自增長字段特性,需要數(shù)據(jù)庫和實體定義的雙方配合才能夠達(dá)到:首先,必須將實體標(biāo)識字段對應(yīng)的數(shù)據(jù)庫列修改為自動增長列,另外還需要將實體類中實體標(biāo)識字段的 GeneratedValue注釋的 stragety屬性的值設(shè)置為 GenerationType.IDENTITY

    我們以 Animal 實體在 HSQL 數(shù)據(jù)庫中的持久化來說明如何使用自增長字段自動生成實體標(biāo)識所需要采取的步驟:

    首先,我們使用下面的 SQL 語句創(chuàng)建 Animal 表,把它的 ID字段設(shè)置為自動增長類型:


    清單 4. 將 ID 字段設(shè)置為自動增長類型的 SQL 語句
                CREATE TEXT TABLE ANIMAL (
                ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,
                NAME VARCHAR(255) NOT NULL
                )
                

    在數(shù)據(jù)庫部分將表的主鍵字段設(shè)置為自動增長字段后,在實體 Animal的定義中,我們需要將 id字段 GeneratedValue注釋的 stragety屬性的值設(shè)置為 GenerationType.IDENTITY。Animal 實體類修改后的代碼片段如下。


    清單 5. 標(biāo)識由自增長字段生成的 Animal 實體類
                1. 	 import javax.persistence.Entity;
                2. 	 import javax.persistence.GeneratedValue;
                3. 	 import javax.persistence.GenerationType;
                4. 	 import javax.persistence.Id;
                5.
                6. 	 @Entity
                7. 	 public class Animal {
                8. 		 @Id
                9. 		 @GeneratedValue(strategy=GenerationType.IDENTITY)
                10. 		 private long id;
                11. 		 private String name;
                12.
                13. 	  …
                14.
                15. 	 }
                

    序列號(Sequence)

    序列號是 Oracle、PostgreSQL 等數(shù)據(jù)庫提供的一種特性,用于為數(shù)據(jù)庫的記錄提供自動增長的編號,使用 Oracle、PostgreSQL 等數(shù)據(jù)庫應(yīng)用程序的設(shè)計者通常期望將實體標(biāo)識的自動生成委托給數(shù)據(jù)庫的這種特性,OpenJPA 框架中的實體標(biāo)識能夠滿足應(yīng)用程序設(shè)計者的要求,使用數(shù)據(jù)庫的序列號為實體自動生成標(biāo)識。

    要將實體標(biāo)識的自動生成委托給數(shù)據(jù)庫的序列號特性,需要數(shù)據(jù)庫和實體定義的雙方配合才能夠達(dá)到:首先,必須在數(shù)據(jù)庫中創(chuàng)建合適的序列號,另外還需要為實體標(biāo)識字段提供 SequenceGenerator注釋,設(shè)置它的參數(shù),為實體類提供關(guān)于序列號的信息,同時將實體類中實體標(biāo)識字段的 GeneratedValue注釋的 stragety屬性的值設(shè)置為 GenerationType.SEQUENCE,將 generator屬性的值設(shè)置為 SequenceGenerator注釋的 name屬性的值。

    我們以 Animal 實體在 Oracle 數(shù)據(jù)庫中的持久化來說明如何使用自增長字段自動生成實體標(biāo)識所需要采取的步驟:

    首先,在 Oracle 數(shù)據(jù)庫中運行下面的 SQL 語句創(chuàng)建名為 HelloWorldSequence的序列號,序列號支持 cache,大小為 50:


    清單 6. 創(chuàng)建序列號的 SQL 語句
                CREATE SEQUENCE HELLOWORLDSEQUENCE
                START WITH 0
                INCREMENT BY 1
                MINVALUE 1
                CACHE 50
                NOCYCLE
                NOORDER
                

    然后,在 Oracle 數(shù)據(jù)庫中,我們使用下面的 SQL 語句創(chuàng)建 ANIMAL表:


    清單 7. 創(chuàng)建 ANIMAL 表
                CREATE TABLE EOS52.ANIMAL
                (
                ID CHAR(10),
                NAME VARCHAR2(100) NOT NULL,
                CONSTRAINT PK_ANIMAL PRIMARY KEY (ID )
                )
                

    在數(shù)據(jù)庫部分創(chuàng)建合適的序列號和相應(yīng)的數(shù)據(jù)庫表后,在實體 Animal的定義中,我們需要將 id字段 GeneratedValue注釋的 stragety屬性的值設(shè)置為 GenerationType.SEQUENCE,設(shè)置它的 generator屬性的值為 SeqGenerator。我們還需要為 id字段提供另外一個相關(guān)的注釋 SequenceGenerator,設(shè)置它的 name屬性為 SeqGenerator,設(shè)置它 sequenceName屬性為 HelloWorldSequence。Animal 實體類修改后的代碼片段如下。


    清單 8. 標(biāo)識由序列號生成的 Animal 實體類
                1.  import javax.persistence.Entity;
                2.  import javax.persistence.GeneratedValue;
                3.  import javax.persistence.GenerationType;
                4.  import javax.persistence.Id;
                5.
                6.  @Entity
                7.  public class Animal {
                8.      @Id
                9.      @GeneratedValue(strategy = GenerationType.SEQUENCE,
                generator = "SeqGenerator")
                10.     @SequenceGenerator(name = "SeqGenerator",
                sequenceName = " HelloWorldSequence")
                11.     private long id;
                12.     private String name;
                13.
                14.     …
                15.
                16. }
                

    數(shù)據(jù)庫表

    除了使用容器生成的實體標(biāo)識,或者借助于數(shù)據(jù)庫的自增長字段或者序列號等方式生成實體標(biāo)識之外,我們還可以選擇借助數(shù)據(jù)庫表來自動生成實體標(biāo)識。原理是我們提供一個獨立的數(shù)據(jù)庫表,該表的主鍵列 ( 假設(shè)列名 ID) 記錄實體編號的特征字符串 ( 假設(shè)存在一條記錄的 IDcustomID),另外一列 ( 假設(shè)列名為 SEQUENCE_VALUE) 記錄該特征字符串對應(yīng)實體標(biāo)識的最大值。編寫實體代碼時,我們指定實體標(biāo)識由數(shù)據(jù)庫表中指定的特征字符串 ( 如 customID) 對應(yīng)的列 SEQUENCE_VALUE處理,當(dāng)有新的實體被持久化時,容器將獲取行 customID、列 SEQUENCE_VALUE對應(yīng)的數(shù)值 +1 后作為新實體的標(biāo)識,同時將該列的值也自動 +1。

    要將實體標(biāo)識的自動生成委托給數(shù)據(jù)庫表,需要數(shù)據(jù)庫和實體定義的雙方配合才能夠達(dá)到:首先,必須在數(shù)據(jù)庫中創(chuàng)建合適的保存實體標(biāo)識的表,另外還需要為實體標(biāo)識字段提供 TableGenerator注釋,設(shè)置它的參數(shù),為實體類提供關(guān)于數(shù)據(jù)庫表、字段的信息,同時將實體類中實體標(biāo)識字段的 GeneratedValue注釋的 stragety屬性的值設(shè)置為 GenerationType.Table,將 generator屬性的值設(shè)置為 SequenceGenerator注釋的 name屬性的值。

    我們以 Animal 實體類來說明使用數(shù)據(jù)庫表自動生成實體標(biāo)識所需要采取的步驟:我們假設(shè)存在這樣的場景,Animal 實體的標(biāo)識由應(yīng)用程序中自定義的數(shù)據(jù)庫表 MY_KEYS自動生成,MY_KEYS表中有兩列,一列是 KEYID,它保存實體標(biāo)識的特征值,一列是 KEYVALUE,它保存實體當(dāng)前的最大編號,除此之外,我們還決定使用 ANIMALID作為 Animal 實體標(biāo)識的特征字符串。

    首先,在數(shù)據(jù)庫中使用下面的 SQL 語句創(chuàng)建名為 MY_KEYS的數(shù)據(jù)庫表。在 OpenJPA 容器中,如果我們沒有創(chuàng)建 MY_KEYS表,OpenJPA 容器將幫我們自動生成對應(yīng)的表結(jié)構(gòu)。


    清單 9. 創(chuàng)建數(shù)據(jù)庫表 MY_KEYS
                CREATE TABLE MY_KEYS (
                KEYID VARCHAR(255) NOT NULL,
                KEYVALUE BIGINT,
                PRIMARY KEY (KEYID)
                )
                

    在數(shù)據(jù)庫部分創(chuàng)建合適的數(shù)據(jù)庫表后,在實體 Animal 的定義中,我們需要將 id字段 GeneratedValue注釋的 stragety屬性的值設(shè)置為 GenerationType.TABLE,設(shè)置它的 generator屬性的值為 TableGenerator。我們還需要為 id字段提供另外一個注釋 TableGenerator,設(shè)置它的 name屬性為 TableGenerator,設(shè)置它的 table屬性為 MYKEYSpkColumnName屬性為 KEYIDvalueColumnName屬性為 KEYVALUEANIMALID屬性為 ANIMALID。Animal 實體類修改后的代碼片段如下。


    清單 10. 標(biāo)識由數(shù)據(jù)庫表生成的 Animal 實體類
                1. import javax.persistence.Entity;
                2. import javax.persistence.GeneratedValue;
                3. import javax.persistence.GenerationType;
                4. import javax.persistence.Id;
                5.
                6. @Entity
                7. public class Animal {
                8.     @Id
                9.     @GeneratedValue(strategy = GenerationType.TABLE,
                generator = " TableGenerator ")
                10.    @TableGenerator(name = " TableGenerator", table = "MY_KEYS",
                pkColumnName = "KEYID", valueColumnName = "KEYVALUE",
                pkColumnValue = "ANIMALID")
                11.    private long id;
                12.    private String name;
                13.
                14.    …
                15.
                16. }
                


    調(diào)用代碼

    上面的章節(jié)中我們學(xué)習(xí)了分別使用四種方式來自動生成實體的標(biāo)識,由于這四種情況下,Animal 實體的標(biāo)識都由 OpenJPA 和數(shù)據(jù)庫協(xié)作后自動生成,對于開發(fā)者而言,這個過程是透明的,因此我們可以使用相同的方式來創(chuàng)建這些實體:創(chuàng)建新的 Animal 實例的時候不再需要為主鍵字段提供屬性值,只需要設(shè)置 Animal 實例的非標(biāo)識字段 name的值即可。下面的代碼演示了 Animal 實例的持久化代碼,請注意代碼中并沒有調(diào)用 Animal 實例的 setId 方法。


    清單 11. Animal 實例的持久化代碼
                1. 	 EntityManagerFactory factory = Persistence.
                2. 	         createEntityManagerFactory(
                3. 	         "jpa-unit", System.getProperties());
                4. 		 EntityManager em = factory.createEntityManager();
                5. 		 em.getTransaction().begin();
                6.
                7. 		 Animal animal = new Animal();
                8. 		 // 此處不需要調(diào)用 animal 的 setId 方法
                9. 		 animal.setName("ba guai!");
                10. 	 em.persist(animal);
                11.
                12. 	 em.getTransaction().commit();
                13. 	 em.close();
                14. 	 em2.close();
                15. 	 factory.close();
                


    總結(jié)

    本文介紹了開發(fā)者使用 OpenJPA 實現(xiàn)實體標(biāo)識自動生成時可選擇使用的注釋,并且結(jié)合簡單的例子,分別介紹了 OpenJPA 中實現(xiàn)容器管理的實體標(biāo)識自動生成、結(jié)合數(shù)據(jù)庫自增長字段、序列號、數(shù)據(jù)庫表等特性實現(xiàn)實體標(biāo)識自動生成時注釋的具體用法和操作步驟。


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


    posted @ 2011-05-03 23:06 Alpha 閱讀(13008) | 評論 (0)編輯 收藏

    1,oracle中實例的創(chuàng)建:oracle中實例創(chuàng)建即SID的創(chuàng)建,通常在安裝完oracle后,啟動 配置和移植工具中的(數(shù)據(jù)庫配置向?qū)В?/p>

     database configuration assistant ,按照向?qū)?chuàng)建SID,當(dāng)日利用database configuration assistant 還可以 創(chuàng)建數(shù)據(jù)庫、配置數(shù)據(jù)選件、刪除數(shù)據(jù)庫、管理模板、配置自動存儲管理。

    2,oracle中服務(wù)的創(chuàng)建:在oracle實例創(chuàng)建完后,就可以創(chuàng)建服務(wù)名了。注意:連接一個實例可以有多個服務(wù)名。啟動 配置和移植工具中的net manager(網(wǎng)絡(luò)配置),按照向?qū)ч_始配置 網(wǎng)絡(luò)服務(wù)名==》TCP/IP協(xié)議==》主機(jī)名(服務(wù)端的IP地址)==》oracle8i或更高版本 服務(wù)名(即SID實例名稱)==》測試 ==》完成。

    3,框架中db.properties的配置:

    datasource.driverClassName=oracle.jdbc.OracleDriver
    datasource.url=jdbc:oracle:thin:@//127.0.0.1:1521/ORCL  (注意,這個orcl就是指第二項 oracle中服務(wù)的創(chuàng)建)
    datasource.username=card
    datasource.password=1111

    c3p0.minPoolSize=1
    c3p0.maxPoolSize=30
     
    hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
    hibernate.jdbc.batch_size=25
    hibernate.jdbc.fetch_size=50
    hibernate.show_sql=true

    posted @ 2011-05-03 22:19 Alpha 閱讀(1511) | 評論 (0)編輯 收藏
    access   add   all   alter   and   any   as   asc   audit   between   by   char   check   cluster   column   comment  
    compress   connect   create   current   date   decimal   default   delete   desc   distinct   drop   else   exclusive  
    exists   file   float   for   from   grant   group   having   identified   immediate   in   increment   index   initial  
    insert   integer   intersect   into   is   level   like   lock   long   maxextents   minus   mlslabel   mode   modify  
    noaudit   nocompress   not   nowait   null   number   of   offline   on   online   option   or   order   pctfree   prior  
    privileges   public   raw   rename   resource   revoke   row   rowid   rownum   rows   select   session   set  
    share   size   smallint   start   successful   synonym   sysdate   table   then   to   trigger   uid   union   unique  
    update   user   validate   values   varchar   varchar2   view   whenever   where   with
    posted @ 2011-05-03 22:19 Alpha 閱讀(834) | 評論 (0)編輯 收藏
    僅列出標(biāo)題
    共18頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 99热在线免费观看| 天天摸天天碰成人免费视频| 4480yy私人影院亚洲| 国产成人精品久久免费动漫| 亚洲国产午夜精品理论片在线播放| 亚洲av无码成人精品区在线播放 | 亚洲AV伊人久久青青草原| 任你躁在线精品免费| 国产亚洲国产bv网站在线| 亚洲精品99久久久久中文字幕 | 亚洲欧洲精品成人久久奇米网| 亚洲视频在线观看免费| 亚洲成在人线aⅴ免费毛片| 亚洲人成色777777在线观看 | 久久久久亚洲AV成人无码| 日韩视频在线免费| 久久这里只精品99re免费| 国产精品无码亚洲一区二区三区| 亚洲av无码国产精品夜色午夜| 免费精品一区二区三区在线观看| 免费无码又爽又刺激网站| 亚洲国产精品18久久久久久| 香蕉蕉亚亚洲aav综合| 一级毛片直播亚洲| 免费无码又爽又刺激聊天APP| 黄色网站软件app在线观看免费| 亚洲精品又粗又大又爽A片| 久久久久久亚洲精品中文字幕| 亚洲精品一级无码中文字幕| 蜜桃视频在线观看免费网址入口 | 爱情岛论坛网亚洲品质自拍| 久久这里只有精品国产免费10| 久久精品无码精品免费专区| 国产精品久久久久久亚洲小说| 亚洲av永久无码精品天堂久久| 国产AV无码专区亚洲Av| 亚洲国产精品国产自在在线| 在线成人a毛片免费播放| 免费观看激色视频网站bd| 国产色爽免费无码视频| 一级女人18片毛片免费视频|