随笔-179  评论-666  文章-29  trackbacks-0
 
阿里云服务器优惠券

配置rsync 同步数据     rpm包安装rsync及配置

[root@Hammer home]# rpm -qa |grep rsync                 #检查系统是否安装了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密码(在上边的配置文件中已经写好路径)/home/rsync.ps(名字随便写,只要和上边配置文件里的一致即可),格式(一行一个用户)
[root@test etc]# vi /home/rsync.ps
scihoo:scihoo

6 配置rsync密码文件权限
[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服务端启动的两种方法
9、启动rsync服务端(独立启动)
[root@test home]# /usr/bin/rsync --daemon

10、启动rsync服务端 (有xinetd超级进程启动)
[root@test home]# /etc/init.d/xinetd reload

11  加入rc.local
在各种操作系统中,rc文件存放位置不尽相同,可以修改使系统启动时把rsync --daemon加载进去。
[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 设定密码文件
  1.2 测试rsync执行指令
  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  配置密码文件  (注:为了安全,设定密码档案的属性为:600。rsync.ps的密码一定要和Rsync Server密码设定案里的密码一样)
[root@aj1 home]# vi rsync.ps
sciooo

[root@aj1 home]# chown root.root .rsync.ps   # 注意必须给权限
[root@aj1 home]# chmod 600 .rsync.ps         # 必须修改权限

1.2 从服务器上下载文件
[root@aj1 rsync-3.0.4]# rsync -avz --password-file=/home/rsync.ps scihoo@192.168.0.206::backup /home/

   从本地上传到服务器上去
[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

阿里云服务器优惠券
posted @ 2011-06-30 15:04 Alpha 阅读(15664) | 评论 (3)编辑 收藏

前些时间在VMware上安装了Gentoo Linux,用了当前最新版的Gentoo,安装过程记录下来了,但一直没有整理到blog上。今天重新整理一下,写出来与大家分享和备用。接触Gentoo不久,对这个版本还不是很熟。

与其他Linux发行版相比,Gentoo确实有其优势的地方,如内核基于源代码编译,可以自动优化与定制,升级方便等!

关于Gentoo发行版的介绍请看:全球最受欢迎的十大Linux发行版(图)

Host机环境: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 插入虚拟机,默认引导进入终端。

先配置好网络,之后的操作可以全部通过 ssh 连接来操作。

ifconfig eth0 192.168.80.133(我这里VM已经自动分配了这个内网IP了。)
echo nameserver 8.8.8.8 > /etc/resolv.conf
echo nameserver 8.8.4.4 > /etc/resolv.conf

设置 root 用户密码:

passwd root

启动 sshd 服务:

/etc/init.d/sshd start

windows上用SecureCRT或PuTTY连接虚拟机操作。

磁盘分区

先分区,建议使用cfdisk,先查看分区情况:

cfdisk /dev/sda

我的分区表(/boot分区我单独分出来),/dev/sda2是/根分区,/dev/sda3是swap分区:

格式化分区:

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

激活swap交换分区:

swapon /dev/sda3

将分区信息写入fstab配置文件:(注:gentoo-minimal没带vi编辑器,只带有nano编辑器。)

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

解压 stage3 和 portage

创建基本目录结构:

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

使用WinSCP或CuteFTP 上传 stage3 软件包到 /mnt/gentoo下,然后解压:

(注:上面标签的地址之前没改过来,实际地址是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

切换系统

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

主机域名设置

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

编译安装内核

lsmod

找到网卡驱动模块:

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

下载源码,配置内核:

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

在配置界面输入/e1000,搜索 e1000,找到驱动所在位置:

| 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])

这里一定要注意,选对内核的网卡驱动!

虚拟机的硬盘使用的 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

必须添加这个驱动,否则系统启动时可能出现类似以下错误:

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文件系统的支持:

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

开始编译内核:

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 内容如下:

default 0
timeout 9

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

系统配置

文件系统挂载点:

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

网络设置:

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服务设置:

rc-update add sshd default

时区设置:

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

设置 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 阅读(3973) | 评论 (1)编辑 收藏

在页面中使用gzip可以有效的减低页面的大小,加快网页的下载速度。在lighttpd中对php页面进行压缩,需要两个步骤:

1. 编辑 lighttpd.conf

将 “mod_compress” 设为启用

接著找到

## 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此时还没有压缩

对于动态的php文件,还需要在php.ini中做相关设置,否则.php页面还是不使用压缩模式
2. 编辑 php.ini
修改
zlib.output_compression = On
zlib.output_handler = On

重新启动Lighttpd。
这样php也压缩了

posted @ 2011-06-22 23:25 Alpha 阅读(793) | 评论 (0)编辑 收藏

Lighttpd 作为新一代的web server,以小巧(不到1M的大小)、快速而著称,因为服务器上安装了rails、java,并以lighttpd为前端代理服务器,不想再部署apache了,所以直接使用lighttpd来部署,顺便看一下性能如何。

本文主要介绍在CentOS下,配置一套用lighttp作为web server的php环境

· 安装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完毕以后,会给出一个激活的模块和没有激活模块的清单,可以检查一下,是否自己需要的模块都已经激活,在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发行版本可以自行参考该文件内容进行修改。然后修改/etc/init.d/lighttpd,把

lighttpd="/usr/sbin/lighttpd"
 

改为

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

此脚本用来控制lighttpd的启动关闭和重起:

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

如果你希望服务器启动的时候就启动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需要指定相应的目录

3)用什么权限来运行lighttpd
server.username = “nobody”
server.groupname = “nobody”
从安全角度来说,不建议用root权限运行web server,可以自行指定普通用户权限。

4)静态文件压缩
compress.cache-dir = “/tmp/lighttpd/cache/compress”
compress.filetype = (“text/plain”, “text/html”,”text/javascript”,”text/css”)
可以指定某些静态资源类型使用压缩方式传输,节省带宽,对于大量AJAX应用来说,可以极大提高页面加载速度。

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进程,lighttpd和FCGI之间使用本机Unix Socket通信。

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

}

