blogjava-凯发k8网页登录

blogjava-凯发k8网页登录http://www.blogjava.net/alpha/category/9664.html多少春秋风雨改 多少崎岖不变爱zh-cnsat, 23 dec 2017 14:51:37 gmtsat, 23 dec 2017 14:51:37 gmt60linux下mysql的root密码忘记解决方http://www.blogjava.net/alpha/archive/2013/04/19/398078.htmlalphaalphafri, 19 apr 2013 03:39:00 gmthttp://www.blogjava.net/alpha/archive/2013/04/19/398078.htmlhttp://www.blogjava.net/alpha/comments/398078.htmlhttp://www.blogjava.net/alpha/archive/2013/04/19/398078.html#feedback0http://www.blogjava.net/alpha/comments/commentrss/398078.htmlhttp://www.blogjava.net/alpha/services/trackbacks/398078.html1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接mysql数据库。
因为在重新设置mysql的root密码的期间,mysql数据库完全出于没有密码保护的
状态下,其他的用户也可以任意地登录和修改mysql的信息。可以采用将mysql对
外的端口封闭,并且停止apache以及所有的用户进程的方法实现服务器的准安全
状态。最安全的状态是到服务器的console上面操作,并且拔掉网线。
2.修改mysql的登录设置:
# vi /etc/my.cnf
在[mysqld]的段中加上一句:skip-grant-tables
例如:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-grant-tables
保存并且退出vi。
3.重新启动mysqld
# /etc/init.d/mysqld restart
stopping mysql: [ ok ]
starting mysql: [ ok ]
4.登录并修改mysql的root密码
# /usr/bin/mysql
welcome to the mysql monitor. commands end with ; or \g.
your mysql connection id is 3 to server version: 3.23.56
type 'help;' or '\h' for help. type '\c' to clear the buffer.
mysql> use mysql ;
reading table information for completion of table and column names
you can turn off this feature to get a quicker startup with -a
database changed
mysql> update user set password = password ( 'new-password' ) where user = 'root' ;
query ok, 0 rows affected (0.00 sec)
rows matched: 2 changed: 0 warnings: 0
mysql> flush privileges ;
query ok, 0 rows affected (0.01 sec)
mysql> quit
bye
5.将mysql的登录设置修改回来
# vi /etc/my.cnf
将刚才在[mysqld]的段中加上的skip-grant-tables删除
保存并且退出vi。
6.重新启动mysqld
# /etc/init.d/mysqld restart
stopping mysql: [ ok ]
starting mysql: [ ok ]

alpha 2013-04-19 11:39
]]>
yum搭建lnmp环境(centos6)http://www.blogjava.net/alpha/archive/2012/09/12/387583.htmlalphaalphawed, 12 sep 2012 10:39:00 gmthttp://www.blogjava.net/alpha/archive/2012/09/12/387583.htmlhttp://www.blogjava.net/alpha/comments/387583.htmlhttp://www.blogjava.net/alpha/archive/2012/09/12/387583.html#feedback1http://www.blogjava.net/alpha/comments/commentrss/387583.htmlhttp://www.blogjava.net/alpha/services/trackbacks/387583.html

1.关闭防火墙
[root@centos ~]# chkconfig iptables off

2.关闭selinux
vi /etc/sysconfig/selinux
//将selinux=enforcing修改为disabled然后重启生效

3、配置centos 6.0 第三方yum源(centos默认的标准源里没有nginx软件包)
[root@centos ~]# yum install wget
//下载wget工具
[root@centos ~]# wget http://www.atomicorp.com/installers/atomic
//下载atomic yum源
[root@centos ~]# sh ./atomic
//安装提示输入时输yes
[root@centos ~]# yum check-update
//更新yum软件包

4.安装开发包和库文件
[root@centos ~]# yum -y install ntp make openssl openssl-devel pcre pcre-devel libpng
libpng-devel libjpeg-6b libjpeg-devel-6b freetype freetype-devel gd gd-devel zlib zlib-devel
gcc gcc-c libxpm libxpm-devel ncurses ncurses-devel libmcrypt libmcrypt-devel libxml2
libxml2-devel imake autoconf automake screen sysstat compat-libstdc -33 curl curl-devel