如果要设置代理,比如lighttpd和tomcat整合,tomcat放在lighttpd后面,则需要通过代理访问tomcat

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

则www.domain.cn为主机的网址都交给tomcat处理,tomcat的端口号为8080. 在tomcat的虚拟主机中,需要捕获www.domain.cn这个主机名,设置这个虚拟主机。这里的host都是跟tomcat里面的虚拟主机对应的。

· 安装支持fastcgi的PHP
安装PHP所需的相关类库
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
 

执行好后,会提示安装到的路径,下面会用到,如我的被安装到这里
/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613
编辑php.ini中的内容
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的网站目录里,测试php是否安装成功

http://blog.prosight.me/

posted @ 2011-06-22 23:24 Alpha 阅读(1776) | 评论 (0)编辑 收藏

使用proxy可以使lighttpd成为一个代理服务器。例如将java的请求全都转向给jboss来处理
mod_proxy有三个标签:
proxy.debug,0或者1. 表示是否启动调试模式。 1表示启动
proxy.balance,使用负载均衡的模式。可以使“hash”,“round-robin”,”fair”三种模式之一。
’round-robin’ 交替轮训, ‘hash’ 根据请求的url产生一个 hash值,来确保同样的请求的url都访问同样的主机
‘fair’ is the normal load-based, passive balancing.

语法结构

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

* : 表示请求url的文件扩展名或者文件前缀 (如果以”/”开始); 可以是空 (“”) 表示所有的请求
* : 可选名称
* “host”: 被代理的服务器的ip
* “port”: 被代理服务器的端口,默认是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"  
        ) )
        )
}
 

负载均衡的例子,例如有8个squid缓存,需要用lighttpd做负载均衡

  $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" ) ) )
  }
 

当一个服务器宕机后,它上面的请求将被转移给其他设备server