5.卸载已安装的apache、mysql、php
[root@centos ~]# yum remove httpd
[root@centos ~]# yum remove mysql
[root@centos ~]# yum remove php

6.安装nginx
[root@centos ~]# yum install nginx
[root@centos ~]# service nginx start
[root@centos ~]# chkconfig --levels 235 nginx on
//设2、3、5级别开机启动

7.安装mysql
[root@centos ~]# yum install mysql mysql-server mysql-devel
[root@centos ~]# service mysqld start
[root@centos ~]# chkconfig --levels 235 mysqld on
[root@centos ~]# mysqladmin -u root password "123456"
//为root用户设置密码
[root@centos ~]# service mysqld restart
//重启mysql

8.安装php
[root@centos ~]# yum install php lighttpd-fastcgi php-cli php-mysql php-gd php-imap php-ldap
php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-mssql php-snmp php-soap
php-tidy php-common php-devel php-fpm
//安装php和所需组件使php支持mysql、fastcgi模式
[root@centos ~]# service php-fpm start
[root@centos ~]# chkconfig --levels 235 php-fpm on

9.配置nginx支持php
[root@centos ~]# mv /etc/nginx/nginx.conf /etc/nginx/nginx.confbak
//将配置文件改为备份文件
[root@centos ~]# cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf
//由于原配置文件要自己去写因此可以使用默认的配置文件作为配置文件
//修改nginx配置文件,添加fastcgi支持
[root@centos ~]# vi /etc/nginx/nginx.conf
index index.php index.html index.htm;
//加入index.php
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param script_filename /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
//将以上代码注释去掉,并修改成nginx默认路径

10.配置php
//编辑文件php.ini,在文件末尾添加cgi.fix_pathinfo = 1
[root@centos ~]# vi /etc/php.ini

11.重启nginx php-fpm
[root@centos ~]# service nginx restart
[root@centos ~]# service php-fpm restart

12.建立info.php文件
[root@centos ~]# vi /usr/share/nginx/html/info.php
phpinfo();
?>

13.测试nginx是否解析php
输入:192.168.1.105/info.php
显示php界面说明解析成功



alpha 2012-09-12 18:39
]]>
crontab自动执行脚本kill掉mysql的僵死进程http://www.blogjava.net/alpha/archive/2012/01/19/368749.htmlalphaalphathu, 19 jan 2012 06:20:00 gmthttp://www.blogjava.net/alpha/archive/2012/01/19/368749.htmlhttp://www.blogjava.net/alpha/comments/368749.htmlhttp://www.blogjava.net/alpha/archive/2012/01/19/368749.html#feedback0http://www.blogjava.net/alpha/comments/commentrss/368749.htmlhttp://www.blogjava.net/alpha/services/trackbacks/368749.html mysql php的模式在大并发压力下经常会导致mysql中存在大量僵死进程,导致服务挂死。为了自动干掉这些进程,弄了个脚本,放在服务器后台通过crontab自动执行。发现这样做了以后,的确很好的缓解了这个问题。把这个脚本发出来和大家share。

根据自己的实际需要,做了一些修改:

shell脚本:mysqld_kill_sleep.sh
#!/bin/sh
mysql_pwd="root的密码"
mysqladmin_exec
="/usr/local/bin/mysqladmin"
mysql_exec
="/usr/local/bin/mysql"
"/tmp"
mysql_timeout_log
="$mysql_timeout_dir/mysql_timeout.log"
mysql_kill_timeout_sh
="$mysql_timeout_dir/mysql_kill_timeout.sh"
"$mysql_timeout_dir/mysql_kill_timeout.log"
$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -time | grep -'|' | sort -rn > $mysql_timeout_log
awk 
'{if($1>30 && $3!="root") print "'""$mysql_exec""' -e " "/"" "kill",$2 "/"" " -uroot " "-p""/"""'""$mysql_pwd""'""/"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_sh
echo 
"check start ." >> $mysql_kill_timeout_log
echo `date` 
>> $mysql_kill_timeout_log
cat 
$mysql_kill_timeout_sh


  把这个写到mysqld_kill_sleep.sh。然后chmod 0 mysqld_kill_sleep.sh,chmod u rx mysqld_kill_sleep.sh,然后用root账户到cron里面运行即可,时间自己调整。执行之后显示:
www# ./mysqld_kill_sleep.sh
/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27750" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码";
"kill 27888" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";

  如果确认没有问题了,把最后的cat修改为sh即可。本人改写了下上面的脚本:
#!/bin/bash
mysql_pwd="密码"
mysql_exec="/usr/local/mysql/bin/mysql"
mysql_timeout_dir="/tmp"
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"
"$mysql_timeout_dir/mysql_kill_timeout.log"
$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "locked" >> $mysql_kill_timeout_log

for line in `$mysql_kill_timeout_log  | awk '{print $1}'`
do
echo "$mysql_exec -uroot -p$mysql_pwd -e /"kill $line/"" >> $mysql_kill_timeout_sh
done

cat $mysql_kill_timeout_sh

  很多时候!一不小心就锁表!这里讲解决锁表终极方法!

案例一
mysql>showprocesslist;

  参看sql语句,一般少的话
mysql>killthread_id;

  就可以解决了,kill掉第一个锁表的进程, 依然没有改善.既然不改善,咱们就想办法将所有锁表的进程kill掉吧,简单的脚本如下:
#!/bin/bash
mysql-uroot-e"show processlist"|grep-i"locked">>locked_log.txt

forlinein`cat locked_log.txt | awk '{print$1}'`
do
echo"kill$line;">>kill_thread_id.sql
done

现在kill_thread_id.sql的内容像这个样子
kill66402982;
kill66402983;
kill66402986;
kill66402991;
.....

好了,我们在mysql的shell中执行,就可以把所有锁表的进程杀死了。
mysql>sourcekill_thread_id.sql

当然了,也可以一行搞定。
foridin`mysqladmin processlist | grep -i locked | awk '{print$1}'`
do
mysqladminkill${id}
done

案例二

  如果大批量的操作能够通过一系列的select语句产生,那么理论上就能对这些结果批量处理。但是mysql并没用提供eval这样的对结果集进行分析操作的功能。所以只能现将select结果保存到临时文件中,然后再执行临时文件中的指令。具体过程如下:
mysql> select concat('kill ',id,';') from information_schema.processlist where user='root';
------------------------
| concat('kill ',id,';')
------------------------
| kill 3101;            
| kill 2946;            
------------------------
2 rows in set (0.00 sec)

mysql> select concat('kill ',id,';') from information_schema.processlist where user='root' into outfile '/tmp/a.txt';
query ok, 2 rows affected (0.00 sec)

mysql> source /tmp/a.txt;
query ok, 0 rows affected (0.00 sec)

案例三

  mysql php的模式在大并发压力下经常会导致mysql中存在大量僵死进程,导致服务挂死。为了自动干掉这些进程,弄了个脚本,放在服务器后台通过crontab自动执行。发现这样做了以后,的确很好的缓解了这个问题。把这个脚本发出来和大家share。根据自己的实际需要,做了一些修改:

shell脚本:mysqld_kill_sleep.sh
#!/bin/sh
mysql_pwd="root的密码"
mysqladmin_exec="/usr/local/bin/mysqladmin"
mysql_exec="/usr/local/bin/mysql"
mysql_timeout_dir="/tmp"
mysql_timeout_log="$mysql_timeout_dir/mysql_timeout.log"
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"
mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"
$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -v time | grep -v '|' | sort -rn > $mysql_timeout_log
awk '{if($1>30 && $3!="root") print "'""$mysql_exec""' -e " "\"" "kill",$2 "\"" " -uroot " "-p""\"""'""$mysql_pwd""'""\"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_sh
echo "check start ...." >> $mysql_kill_timeout_log
echo `date` >> $mysql_kill_timeout_log
cat $mysql_kill_timeout_sh

  把这个写到mysqld_kill_sleep.sh。然后chmod 0 mysqld_kill_sleep.sh,chmod u rx mysqld_kill_sleep.sh,然后用root账户到cron里面运行即可,时间自己调整。执行之后显示:
www# ./mysqld_kill_sleep.sh
/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27750" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27888" -uroot -p"mysql root的密码";
/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";

  如果确认没有问题了,把最后的cat修改为sh即可。本人改写了下上面的脚本:
#!/bin/bash
mysql_pwd="密码"
mysql_exec="/usr/local/mysql/bin/mysql"
mysql_timeout_dir="/tmp"
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"
mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"
$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "locked" >> $mysql_kill_timeout_log
chmod 777 $mysql_kill_timeout_log
for line in `$mysql_kill_timeout_log  | awk '{print $1}'`
do
echo "$mysql_exec -uroot -p$mysql_pwd -e \"kill $line\"" >> $mysql_kill_timeout_sh
done
chmod 777 $mysql_kill_timeout_sh
cat $mysql_kill_timeout_sh

  是不是很方便呢!processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令。
1、进入mysql/bin目录下输入mysqladmin processlist;
2、启动mysql,输入show processlist;

  如果有super权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的mysql帐户运行的线程)。得到数据形式如下(只截取了三条):
mysql> show processlist;

----- ------------- -------------------- ------- --------- ------- ---------------------------------- ----------

| id | user | host | db | command | time| state | info

----- ------------- -------------------- ------- --------- ------- ---------------------------------- ----------

|207|root |192.168.0.20:51718 |mytest | sleep | 5 | | null

|208|root |192.168.0.20:51719 |mytest | sleep | 5 | | null

|220|root |192.168.0.20:51731 |mytest |query | 84 | locked |

select bookname,culture,value,type from book where id=001

  先简单说一下各列的含义和用途,第一列,id,不用说了吧,一个标识,你要kill一个语句的时候很有用。user列,显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。host列,显示这个语句是从哪个ip的哪个端口上发出的。呵呵,可以用来追踪出问题语句的用户。db列,显示这个进程目前连接的是哪个数据库。command列,显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。time列,此这个状态持续的时间,单位是秒。state列,显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,sorting result,sending data等状态才可以完成,info列,显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。

  这个命令中最关键的就是state列,mysql列出的状态主要有以下几种:
checking table

  正在检查数据表(这是自动的)。
closing tables

  正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。
connect out

  复制从服务器正在连接主服务器。
copying to tmp table on disk

  由于临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。
creating tmp table

  正在创建临时表以存放部分查询结果。
deleting from main table

  服务器正在执行多表删除中的第一部分,刚删除第一个表。
deleting from reference tables

  服务器正在执行多表删除中的第二部分,正在删除其他表的记录。
flushing tables

  正在执行flush tables,等待其他线程关闭数据表。
killed

  发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。mysql会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。
locked

  被其他查询锁住了。
sending data

  正在处理select查询的记录,同时正在把结果发送给客户端。
sorting for group

  正在为group by做排序。
sorting for order

  正在为order by做排序。
opening tables

  这个过程应该会很快,除非受到其他因素的干扰。例如,在执alter table或lock table语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。
removing duplicates

  正在执行一个select distinct方式的查询,但是mysql无法在前一个阶段优化掉那些重复的记录。因此,mysql需要再次去掉重复的记录,然后再把结果发送给客户端。
reopen table

  获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。
repair by sorting

  修复指令正在排序以创建索引。
repair with keycache

  修复指令正在利用索引缓存一个一个地创建新索引。它会比repair by sorting慢些。
searching rows for update

  正在讲符合条件的记录找出来以备更新。它必须在update要修改相关的记录之前就完成了。
sleeping

  正在等待客户端发送新请求.
system lock

  正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。
upgrading lock

  insert delayed正在尝试取得一个锁表以插入新记录。
updating

  正在搜索匹配的记录,并且修改它们。