posted @ 2011-06-22 23:20 Alpha 阅读(2302) | 评论 (0)编辑 收藏
     摘要: 花了一个上午的时间研究nginx+tomcat的负载均衡测试,集群环境搭建比较顺利,但是session同步的问题折腾了几个小时才搞定,现把我的过程贴上来,以备用。 软件及环境是: 虚拟机上装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 阅读(20411) | 评论 (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 阅读(573) | 评论 (0)编辑 收藏

数据的唯一性是所有应用程序非常基本的要求,由开发者或者用户来维护这种唯一性存在着较大的风险,因此,由系统自动产生唯一标识是一种常见的做法。OpenJPA 中支持四种不同的实体标识自动生成策略:

  • 容器自动生成的实体标识;
  • 使用数据库的自动增长字段生成实体标识;
  • 根据数据库序列号(Sequence)技术生成实体标识;
  • 使用数据库表的字段生成实体标识;

这四种方式各有优缺点,开发者可以根据实际情况进行选择。

可选择的注释

要让容器和数据库结合管理实体标识的自动生成,根据实际情况的不同,开发者可以选择 javax.persistence.*包下面的 GeneratedValueSequenceGeneratorTableGenerator三个注释来描述实体的标识字段。

@javax.persistence.GeneratedValue

每一个需要自动生成实体标识的实体都需要为它的实体标识字段提供 GeneratedValue注释和相应的参数,OpenJPA 框架会根据注释和参数来处理实体标识的自动生成。

使用 GeneratedValue注释自动生成的实体标识可以是数值类型字段如 byteshortintlong等,或者它们对应的包装器类型 ByteShortIntegerLong等,也可以是字符串类型。

GeneratedValue注释可以支持两个属性 strategygenerator

  • strategy

    strategyGenerationType类型的枚举值,它的内容将指定 OpenJPA 容器自动生成实体标识的方式。strategy属性可以是下列枚举值:

    • GeneratorType.AUTO

      表示实体标识由 OpenJPA 容器自动生成,这也是 Strategy 属性的默认值。

    • GenerationType.IDENTITY

      OpenJPA 容器将使用数据库的自增长字段为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供对自增长字段的支持,常用的数据库中,HSQL、SQL Server、MySQL、DB2、Derby 等数据库都能够提供这种支持。

    • GenerationType.SEQUENCE

      表示使用数据库的序列号为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供对序列号的支持,常用的数据库中,Oracle、PostgreSQL 等数据库都能够提供这种支持。

    • GenerationType.TABLE

      表示使用数据库中指定表的某个字段记录实体对象的标识,通过该字段的增长为新增加的实体对象赋唯一值,作为实体的标识。

  • String generator

    generator属性中定义实体标识生成器的名称。如果实体的标识自动生成策略不是 GenerationType.AUTO或者 GenerationType.IDENTITY,就需要提供相应的 SequenceGenerator或者 TableGenerator注释,然后将 generator属性值设置为注释的 name属性值。

@javax.persistence.SequenceGenerator

如果实体标识的自动生策略是 GenerationType.SEQUENCE,开发者需要为实体标识字段提供 SequenceGenerator注释,它的参数描述了使用序列号生成实体标识的具体细节。该注释支持以下四个属性:


表 1. SequenceGenerator 注释属性说明
属性 说明
name 该属性是必须设置的属性,它表示了 SequenceGenerator注释在 OpenJPA 容器中的唯一名称,将会被 GeneratedValue注释的 generator属性使用。将实体标识的自动生成委托给数据库的序列号特性时,实体标识字段的 GeneratedValue注释的 generator属性的值必须和某个 SequenceGenerator注释的 name属性值保持一致。
sequenceName 实体标识所使用的数据库序列号的名称。该属性是可选的,如果我们没有为该属性设置值,OpenJPA 框架将自动创建名为 OPENJPA_SEQUENCE的序列号。如果一个 OpenJPA 容器中管理的多个实体都选择使用序列号机制生成实体标识,而且实体类中都没有指定标识字段的 sequenceName属性,那么这些实体将会共享系统提供的默认名为 OPENJPA_SEQUENCE的序列号。这可能引起实体类编号的不连续。我们可以用下面的这个简单例子说明这种情况:假设 OpenJPA 容器中存在两个实体类 Dog 和 Fish,它们的实体标识字段都是数值型,并且都选择使用序列号生成实体标识,但是实体类中并没有提供 sequenceName属性值。当我们首先持久化一个 Dog 对象时,它的实体标识将会是 1,紧接着我们持久化一个 Fish 对象,它的实体标识就是 2,依次类推。
initialValue 该属性设置所使用序列号的起始值。
allocationSize 一些数据库的序列化机制允许预先分配序列号,比如 Oracle,这种预先分配机制可以一次性生成多个序列号,然后放在 cache 中,数据库用户获取的序列号是从序列号 cache 中获取的,这样就避免了在每一次数据库用户获取序列号的时候都要重新生成序列号。allocationSize属性设置的就是一次预先分配序列号的数目,默认情况下 allocationSize属性的值是 50。

@javax.persistence.TableGenerator

如果实体标识的自动生策略是 GenerationType.TABLE,开发者需要为实体标识字段提供 TableGenerator 注释,它的参数描述了使用数据库表生成实体标识的具体细节。该注释支持下列属性:


表 2. TableGenerator 注释属性说明
属性 说明
name 该属性是必须设置的属性,它表示了 TableGenerator注释在 OpenJPA 容器中的唯一名称,将会被 GeneratedValue注释的 generator属性所使用。将实体标识的自动生成委托给数据库表时,实体标识字段的 GeneratedValue注释的 generator属性的值必须和某个 TableGenerator注释的 name属性值保持一致。
table 该属性设置的是生成序列号的表的名称。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认的表名 OPENJPA_SEQUENCES_TABLE
schema 该属性设置的是生成序列号的表的 schema。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会默认使用当前数据库用户对应的 schema。
catalog 该属性设置的是生成序列号的表的 catalog。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认当前数据库用户对应的 catalog。
pkColumnName 该属性设置的是生成序列号的表中的主键字段的名称,该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 ID
valueColumnName 该属性设置的是生成序列号的表中记录实体对应标识最大值的字段的名称。该属性并不是必须设置的属性,如果开发者没有为该 属性设置值,OpenJPA 容器将会使用默认值 SEQUENCE_VALUE
pkColumnValue 该属性设置的是生成序列号的表中的主键字段的特征字符串值 ( 比如 customID ),该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 DEFAULT。可以为多个实体设置相同的 pkColumnValue属性值,这些实体标识的生成将通过同一列的值的递增来实现。
initialValue 该属性设置的是生成序列号的表实体标识的初始值。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 0 。
allocationSize 为了降低标识生成时频繁操作数据库造成 的性能上的影响,实体标识生成的时候会一次性的获取多个实体标识,该属性设置的就是一次性获取实体标识的数目。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 50 。

实体标识自动生成

在上面的小节中,我们了解了和实体标识自动生成相关的注释,接下来我们将结合一个简单的例子讲述如何分别使用这些实体标识自动生成策略实现实体标识的自动生成。

我们首先假设有一个 Animal实体需要被持久化,它包括 IDNAME属性,其中 ID是它的主键字段。Animal实体的标识需要自动生成,我们将分析在这四种不用的情况下,如何使用 OpenJPA 提供的注释,结合具体数据库支持的特性,如自增长字段、序列号等来实现实体标识的自动生成。

容器自动生成

OpenJPA 容器默认的实体标识自动生成策略是由容器管理实体标识的自动生成,容器管理的实体标识可以支持数值型和字符型两种。当容器管理的实体标识是数字型时,OpenJPA 容器自动创建一个数据库表 OPENJPA_SEQUENCE_TABLE,用其中的 SEQUENCE_VALUE字段来记录实体的实体标识的增长。

当容器管理的实体标识是字符串类型时,OpenJPA 支持使用 uuid-string 和 uuid-hex 两种方式生成相应的实体标识。如果我们选择使用 uuid-string 方式生成实体标识时,OpenJPA 框架会自动为实体生成一个 128 位的 UUID,并且将这个 UUID 转化为使用 16 位字符表示的字符串。如果我们选择使用 uuid-hex 方式生成实体标识时,OpenJPA 框架会自动为实体生成一个 128 位的 UUID,并且将这个 UUID 转化为使用 32 位字符表示的 16 进制的字符串。

数值标识

容器管理的实体标识可以是数值型的,OpenJPA 框架管理的实体标识借助于数据库的表来实现,在运行时 OpenJPA 框架会自动在数据库中创建表 OPENJPA_SEQUENCE_TABLE。它有两个字段:IDSEQUENCE_VALUE,这两个字段都是数值类型,其中 ID是表的主键字段,它的内容是查询当前实体标识时所使用的关键词,默认值是 0。而 SEQUENCE_VALUE记录了当前 OpenJPA 框架中当前实体标识的历史数据,内容是已经被获取实体标识的最大数值加 1。

我们要使用注释描述 Animal实体的标识由容器自动生成,只需要为它的标识字段提供 GeneratedValue注释,并且把它的 strategy属性设置为 GenerationType.AUTO, Animal实体类的代码片断如下:


清单 1. 标识由容器自动生成的 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 框架自动调用 SQL 语句 SELECT SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID=0,从默认保存实体标识的 OPENJPA_SEQUENCE_TABLE表中获取实体的标识,如果不存在 ID为 0 的记录,OpenJPA 框架自动将实体的标识设置为 1。

容器管理实体标识的情况下,为了获得实体标识,应用程序将不得不频繁地和数据库交互,这会影响应用程序的运行效率。OpenJPA 中使用实体标识缓存机制解决这个问题。默认情况下,当应用程序第一次获取实体标识时,OpenJPA 框架从数据库中一次性获取 50 个连续的实体标识缓存起来,当下一次应用程序需要获取实体标识时,OpenJPA 将首先检测缓存中是否存在实体标识,如果存在,OpenJPA 将直接使用缓存中的实体标识,如果不存在,OpenJPA 框架将会从数据库中再次获取 50 个连续的实体标识缓存起来,如此类推。这样的处理方式可以大大减少由于获取实体标识而产生的数据库交互,提升应用程序的运行效率。

当实体标识成功获取之后,OpenJPA 框架会把当前实体标识的最大值 +1 后持久化到数据库中。由于实体标识缓存的原因,当我们第一次获取实体标识后,OpenJPA 会将 OPENJPA_SEQUENCE_TABLE表的 SEQUENCE_VALUE的值设置为 51,当 OpenJPA 多次从数据库中获取实体标识后,SEQUENCE_VALUE的值会以 50 为单位递增,变为 101、151、201 …。

OpenJPA 缓存的实体标识不是永久存在的,只能在同一个 EntityManagerFactory管理范围内起作用,也就是说,当获取实体标识的 EntityManagerFactory对象被关闭后,这些被获取的实体标识中没有用掉的那一部分标识就丢失了,这会造成实体标识的不连续。由同一个 EntityManagerFactory对象创建的 EntityManager上下文之间则能够共享 OpenJPA 框架获取的实体标识,这意味着,我们可以使用同一个 EntityManagerFactory对象创建多个 EntityManager对象,用它来持久化实体,然后关闭它,在持久化过程中所需要的实体表示将会使用同一个实体标识的缓存区,因此不会引起实体标识的丢失。

容器管理的实体标识还有一个非常重要的特性:所有被容器管理的实体标识都是共享的。不管 OpenJPA 容器中存在多少个不同的被容器管理的实体标识,它们都会从同一个实体标识缓存中获取实体标识。我们可以用下面的例子说明这种情况:假设 OpenJPA 容器中存在两个实体类 DogFish,它们的实体标识字段都是数值型,并且都由 OpenJPA 管理。当我们首先持久化一个 Dog对象时,它的实体标识将会是 1,紧接着我们持久化一个 Fish对象,它的实体标识就是 2,依次类推。

uuid-string

要使用 uuid-string 机制自动生成实体标识,我们需要将实体主键字段的 GeneratedValue注释的 strategy属性设置为 GenarationType.AUTO,然后将 GeneratedValue注释的 generator属性设置为 uuid-string。以 Animal 实体类为例,我们只需要将 Animal 实体修改为如下内容:


清单 2. 使用 uuid-string 机制自动生成实体标识
            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 机制自动生成实体标识,我们必须将实体主键字段的 GeneratedValue注释的 strategy属性设置为 GenarationType.AUTO,然后将 GeneratedValue注释的 generator属性设置为 uuid-hex。以 Animal 实体类为例,我们只需要将 Animal 实体修改为如下内容:


清单 3. 使用 uuid-hex 机制自动生成实体标识
            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 等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,OpenJPA 框架中的实体标识能够满足应用程序设计者的要求,使用数据库的自增长字段为实体自动生成标识。

要将实体标识的自动生成委托给数据库的自增长字段特性,需要数据库和实体定义的双方配合才能够达到:首先,必须将实体标识字段对应的数据库列修改为自动增长列,另外还需要将实体类中实体标识字段的 GeneratedValue注释的 stragety属性的值设置为 GenerationType.IDENTITY

我们以 Animal 实体在 HSQL 数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤:

首先,我们使用下面的 SQL 语句创建 Animal 表,把它的 ID字段设置为自动增长类型:


清单 4. 将 ID 字段设置为自动增长类型的 SQL 语句
            CREATE TEXT TABLE ANIMAL (
            ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,
            NAME VARCHAR(255) NOT NULL
            )
            

在数据库部分将表的主键字段设置为自动增长字段后,在实体 Animal的定义中,我们需要将 id字段 GeneratedValue注释的 stragety属性的值设置为 GenerationType.IDENTITY。Animal 实体类修改后的代码片段如下。


清单 5. 标识由自增长字段生成的 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 等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,使用 Oracle、PostgreSQL 等数据库应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,OpenJPA 框架中的实体标识能够满足应用程序设计者的要求,使用数据库的序列号为实体自动生成标识。

要将实体标识的自动生成委托给数据库的序列号特性,需要数据库和实体定义的双方配合才能够达到:首先,必须在数据库中创建合适的序列号,另外还需要为实体标识字段提供 SequenceGenerator注释,设置它的参数,为实体类提供关于序列号的信息,同时将实体类中实体标识字段的 GeneratedValue注释的 stragety属性的值设置为 GenerationType.SEQUENCE,将 generator属性的值设置为 SequenceGenerator注释的 name属性的值。

我们以 Animal 实体在 Oracle 数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤:

首先,在 Oracle 数据库中运行下面的 SQL 语句创建名为 HelloWorldSequence的序列号,序列号支持 cache,大小为 50:


清单 6. 创建序列号的 SQL 语句
            CREATE SEQUENCE HELLOWORLDSEQUENCE
            START WITH 0
            INCREMENT BY 1
            MINVALUE 1
            CACHE 50
            NOCYCLE
            NOORDER
            

然后,在 Oracle 数据库中,我们使用下面的 SQL 语句创建 ANIMAL表:


清单 7. 创建 ANIMAL 表
            CREATE TABLE EOS52.ANIMAL
            (
            ID CHAR(10),
            NAME VARCHAR2(100) NOT NULL,
            CONSTRAINT PK_ANIMAL PRIMARY KEY (ID )
            )
            

在数据库部分创建合适的序列号和相应的数据库表后,在实体 Animal的定义中,我们需要将 id字段 GeneratedValue注释的 stragety属性的值设置为 GenerationType.SEQUENCE,设置它的 generator属性的值为 SeqGenerator。我们还需要为 id字段提供另外一个相关的注释 SequenceGenerator,设置它的 name属性为 SeqGenerator,设置它 sequenceName属性为 HelloWorldSequence。Animal 实体类修改后的代码片段如下。


清单 8. 标识由序列号生成的 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. }
            

数据库表

除了使用容器生成的实体标识,或者借助于数据库的自增长字段或者序列号等方式生成实体标识之外,我们还可以选择借助数据库表来自动生成实体标识。原理是我们提供一个独立的数据库表,该表的主键列 ( 假设列名 ID) 记录实体编号的特征字符串 ( 假设存在一条记录的 IDcustomID),另外一列 ( 假设列名为 SEQUENCE_VALUE) 记录该特征字符串对应实体标识的最大值。编写实体代码时,我们指定实体标识由数据库表中指定的特征字符串 ( 如 customID) 对应的列 SEQUENCE_VALUE处理,当有新的实体被持久化时,容器将获取行 customID、列 SEQUENCE_VALUE对应的数值 +1 后作为新实体的标识,同时将该列的值也自动 +1。

要将实体标识的自动生成委托给数据库表,需要数据库和实体定义的双方配合才能够达到:首先,必须在数据库中创建合适的保存实体标识的表,另外还需要为实体标识字段提供 TableGenerator注释,设置它的参数,为实体类提供关于数据库表、字段的信息,同时将实体类中实体标识字段的 GeneratedValue注释的 stragety属性的值设置为 GenerationType.Table,将 generator属性的值设置为 SequenceGenerator注释的 name属性的值。

我们以 Animal 实体类来说明使用数据库表自动生成实体标识所需要采取的步骤:我们假设存在这样的场景,Animal 实体的标识由应用程序中自定义的数据库表 MY_KEYS自动生成,MY_KEYS表中有两列,一列是 KEYID,它保存实体标识的特征值,一列是 KEYVALUE,它保存实体当前的最大编号,除此之外,我们还决定使用 ANIMALID作为 Animal 实体标识的特征字符串。