user lock

  正在等待get_lock()。
waiting for tables

  该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:
flush tables tbl_name, alter table, rename table, repair table, analyze table,或optimize table。

waiting for handler insert

  insert delayed已经处理完了所有待处理的插入操作,正在等待新的请求。大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。

  还有其他的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着。

alpha 2012-01-19 14:20
]]>
mysql添加用户、删除用户、授权、修改密码等http://www.blogjava.net/alpha/archive/2011/12/27/367352.htmlalphaalphatue, 27 dec 2011 09:30:00 gmthttp://www.blogjava.net/alpha/archive/2011/12/27/367352.htmlhttp://www.blogjava.net/alpha/comments/367352.htmlhttp://www.blogjava.net/alpha/archive/2011/12/27/367352.html#feedback0http://www.blogjava.net/alpha/comments/commentrss/367352.htmlhttp://www.blogjava.net/alpha/services/trackbacks/367352.html
mysql中添加用户,新建数据库,用户授权,删除用户,修改密码
1.新建用户。
//登录mysql
@>mysql -u root -p
@>密码
//创建用户
mysql> mysql> insert into mysql.user(host,user,password,ssl_cipher,x509_issuer,x509_sub
ject) values("localhost","pppadmin",password("passwd"),'','','');
这样就创建了一个名为:phplamp 密码为:1234 的用户。
然后登录一下。
mysql>exit;
@>mysql -u phplamp -p
@>输入密码
mysql>登录成功
2.为用户授权。
//登录mysql(有root权限)。我里我以root身份登录.
@>mysql -u root -p
@>密码
//首先为用户创建一个数据库(phplampdb)
mysql>create database phplampdb;
//授权phplamp用户拥有phplamp数据库的所有权限。
>grant all privileges on phplampdb.* to phplamp@localhost identified by '1234';
//刷新系统权限表
mysql>flush privileges;
mysql>其它操作
/*
如果想指定部分权限给一用户,可以这样来写:
mysql>grant select,update on phplampdb.* to phplamp@localhost identified by '1234';
//刷新系统权限表。
mysql>flush privileges;
*/
3.删除用户。
@>mysql -u root -p
@>密码
mysql>delete from user where user="phplamp" and host="localhost";
mysql>flush privileges;
//删除用户的数据库
mysql>drop database phplampdb;
4.修改指定用户密码。
@>mysql -u root -p
@>密码
mysql>update mysql.user set password=password('新密码') where user="phplamp" and host="localhost";
mysql>flush privileges;
5.列出所有数据库
mysql>show database;
6.切换数据库
mysql>use '数据库名';
7.列出所有表
mysql>show tables;
8.显示数据表结构
mysql>describe 表名;
9.删除数据库和数据表
mysql>drop database 数据库名;
mysql>drop table 数据表名;


alpha 2011-12-27 17:30
]]>
jpa实体标识的自动生成http://www.blogjava.net/alpha/archive/2011/05/03/349454.htmlalphaalphatue, 03 may 2011 15:06:00 gmthttp://www.blogjava.net/alpha/archive/2011/05/03/349454.htmlhttp://www.blogjava.net/alpha/comments/349454.htmlhttp://www.blogjava.net/alpha/archive/2011/05/03/349454.html#feedback0http://www.blogjava.net/alpha/comments/commentrss/349454.htmlhttp://www.blogjava.net/alpha/services/trackbacks/349454.html数据的唯一性是所有应用程序非常基本的要求,由开发者或者用户来维护这种唯一性存在着较大的风险,因此,由系统自动产生唯一标识是一种常见的做法。openjpa 中支持四种不同的实体标识自动生成策略:
  • 容器自动生成的实体标识;
  • 使用数据库的自动增长字段生成实体标识;
  • 根据数据库序列号(sequence)技术生成实体标识;
  • 使用数据库表的字段生成实体标识;

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

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

每一个需要自动生成实体标识的实体都需要为它的实体标识字段提供 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属性值。

如果实体标识的自动生策略是 generationtype.sequence,开发者需要为实体标识字段提供 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。