首先,在数据库中使用下面的 SQL 语句创建名为 MY_KEYS的数据库表。在 OpenJPA 容器中,如果我们没有创建 MY_KEYS表,OpenJPA 容器将帮我们自动生成对应的表结构。


清单 9. 创建数据库表 MY_KEYS
            CREATE TABLE MY_KEYS (
            KEYID VARCHAR(255) NOT NULL,
            KEYVALUE BIGINT,
            PRIMARY KEY (KEYID)
            )
            

在数据库部分创建合适的数据库表后,在实体 Animal 的定义中,我们需要将 id字段 GeneratedValue注释的 stragety属性的值设置为 GenerationType.TABLE,设置它的 generator属性的值为 TableGenerator。我们还需要为 id字段提供另外一个注释 TableGenerator,设置它的 name属性为 TableGenerator,设置它的 table属性为 MYKEYSpkColumnName属性为 KEYIDvalueColumnName属性为 KEYVALUEANIMALID属性为 ANIMALID。Animal 实体类修改后的代码片段如下。


清单 10. 标识由数据库表生成的 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. }
            


调用代码

上面的章节中我们学习了分别使用四种方式来自动生成实体的标识,由于这四种情况下,Animal 实体的标识都由 OpenJPA 和数据库协作后自动生成,对于开发者而言,这个过程是透明的,因此我们可以使用相同的方式来创建这些实体:创建新的 Animal 实例的时候不再需要为主键字段提供属性值,只需要设置 Animal 实例的非标识字段 name的值即可。下面的代码演示了 Animal 实例的持久化代码,请注意代码中并没有调用 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. 		 // 此处不需要调用 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();
            