如果实体标识的自动生策略是 generationtype.table,开发者需要为实体标识字段提供 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. 	 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 实体修改为如下内容:



            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 实体修改为如下内容:



            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字段设置为自动增长类型:



            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 实体类修改后的代码片段如下。



            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. 	 }
            

序列号是 oracle、postgresql 等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,使用 oracle、postgresql 等数据库应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,openjpa 框架中的实体标识能够满足应用程序设计者的要求,使用数据库的序列号为实体自动生成标识。

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

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

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



            create sequence helloworldsequence
            start with 0
            increment by 1
            minvalue 1
            cache 50
            nocycle
            noorder
            

然后,在 oracle 数据库中,我们使用下面的 sql 语句创建 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 实体类修改后的代码片段如下。



            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 容器将帮我们自动生成对应的表结构。



            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 实体类修改后的代码片段如下。



            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 方法。



            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/




alpha 2011-05-03 23:06
]]>
oracle11g 安装于基本配置说明http://www.blogjava.net/alpha/archive/2011/05/03/349450.htmlalphaalphatue, 03 may 2011 14:19:00 gmthttp://www.blogjava.net/alpha/archive/2011/05/03/349450.htmlhttp://www.blogjava.net/alpha/comments/349450.htmlhttp://www.blogjava.net/alpha/archive/2011/05/03/349450.html#feedback0http://www.blogjava.net/alpha/comments/commentrss/349450.htmlhttp://www.blogjava.net/alpha/services/trackbacks/349450.html1,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



alpha 2011-05-03 22:19
]]>
oracle关键字http://www.blogjava.net/alpha/archive/2011/05/03/349451.htmlalphaalphatue, 03 may 2011 14:19:00 gmthttp://www.blogjava.net/alpha/archive/2011/05/03/349451.htmlhttp://www.blogjava.net/alpha/comments/349451.htmlhttp://www.blogjava.net/alpha/archive/2011/05/03/349451.html#feedback0http://www.blogjava.net/alpha/comments/commentrss/349451.htmlhttp://www.blogjava.net/alpha/services/trackbacks/349451.html 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


alpha 2011-05-03 22:19
]]>
linux和mysql常用命令http://www.blogjava.net/alpha/archive/2010/04/16/318526.htmlalphaalphafri, 16 apr 2010 07:17:00 gmthttp://www.blogjava.net/alpha/archive/2010/04/16/318526.htmlhttp://www.blogjava.net/alpha/comments/318526.htmlhttp://www.blogjava.net/alpha/archive/2010/04/16/318526.html#feedback0http://www.blogjava.net/alpha/comments/commentrss/318526.htmlhttp://www.blogjava.net/alpha/services/trackbacks/318526.html  

.tar.bz2

解压:tar jxvf filename.tar.bz2 压缩:tar jcvf filename.tar.bz2 dirname

.gz
解压1:gunzip filename.gz   解压2:gzip -d filename.gz 压缩:gzip filename
.tar.gz
和 .tgz
解压:tar zxvf filename.tar.gz 压缩:tar zcvf filename.tar.gz dirname

.rpm
解包:rpm2cpio filename.rpm | cpio -div
.deb
解包:ar p filename.deb data.tar.gz | tar zxf -

从远程scp到本地:

scp root@192.168.2.100:/opt/test/* /opt/test ,输入远程机器密码后完成

scp -p 3588  root@192.168.2.100:/opt/test/* /opt/test 走特殊端口号


从本地scp到远程:

scp /opt/test/*  /test ,输入远程机器密码后完成

使用方式 : chmod [-cfvr] [--help] [--version] mode file...

使用方式 :chown jessie:users file1.txt 

mysql 初始化:chkconfig –add mysqld

正在使用的端口:netstat -ant

挂载usb: mount  /dev/sdc /mnt/usb

rpm 安装: rpm –ivh filename

www服务配置:/etc/httpd/conf/httpd.conf

网络测试:curl -i 

改ip地址:ifconfig eth0 192.168.2.29 netmask 255.255.255.0

改网关:route add default gw 192.168.2.254   查看:route –n

改dns:nano -w /etc/resolv.conf  


导出表结构:mysqldump -u root -p -d --add-drop-table dbname tablename > /opt/name.sql

导入表结构:mysql dbname < name.sql

修复mysql表: mysqlrepair --auto-repair -f -r dbname  tablename

给mysql用户加账号权限: grant all on dbname.* to user@'%' identified by 'pwd'; flush privileges;

加字段:alter table table_name add field_name field_type;

删字段:alter table t2 drop column c;

字段重命名:alter table t1 change a b integer;

表重命名:alter table t1 rename t2;

加索引:alter table tablename add index 索引名 (字段名1[,字段名2 …]);

删索引:alter table tablename drop index emp_name;



alpha 2010-04-16 15:17
]]>
从mysql得到最大的性能http://www.blogjava.net/alpha/archive/2009/09/22/296050.htmlalphaalphatue, 22 sep 2009 08:55:00 gmthttp://www.blogjava.net/alpha/archive/2009/09/22/296050.htmlhttp://www.blogjava.net/alpha/comments/296050.htmlhttp://www.blogjava.net/alpha/archive/2009/09/22/296050.html#feedback20http://www.blogjava.net/alpha/comments/commentrss/296050.htmlhttp://www.blogjava.net/alpha/services/trackbacks/296050.html阅读全文

alpha 2009-09-22 16:55 发表评论
]]>
mysql 字符集问题http://www.blogjava.net/alpha/archive/2009/04/11/264986.htmlalphaalphasat, 11 apr 2009 02:29:00 gmthttp://www.blogjava.net/alpha/archive/2009/04/11/264986.htmlhttp://www.blogjava.net/alpha/comments/264986.htmlhttp://www.blogjava.net/alpha/archive/2009/04/11/264986.html#feedback2http://www.blogjava.net/alpha/comments/commentrss/264986.htmlhttp://www.blogjava.net/alpha/services/trackbacks/264986.html前一段时间,一直被mysql的字符集困扰,今天就这方面的知识总结一下.
mysql的字符集支持(character set support)有两个方面:
     字符集(character set)和排序方式(collation)。
对于字符集的支持细化到四个层次:
     服务器(server),数据库(database),数据表(table)和连接(connection)。


1.mysql默认字符集

  mysql对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。

但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

    (1)编译mysql 时,指定了一个默认的字符集,这个字符集是 latin1;
    (2)安装mysql 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
    (3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
    (4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server
    (5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
    (6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
    (7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 mysql,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 utf-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 utf-8 存储。


2.查看默认字符集(默认情况下,mysql的字符集是latin1(iso_8859_1)
通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令:
     mysql> show variables like 'character%';
-------------------------- ---------------------------------
| variable_name            | value                           |
-------------------------- ---------------------------------
| character_set_client     | latin1                          |
| character_set_connection | latin1                          |
| character_set_database   | latin1                          |
| character_set_filesystem | binary                          |
| character_set_results    | latin1                          |
| character_set_server     | latin1                          |
| character_set_system     | utf8                            |
| character_sets_dir       | d:"mysql-5.0.37"share"charsets" |
-------------------------- ---------------------------------

  mysql> show variables like 'collation_%';
---------------------- -----------------
| variable_name        | value           |
---------------------- -----------------
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
---------------------- -----------------

3.修改默认字符集
  (1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,
如    default-character-set = utf8
      character_set_server =  utf8
   修改完后,重启mysql的服务,service mysql restart
   使用 mysql> show variables like 'character%';查看,发现数据库编码均已改成utf8
-------------------------- ---------------------------------
| variable_name            | value                           |
-------------------------- ---------------------------------
| character_set_client     | utf8                            |
| character_set_connection | utf8                            |
| character_set_database   | utf8                            |
| character_set_filesystem | binary                          |
| character_set_results    | utf8                            |
| character_set_server     | utf8                            |
| character_set_system     | utf8                            |
| character_sets_dir       | d:"mysql-5.0.37"share"charsets" |
-------------------------- ---------------------------------

   (2) 还有一种修改字符集的方法,就是使用mysql的命令
     mysql> set character_set_client = utf8 ;
     mysql> set character_set_connection = utf8 ;
     mysql> set character_set_database = utf8 ;
     mysql> set character_set_results = utf8 ;
     mysql> set character_set_server = utf8 ;

     mysql> set collation_connection = utf8 ;
     mysql> set collation_database = utf8 ;
     mysql> set collation_server = utf8 ;


一般就算设置了表的默认字符集为utf8并且通过utf-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

set names 'utf8';

它相当于下面的三句指令:
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = utf8;

总结:
因此,使用什么数据库版本,不管是3.x,还是4.0.x还是4.1.x,其实对我们来说不重要,重要的有二:
  1) 正确的设定数据库编码.mysql4.0以下版本的字符集总是默认iso8859-1,mysql4.1在安装的时候会让你选择。如果你准备使用utf- 8,那么在创建数据库的时候就要指定好utf-8(创建好以后也可以改,4.1以上版本还可以单独指定表的字符集)
  2) 正确的设定数据库connection编码.设置好数据库的编码后,在连接数据库时候,应该指定connection的编码,比如使用jdbc连接时,指定连接为utf8方式.


参考 "关中刀客" 的  ,原文地址http://lixiang.cn/?q=node/98










alpha 2009-04-11 10:29
]]>
mysql的mysqldump工具的基本用法http://www.blogjava.net/alpha/archive/2007/08/10/135694.htmlalphaalphafri, 10 aug 2007 01:21:00 gmthttp://www.blogjava.net/alpha/archive/2007/08/10/135694.htmlhttp://www.blogjava.net/alpha/comments/135694.htmlhttp://www.blogjava.net/alpha/archive/2007/08/10/135694.html#feedback12http://www.blogjava.net/alpha/comments/commentrss/135694.htmlhttp://www.blogjava.net/alpha/services/trackbacks/135694.html阅读全文

alpha 2007-08-10 09:21 发表评论
]]>
mysql alter 语句用法,添加、修改、删除字段等http://www.blogjava.net/alpha/archive/2007/07/23/131912.htmlalphaalphamon, 23 jul 2007 09:21:00 gmthttp://www.blogjava.net/alpha/archive/2007/07/23/131912.htmlhttp://www.blogjava.net/alpha/comments/131912.htmlhttp://www.blogjava.net/alpha/archive/2007/07/23/131912.html#feedback6http://www.blogjava.net/alpha/comments/commentrss/131912.htmlhttp://www.blogjava.net/alpha/services/trackbacks/131912.html  阅读全文

alpha 2007-07-23 17:21 发表评论
]]>
mysql 安装与使用http://www.blogjava.net/alpha/archive/2007/03/30/107464.htmlalphaalphafri, 30 mar 2007 05:45:00 gmthttp://www.blogjava.net/alpha/archive/2007/03/30/107464.htmlhttp://www.blogjava.net/alpha/comments/107464.htmlhttp://www.blogjava.net/alpha/archive/2007/03/30/107464.html#feedback1http://www.blogjava.net/alpha/comments/commentrss/107464.htmlhttp://www.blogjava.net/alpha/services/trackbacks/107464.html阅读全文

alpha 2007-03-30 13:45
]]>
mysql日期和时间函数大全http://www.blogjava.net/alpha/archive/2006/04/07/39844.htmlalphaalphafri, 07 apr 2006 06:51:00 gmthttp://www.blogjava.net/alpha/archive/2006/04/07/39844.htmlhttp://www.blogjava.net/alpha/comments/39844.htmlhttp://www.blogjava.net/alpha/archive/2006/04/07/39844.html#feedback2http://www.blogjava.net/alpha/comments/commentrss/39844.htmlhttp://www.blogjava.net/alpha/services/trackbacks/39844.html阅读全文

alpha 2006-04-07 14:51 发表评论
]]>
网站地图