总结

本文介绍了开发者使用 OpenJPA 实现实体标识自动生成时可选择使用的注释,并且结合简单的例子,分别介绍了 OpenJPA 中实现容器管理的实体标识自动生成、结合数据库自增长字段、序列号、数据库表等特性实现实体标识自动生成时注释的具体用法和操作步骤。


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


posted @ 2011-05-03 23:06 Alpha 阅读(12971) | 评论 (0)编辑 收藏

1,oracle中实例的创建:oracle中实例创建即SID的创建,通常在安装完oracle后,启动 配置和移植工具中的(数据库配置向导)

 database configuration assistant ,按照向导去创建SID,当日利用database configuration assistant 还可以 创建数据库、配置数据选件、删除数据库、管理模板、配置自动存储管理。

2,oracle中服务的创建:在oracle实例创建完后,就可以创建服务名了。注意:连接一个实例可以有多个服务名。启动 配置和移植工具中的net manager(网络配置),按照向导开始配置 网络服务名==》TCP/IP协议==》主机名(服务端的IP地址)==》oracle8i或更高版本 服务名(即SID实例名称)==》测试 ==》完成。

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

datasource.driverClassName=oracle.jdbc.OracleDriver
datasource.url=jdbc:oracle:thin:@//127.0.0.1:1521/ORCL  (注意,这个orcl就是指第二项 oracle中服务的创建)
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 阅读(1492) | 评论 (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 阅读(815) | 评论 (0)编辑 收藏
仅列出标题
共18页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last