﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Alpha-随笔分类-MySQL NoSQL</title><link>http://www.blogjava.net/Alpha/category/9664.html</link><description>多少春秋风雨改 多少崎岖不变爱</description><language>zh-cn</language><lastBuildDate>Sat, 23 Dec 2017 14:51:37 GMT</lastBuildDate><pubDate>Sat, 23 Dec 2017 14:51:37 GMT</pubDate><ttl>60</ttl><item><title>linux下mysql的root密码忘记解决方</title><link>http://www.blogjava.net/Alpha/archive/2013/04/19/398078.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Fri, 19 Apr 2013 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2013/04/19/398078.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/398078.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2013/04/19/398078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/398078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/398078.html</trackback:ping><description><![CDATA[<div>1．首先确认服务器出于安全的状态，也就是没有人能够任意地连接MySQL数据库。 <br />因为在重新设置MySQL的root密码的期间，MySQL数据库完全出于没有密码保护的 <br />状态下，其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对 <br />外的端口封闭，并且停止Apache以及所有的用户进程的方法实现服务器的准安全 <br />状态。最安全的状态是到服务器的Console上面操作，并且拔掉网线。 <br />2．修改MySQL的登录设置： <br /># vi /etc/my.cnf <br />在[mysqld]的段中加上一句：skip-grant-tables <br />例如： <br />[mysqld] <br />datadir=/var/lib/mysql <br />socket=/var/lib/mysql/mysql.sock <br />skip-grant-tables <br />保存并且退出vi。 <br />3．重新启动mysqld <br /># /etc/init.d/mysqld restart <br />Stopping MySQL: [ OK ] <br />Starting MySQL: [ OK ] <br />4．登录并修改MySQL的root密码 <br /># /usr/bin/mysql <br />Welcome to the MySQL monitor. Commands end with ; or \g. <br />Your MySQL connection id is 3 to server version: 3.23.56 <br />Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br />mysql&gt; USE mysql ; <br />Reading table information for completion of table and column names <br />You can turn off this feature to get a quicker startup with -A <br />Database changed <br />mysql&gt; UPDATE user SET Password = password ( 'new-password' ) WHERE User = 'root' ; <br />Query OK, 0 rows affected (0.00 sec) <br />Rows matched: 2 Changed: 0 Warnings: 0 <br />mysql&gt; flush privileges ; <br />Query OK, 0 rows affected (0.01 sec) <br />mysql&gt; quit <br />Bye <br />5．将MySQL的登录设置修改回来 <br /># vi /etc/my.cnf <br />将刚才在[mysqld]的段中加上的skip-grant-tables删除 <br />保存并且退出vi。 <br />6．重新启动mysqld <br /># /etc/init.d/mysqld restart <br />Stopping MySQL: [ OK ] <br />Starting MySQL: [ OK ]</div><img src ="http://www.blogjava.net/Alpha/aggbug/398078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2013-04-19 11:39 <a href="http://www.blogjava.net/Alpha/archive/2013/04/19/398078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>yum搭建lnmp环境（CentOS6)</title><link>http://www.blogjava.net/Alpha/archive/2012/09/12/387583.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Wed, 12 Sep 2012 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2012/09/12/387583.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/387583.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2012/09/12/387583.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/387583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/387583.html</trackback:ping><description><![CDATA[<div><p>1.关闭防火墙<br />[root@CentOS ~]# chkconfig iptables off</p> <p>2.关闭selinux<br />vi /etc/sysconfig/selinux <br />//将SELINUX=enforcing修改为disabled然后重启生效</p> <p>3、配置CentOS 6.0 第三方yum源（CentOS默认的标准源里没有nginx软件包）<br />[root@CentOS ~]# yum install wget<br />//下载wget工具<br />[root@CentOS ~]# wget http://www.atomicorp.com/installers/atomic<br />//下载atomic yum源<br />[root@CentOS ~]# sh ./atomic<br />//安装提示输入时输yes<br />[root@CentOS ~]# yum check-update<br />//更新yum软件包</p> <p>4.安装开发包和库文件<br />[root@CentOS ~]# yum -y install ntp make openssl openssl-devel pcre pcre-devel libpng  <br />libpng-devel libjpeg-6b libjpeg-devel-6b freetype freetype-devel gd gd-devel zlib zlib-devel  <br />gcc gcc-c++ libXpm libXpm-devel ncurses ncurses-devel libmcrypt libmcrypt-devel libxml2  <br />libxml2-devel imake autoconf automake screen sysstat compat-libstdc++-33 curl curl-devel</p> <p>5.卸载已安装的apache、mysql、php<br />[root@CentOS ~]# yum remove httpd<br />[root@CentOS ~]# yum remove mysql<br />[root@CentOS ~]# yum remove php</p> <p>6.安装nginx<br />[root@CentOS ~]# yum install nginx<br />[root@CentOS ~]# service nginx start<br />[root@CentOS ~]# chkconfig --levels 235 nginx on<br />//设2、3、5级别开机启动</p> <p>7.安装mysql<br />[root@CentOS ~]# yum install mysql mysql-server mysql-devel<br />[root@CentOS ~]# service mysqld start<br />[root@CentOS ~]# chkconfig --levels 235 mysqld on<br />[root@CentOS ~]# mysqladmin -u root password "123456"<br />//为root用户设置密码<br />[root@CentOS ~]# service mysqld restart<br />//重启mysql</p> <p>8.安装php<br />[root@CentOS ~]# yum install php lighttpd-fastcgi php-cli php-mysql php-gd php-imap php-ldap  <br />php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-mssql php-snmp php-soap  <br />php-tidy php-common php-devel php-fpm<br />//安装php和所需组件使PHP支持MySQL、FastCGI模式<br />[root@CentOS ~]# service php-fpm start<br />[root@CentOS ~]# chkconfig --levels 235 php-fpm on</p> <p>9.配置nginx支持php<br />[root@CentOS ~]# mv /etc/nginx/nginx.conf /etc/nginx/nginx.confbak<br />//将配置文件改为备份文件<br />[root@CentOS ~]# cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf<br />//由于原配置文件要自己去写因此可以使用默认的配置文件作为配置文件<br />//修改nginx配置文件，添加fastcgi支持<br />[root@CentOS ~]# vi /etc/nginx/nginx.conf<br />index index.php index.html index.htm;<br />//加入index.php<br />location ~ \.php$ {<br />            root           /usr/share/nginx/html;<br />            fastcgi_pass   127.0.0.1:9000;<br />            fastcgi_index  index.php;<br />            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;<br />            include        fastcgi_params;<br />        }<br />//将以上代码注释去掉，并修改成nginx默认路径</p> <p>10.配置php<br />//编辑文件php.ini，在文件末尾添加cgi.fix_pathinfo = 1<br />[root@CentOS ~]# vi /etc/php.ini</p> <p>11.重启nginx php-fpm<br />[root@CentOS ~]# service nginx restart<br />[root@CentOS ~]# service php-fpm restart</p> <p>12.建立info.php文件<br />[root@CentOS ~]# vi /usr/share/nginx/html/info.php<br />&lt;?php<br />   phpinfo();<br />?&gt;</p> <p>13.测试nginx是否解析php<br />输入：192.168.1.105/info.php<br />显示php界面说明解析成功</p></div><img src ="http://www.blogjava.net/Alpha/aggbug/387583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2012-09-12 18:39 <a href="http://www.blogjava.net/Alpha/archive/2012/09/12/387583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Crontab自动执行脚本Kill掉MySQL的僵死进程</title><link>http://www.blogjava.net/Alpha/archive/2012/01/19/368749.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Thu, 19 Jan 2012 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2012/01/19/368749.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/368749.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2012/01/19/368749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/368749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/368749.html</trackback:ping><description><![CDATA[<div>　MySQL + PHP的模式在大并发压力下经常会导致MySQL中存在大量僵死进程，导致服务挂死。为了自动干掉这些进程，弄了个脚本，放在服务器后台通过crontab自动执行。发现这样做了以后，的确很好的缓解了这个问题。把这个脚本发出来和大家Share。<br /><br />根据自己的实际需要，做了一些修改：<br /><br />SHELL脚本:mysqld_kill_sleep.sh<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">#</span><span style="color: #008000; ">!/bin/sh</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">mysql_pwd</span><span style="color: #000000; ">=</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">root的密码</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />mysqladmin_exec</span><span style="color: #000000; ">=</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">/usr/local/bin/mysqladmin</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />mysql_exec</span><span style="color: #000000; ">=</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">/usr/local/bin/mysql</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">/tmp</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />mysql_timeout_log</span><span style="color: #000000; ">=</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$mysql_timeout_dir/mysql_timeout.log</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br />mysql_kill_timeout_sh</span><span style="color: #000000; ">=</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$mysql_timeout_dir/mysql_kill_timeout.sh</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$mysql_timeout_dir/mysql_kill_timeout.log</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; "><br /></span><span style="color: #800080; ">$mysqladmin_exec</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">uroot&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">p</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">$mysql_pwd</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;processlist&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;awk&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">{&nbsp;print&nbsp;$12&nbsp;,&nbsp;$2&nbsp;,$4}</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">grep</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">v&nbsp;</span><span style="color: #0000FF; ">Time</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">grep</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">v&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">|</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sort</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rn&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$mysql_timeout_log</span><span style="color: #000000; "><br />awk&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">{if($1&gt;30&nbsp;&amp;&amp;&nbsp;$3!="root")&nbsp;print&nbsp;"</span><span style="color: #000000; font-weight: bold; ">'""</span><span style="color: #800080; ">$mysql_exec</span><span style="color: #000000; font-weight: bold; ">""'</span><span style="color: #000000; font-weight: bold; ">&nbsp;-e&nbsp;"&nbsp;"/""&nbsp;"kill",$2&nbsp;"/""&nbsp;"&nbsp;-uroot&nbsp;"&nbsp;"-p""/"""</span><span style="color: #000000; font-weight: bold; ">'""</span><span style="color: #800080; ">$mysql_pwd</span><span style="color: #000000; font-weight: bold; ">""'</span><span style="color: #000000; font-weight: bold; ">""/""&nbsp;";"&nbsp;}</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$mysql_timeout_log</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$mysql_kill_timeout_sh</span><span style="color: #000000; "><br />echo&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">check&nbsp;start&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$mysql_kill_timeout_log</span><span style="color: #000000; "><br />echo&nbsp;`date`&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">$mysql_kill_timeout_log</span><span style="color: #000000; "><br />cat&nbsp;</span><span style="color: #800080; ">$mysql_kill_timeout_sh</span></div><br /><br />　　把这个写到mysqld_kill_sleep.sh。然后chmod 0 mysqld_kill_sleep.sh,chmod u+rx mysqld_kill_sleep.sh，然后用root账户到cron里面运行即可，时间自己调整。执行之后显示：<br />www# ./mysqld_kill_sleep.sh<br />/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27750" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码";<br />"kill 27888" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";<br /><br />　　如果确认没有问题了，把最后的cat修改为sh即可。本人改写了下上面的脚本：<br />#!/bin/bash<br />mysql_pwd="密码"<br />mysql_exec="/usr/local/mysql/bin/mysql"<br />mysql_timeout_dir="/tmp"<br />mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"<br />"$mysql_timeout_dir/mysql_kill_timeout.log"<br />$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" &gt;&gt; $mysql_kill_timeout_log<br /><br />for line in `$mysql_kill_timeout_log&nbsp; | awk '{print $1}'`<br />do<br />echo "$mysql_exec -uroot -p$mysql_pwd -e /"kill $line/"" &gt;&gt; $mysql_kill_timeout_sh<br />done<br /><br />cat $mysql_kill_timeout_sh<br /><br />　　很多时候！一不小心就锁表！这里讲解决锁表终极方法！<br /><br />案例一<br />mysql&gt;showprocesslist;<br /><br />　　参看sql语句，一般少的话<br />mysql&gt;killthread_id;<br /><br />　　就可以解决了，kill掉第一个锁表的进程， 依然没有改善．既然不改善，咱们就想办法将所有锁表的进程kill掉吧，简单的脚本如下：<br />#!/bin/bash<br />mysql-uroot-e"show processlist"|grep-i"Locked"&gt;&gt;locked_log.txt<br /><br />forlinein`cat locked_log.txt | awk '{print$1}'`<br />do<br />echo"kill$line;"&gt;&gt;kill_thread_id.sql<br />done<br /><br />现在kill_thread_id.sql的内容像这个样子<br />kill66402982;<br />kill66402983;<br />kill66402986;<br />kill66402991;<br />.....<br /><br />好了，我们在mysql的shell中执行，就可以把所有锁表的进程杀死了。<br />mysql&gt;sourcekill_thread_id.sql<br /><br />当然了，也可以一行搞定。<br />foridin`mysqladmin processlist | grep -i locked | awk '{print$1}'`<br />do<br />mysqladminkill${id}<br />done<br /><br />案例二<br /><br />　　如果大批量的操作能够通过一系列的select语句产生，那么理论上就能对这些结果批量处理。但是mysql并没用提供eval这样的对结果集进行分析操作的功能。所以只能现将select结果保存到临时文件中，然后再执行临时文件中的指令。具体过程如下：<br />mysql&gt; SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root';<br />+------------------------+<br />| concat('KILL ',id,';')<br />+------------------------+<br />| KILL 3101;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />| KILL 2946;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />+------------------------+<br />2 rows IN SET (0.00 sec)<br /><br />mysql&gt; SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';<br />Query OK, 2 rows affected (0.00 sec)<br /><br />mysql&gt; source /tmp/a.txt;<br />Query OK, 0 rows affected (0.00 sec)<br /><br />案例三<br /><br />　　MySQL + PHP的模式在大并发压力下经常会导致MySQL中存在大量僵死进程，导致服务挂死。为了自动干掉这些进程，弄了个脚本，放在服务器后台通过crontab自动执行。发现这样做了以后，的确很好的缓解了这个问题。把这个脚本发出来和大家Share。根据自己的实际需要，做了一些修改：<br /><br />SHELL脚本:mysqld_kill_sleep.sh<br />#!/bin/sh<br />mysql_pwd="root的密码"<br />mysqladmin_exec="/usr/local/bin/mysqladmin"<br />mysql_exec="/usr/local/bin/mysql"<br />mysql_timeout_dir="/tmp"<br />mysql_timeout_log="$mysql_timeout_dir/mysql_timeout.log"<br />mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"<br />mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"<br />$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -v Time | grep -v '|' | sort -rn &gt; $mysql_timeout_log<br />awk '{if($1&gt;30 &amp;&amp; $3!="root") print "'""$mysql_exec""' -e " "\"" "kill",$2 "\"" " -uroot " "-p""\"""'""$mysql_pwd""'""\"" ";" }' $mysql_timeout_log &gt; $mysql_kill_timeout_sh<br />echo "check start ...." &gt;&gt; $mysql_kill_timeout_log<br />echo `date` &gt;&gt; $mysql_kill_timeout_log<br />cat $mysql_kill_timeout_sh<br /><br />　　把这个写到mysqld_kill_sleep.sh。然后chmod 0 mysqld_kill_sleep.sh,chmod u+rx mysqld_kill_sleep.sh，然后用root账户到cron里面运行即可，时间自己调整。执行之后显示：<br />www# ./mysqld_kill_sleep.sh<br />/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27750" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27888" -uroot -p"mysql root的密码";<br />/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";<br /><br />　　如果确认没有问题了，把最后的cat修改为sh即可。本人改写了下上面的脚本：<br />#!/bin/bash<br />mysql_pwd="密码"<br />mysql_exec="/usr/local/mysql/bin/mysql"<br />mysql_timeout_dir="/tmp"<br />mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"<br />mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"<br />$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" &gt;&gt; $mysql_kill_timeout_log<br />chmod 777 $mysql_kill_timeout_log<br />for line in `$mysql_kill_timeout_log&nbsp; | awk '{print $1}'`<br />do<br />echo "$mysql_exec -uroot -p$mysql_pwd -e \"kill $line\"" &gt;&gt; $mysql_kill_timeout_sh<br />done<br />chmod 777 $mysql_kill_timeout_sh<br />cat $mysql_kill_timeout_sh<br /><br />　　是不是很方便呢！processlist命令的输出结果显示了有哪些线程在运行，可以帮助识别出有问题的查询语句，两种方式使用这个命令。<br />1、进入mysql/bin目录下输入mysqladmin processlist;<br />2、启动mysql，输入show processlist;<br /><br />　　如果有SUPER权限，则可以看到全部的线程，否则，只能看到自己发起的线程（这是指，当前对应的MySQL帐户运行的线程）。得到数据形式如下（只截取了三条）：<br />mysql&gt; show processlist;<br /><br />+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------<br /><br />| Id | User | Host | db | Command | Time| State | Info<br /><br />+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------<br /><br />|207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL<br /><br />|208|root |192.168.0.20:51719 |mytest | Sleep | 5 | | NULL<br /><br />|220|root |192.168.0.20:51731 |mytest |Query | 84 | Locked |<br /><br />select bookname,culture,value,type from book where id=001<br /><br />　　先简单说一下各列的含义和用途，第一列，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语句就显示不全，但是一个判断问题语句的重要依据。<br /><br />　　这个命令中最关键的就是state列，mysql列出的状态主要有以下几种：<br />Checking table<br /><br />　　正在检查数据表（这是自动的）。<br />Closing tables<br /><br />　　正在将表中修改的数据刷新到磁盘中，同时正在关闭已经用完的表。这是一个很快的操作，如果不是这样的话，就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。<br />Connect Out<br /><br />　　复制从服务器正在连接主服务器。<br />Copying to tmp table on disk<br /><br />　　由于临时结果集大于tmp_table_size，正在将临时表从内存存储转为磁盘存储以此节省内存。<br />Creating tmp table<br /><br />　　正在创建临时表以存放部分查询结果。<br />deleting from main table<br /><br />　　服务器正在执行多表删除中的第一部分，刚删除第一个表。<br />deleting from reference tables<br /><br />　　服务器正在执行多表删除中的第二部分，正在删除其他表的记录。<br />Flushing tables<br /><br />　　正在执行FLUSH TABLES，等待其他线程关闭数据表。<br />Killed<br /><br />　　发送了一个kill请求给某线程，那么这个线程将会检查kill标志位，同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标志位，不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了，那么kill请求会在锁释放时马上生效。<br />Locked<br /><br />　　被其他查询锁住了。<br />Sending data<br /><br />　　正在处理Select查询的记录，同时正在把结果发送给客户端。<br />Sorting for group<br /><br />　　正在为GROUP BY做排序。<br />Sorting for order<br /><br />　　正在为ORDER BY做排序。<br />Opening tables<br /><br />　　这个过程应该会很快，除非受到其他因素的干扰。例如，在执Alter TABLE或LOCK TABLE语句行完以前，数据表无法被其他线程打开。正尝试打开一个表。<br />Removing duplicates<br /><br />　　正在执行一个Select DISTINCT方式的查询，但是MySQL无法在前一个阶段优化掉那些重复的记录。因此，MySQL需要再次去掉重复的记录，然后再把结果发送给客户端。<br />Reopen table<br /><br />　　获得了对一个表的锁，但是必须在表结构修改之后才能获得这个锁。已经释放锁，关闭数据表，正尝试重新打开数据表。<br />Repair by sorting<br /><br />　　修复指令正在排序以创建索引。<br />Repair with keycache<br /><br />　　修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些。<br />Searching rows for update<br /><br />　　正在讲符合条件的记录找出来以备更新。它必须在Update要修改相关的记录之前就完成了。<br />Sleeping<br /><br />　　正在等待客户端发送新请求.<br />System lock<br /><br />　　正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表，那么可以通过增加--skip-external-locking参数来禁止外部系统锁。<br />Upgrading lock<br /><br />　　Insert DELAYED正在尝试取得一个锁表以插入新记录。<br />Updating<br /><br />　　正在搜索匹配的记录，并且修改它们。<br />User Lock<br /><br />　　正在等待GET_LOCK()。<br />Waiting for tables<br /><br />　　该线程得到通知，数据表结构已经被修改了，需要重新打开数据表以取得新的结构。然后，为了能的重新打开数据表，必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知：<br />FLUSH TABLES tbl_name, Alter TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。<br /><br />waiting for handler insert<br /><br />　　Insert DELAYED已经处理完了所有待处理的插入操作，正在等待新的请求。大部分状态对应很快的操作，只要有一个线程保持同一个状态好几秒钟，那么可能是有问题发生了，需要检查一下。<br /><br />　　还有其他的状态没在上面中列出来，不过它们大部分只是在查看服务器是否有存在错误是才用得着。</div><img src ="http://www.blogjava.net/Alpha/aggbug/368749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2012-01-19 14:20 <a href="http://www.blogjava.net/Alpha/archive/2012/01/19/368749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql添加用户、删除用户、授权、修改密码等</title><link>http://www.blogjava.net/Alpha/archive/2011/12/27/367352.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Tue, 27 Dec 2011 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2011/12/27/367352.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/367352.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2011/12/27/367352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/367352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/367352.html</trackback:ping><description><![CDATA[<div></div><div>MySql中添加用户,新建数据库,用户授权,删除用户,修改密码<br /><strong>1.新建用户。</strong> <br />//登录MYSQL <br />@&gt;mysql -u root -p <br />@&gt;密码 <br />//创建用户 <br />mysql&gt; mysql&gt; insert into mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_sub <br />ject) values("localhost","pppadmin",password("passwd"),'','',''); <br />这样就创建了一个名为：phplamp 密码为：1234 的用户。 <br />然后登录一下。 <br />mysql&gt;exit; <br />@&gt;mysql -u phplamp -p <br />@&gt;输入密码 <br />mysql&gt;登录成功 <br /><strong>2.为用户授权。</strong> <br />//登录MYSQL（有ROOT权限）。我里我以ROOT身份登录. <br />@&gt;mysql -u root -p <br />@&gt;密码 <br />//首先为用户创建一个数据库(phplampDB) <br />mysql&gt;create database phplampDB; <br />//授权phplamp用户拥有phplamp数据库的所有权限。 <br />&gt;grant all privileges on phplampDB.* to phplamp@localhost identified by '1234'; <br />//刷新系统权限表 <br />mysql&gt;flush privileges; <br />mysql&gt;其它操作 <br />/* <br />如果想指定部分权限给一用户，可以这样来写: <br />mysql&gt;grant select,update on phplampDB.* to phplamp@localhost identified by '1234'; <br />//刷新系统权限表。 <br />mysql&gt;flush privileges; <br />*/ <br /><strong>3.删除用户。</strong> <br />@&gt;mysql -u root -p <br />@&gt;密码 <br />mysql&gt;Delete FROM user Where User="phplamp" and Host="localhost"; <br />mysql&gt;flush privileges; <br />//删除用户的数据库 <br />mysql&gt;drop database phplampDB; <br /><strong>4.修改指定用户密码。</strong> <br />@&gt;mysql -u root -p <br />@&gt;密码 <br />mysql&gt;update mysql.user set password=password('新密码') where User="phplamp" and Host="localhost"; <br />mysql&gt;flush privileges; <br /><strong>5.列出所有数据库 <br /></strong>mysql&gt;show database; <br /><strong>6.切换数据库</strong> <br />mysql&gt;use '数据库名'; <br /><strong>7.列出所有表</strong> <br />mysql&gt;show tables; <br /><strong>8.显示数据表结构</strong> <br />mysql&gt;describe 表名; <br /><strong>9.删除数据库和数据表 <br /></strong>mysql&gt;drop database 数据库名; <br />mysql&gt;drop table 数据表名; 		    </div><img src ="http://www.blogjava.net/Alpha/aggbug/367352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2011-12-27 17:30 <a href="http://www.blogjava.net/Alpha/archive/2011/12/27/367352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA实体标识的自动生成</title><link>http://www.blogjava.net/Alpha/archive/2011/05/03/349454.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Tue, 03 May 2011 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2011/05/03/349454.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/349454.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2011/05/03/349454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/349454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/349454.html</trackback:ping><description><![CDATA[<p>数据的唯一性是所有应用程序非常基本的要求，由开发者或者用户来维护这种唯一性存在着较大的风险，因此，由系统自动产生唯一标识是一种常见的做法。OpenJPA 中支持四种不同的实体标识自动生成策略：</p>
<ul>
    <li>容器自动生成的实体标识；
    <li>使用数据库的自动增长字段生成实体标识；
    <li>根据数据库序列号（Sequence）技术生成实体标识；
    <li>使用数据库表的字段生成实体标识； </li>
</ul>
<p>这四种方式各有优缺点，开发者可以根据实际情况进行选择。</p>
<p><a name="N10073"><span class="atitle">可选择的注释</span></a></p>
<p>要让容器和数据库结合管理实体标识的自动生成，根据实际情况的不同，开发者可以选择 <code>javax.persistence.*</code>包下面的 <code>GeneratedValue</code>、<code>SequenceGenerator</code>、<code>TableGenerator</code>三个注释来描述实体的标识字段。</p>
<p><a name="N1008B"><span class="smalltitle">@javax.persistence.GeneratedValue</span></a></p>
<p>每一个需要自动生成实体标识的实体都需要为它的实体标识字段提供 <code>GeneratedValue</code>注释和相应的参数，OpenJPA 框架会根据注释和参数来处理实体标识的自动生成。</p>
<p>使用 <code>GeneratedValue</code>注释自动生成的实体标识可以是数值类型字段如 <code>byte</code>、<code>short</code>、<code>int</code>、<code>long</code>等，或者它们对应的包装器类型 <code>Byte</code>、<code>Short</code>、<code>Integer</code>、<code>Long</code>等，也可以是字符串类型。</p>
<p><code>GeneratedValue</code>注释可以支持两个属性 <code>strategy</code>和 <code>generator</code>。</p>
<ul>
    <li><strong><code>strategy</code> </strong>
    <p><code>strategy</code>是 <code>GenerationType</code>类型的枚举值，它的内容将指定 OpenJPA 容器自动生成实体标识的方式。<code>strategy</code>属性可以是下列枚举值：</p>
    <ul>
        <li><strong><code>GeneratorType.AUTO</code> </strong>
        <p>表示实体标识由 OpenJPA 容器自动生成，这也是 Strategy 属性的默认值。</p>
        <li><strong><code>GenerationType.IDENTITY</code> </strong>
        <p>OpenJPA 容器将使用数据库的自增长字段为新增加的实体对象赋唯一值，作为实体的标识。这种情况下需要数据库提供对自增长字段的支持，常用的数据库中，HSQL、SQL Server、MySQL、DB2、Derby 等数据库都能够提供这种支持。</p>
        <li><strong><code>GenerationType.SEQUENCE</code> </strong>
        <p>表示使用数据库的序列号为新增加的实体对象赋唯一值，作为实体的标识。这种情况下需要数据库提供对序列号的支持，常用的数据库中，Oracle、PostgreSQL 等数据库都能够提供这种支持。</p>
        <li><strong><code>GenerationType.TABLE</code> </strong>
        <p>表示使用数据库中指定表的某个字段记录实体对象的标识，通过该字段的增长为新增加的实体对象赋唯一值，作为实体的标识。</p>
        </li>
    </ul>
    <li><strong><code>String generator</code> </strong>
    <p><code>generator</code>属性中定义实体标识生成器的名称。如果实体的标识自动生成策略不是 <code>GenerationType.AUTO</code>或者 <code>GenerationType.IDENTITY</code>，就需要提供相应的 <code>SequenceGenerator</code>或者 <code>TableGenerator</code>注释，然后将 <code>generator</code>属性值设置为注释的 <code>name</code>属性值。</p>
    </li>
</ul>
<p><a name="N10149"><span class="smalltitle">@javax.persistence.SequenceGenerator</span></a></p>
<p>如果实体标识的自动生策略是 <code>GenerationType.SEQUENCE</code>，开发者需要为实体标识字段提供 <code>SequenceGenerator</code>注释，它的参数描述了使用序列号生成实体标识的具体细节。该注释支持以下四个属性：</p>
<br />
<a name="table1"><strong>表 1. SequenceGenerator 注释属性说明</strong></a><br />
<table class="ibm-data-table" border="0" cellspacing="0" summary="" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <th width="20%">属性</th>
            <th width="80%">说明</th>
        </tr>
        <tr>
            <td><code>name</code> </td>
            <td>该属性是必须设置的属性，它表示了 <code>SequenceGenerator</code>注释在 OpenJPA 容器中的唯一名称，将会被 <code>GeneratedValue</code>注释的 <code>generator</code>属性使用。将实体标识的自动生成委托给数据库的序列号特性时，实体标识字段的 <code>GeneratedValue</code>注释的 <code>generator</code>属性的值必须和某个 <code>SequenceGenerator</code>注释的 <code>name</code>属性值保持一致。</td>
        </tr>
        <tr>
            <td><code>sequenceName</code> </td>
            <td>实体标识所使用的数据库序列号的名称。该属性是可选的，如果我们没有为该属性设置值，OpenJPA 框架将自动创建名为 <code>OPENJPA_SEQUENCE</code>的序列号。如果一个 OpenJPA 容器中管理的多个实体都选择使用序列号机制生成实体标识，而且实体类中都没有指定标识字段的 <code>sequenceName</code>属性，那么这些实体将会共享系统提供的默认名为 <code>OPENJPA_SEQUENCE</code>的序列号。这可能引起实体类编号的不连续。我们可以用下面的这个简单例子说明这种情况：假设 OpenJPA 容器中存在两个实体类 Dog 和 Fish，它们的实体标识字段都是数值型，并且都选择使用序列号生成实体标识，但是实体类中并没有提供 <code>sequenceName</code>属性值。当我们首先持久化一个 Dog 对象时，它的实体标识将会是 1，紧接着我们持久化一个 Fish 对象，它的实体标识就是 2，依次类推。</td>
        </tr>
        <tr>
            <td><code>initialValue</code> </td>
            <td>该属性设置所使用序列号的起始值。</td>
        </tr>
        <tr>
            <td><code>allocationSize</code> </td>
            <td>一些数据库的序列化机制允许预先分配序列号，比如 Oracle，这种预先分配机制可以一次性生成多个序列号，然后放在 cache 中，数据库用户获取的序列号是从序列号 cache 中获取的，这样就避免了在每一次数据库用户获取序列号的时候都要重新生成序列号。<code>allocationSize</code>属性设置的就是一次预先分配序列号的数目，默认情况下 <code>allocationSize</code>属性的值是 50。</td>
        </tr>
    </tbody>
</table>
<p><a name="N101DE"><span class="smalltitle">@javax.persistence.TableGenerator</span></a></p>
<p>如果实体标识的自动生策略是 GenerationType.TABLE，开发者需要为实体标识字段提供 TableGenerator 注释，它的参数描述了使用数据库表生成实体标识的具体细节。该注释支持下列属性：</p>
<br />
<a name="table2"><strong>表 2. TableGenerator 注释属性说明</strong></a><br />
<table class="ibm-data-table" border="0" cellspacing="0" summary="" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <th width="20%">属性</th>
            <th width="80%">说明</th>
        </tr>
        <tr>
            <td><code>name</code> </td>
            <td>该属性是必须设置的属性，它表示了 <code>TableGenerator</code>注释在 OpenJPA 容器中的唯一名称，将会被 <code>GeneratedValue</code>注释的 <code>generator</code>属性所使用。将实体标识的自动生成委托给数据库表时，实体标识字段的 <code>GeneratedValue</code>注释的 <code>generator</code>属性的值必须和某个 <code>TableGenerator</code>注释的 <code>name</code>属性值保持一致。</td>
        </tr>
        <tr>
            <td><code>table</code> </td>
            <td>该属性设置的是生成序列号的表的名称。该属性并不是必须设置的属性，如果开发者没有为该属性设置值，OpenJPA 容器将会使用默认的表名 <code>OPENJPA_SEQUENCES_TABLE</code>。</td>
        </tr>
        <tr>
            <td><code>schema</code> </td>
            <td>该属性设置的是生成序列号的表的 schema。该属性并不是必须设置的属性，如果开发者没有为该属性设置值，OpenJPA 容器将会默认使用当前数据库用户对应的 schema。</td>
        </tr>
        <tr>
            <td><code>catalog</code> </td>
            <td>该属性设置的是生成序列号的表的 catalog。该属性并不是必须设置的属性，如果开发者没有为该属性设置值，OpenJPA 容器将会使用默认当前数据库用户对应的 catalog。</td>
        </tr>
        <tr>
            <td><code>pkColumnName</code> </td>
            <td>该属性设置的是生成序列号的表中的主键字段的名称，该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性，如果开发者没有为该属性设置值，OpenJPA 容器将会使用默认值 <code>ID</code>。</td>
        </tr>
        <tr>
            <td><code>valueColumnName</code> </td>
            <td>该属性设置的是生成序列号的表中记录实体对应标识最大值的字段的名称。该属性并不是必须设置的属性，如果开发者没有为该 属性设置值，OpenJPA 容器将会使用默认值 <code>SEQUENCE_VALUE</code>。</td>
        </tr>
        <tr>
            <td><code>pkColumnValue</code> </td>
            <td>该属性设置的是生成序列号的表中的主键字段的特征字符串值 ( 比如 customID )，该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性，如果开发者没有为该属性设置值，OpenJPA 容器将会使用默认值 <code>DEFAULT</code>。可以为多个实体设置相同的 <code>pkColumnValue</code>属性值，这些实体标识的生成将通过同一列的值的递增来实现。</td>
        </tr>
        <tr>
            <td><code>initialValue</code> </td>
            <td>该属性设置的是生成序列号的表实体标识的初始值。该属性并不是必须设置的属性，如果开发者没有为该属性设置值，OpenJPA 容器将会使用默认值 0 。</td>
        </tr>
        <tr>
            <td><code>allocationSize</code> </td>
            <td>为了降低标识生成时频繁操作数据库造成 的性能上的影响，实体标识生成的时候会一次性的获取多个实体标识，该属性设置的就是一次性获取实体标识的数目。该属性并不是必须设置的属性，如果开发者没有为该属性设置值，OpenJPA 容器将会使用默认值 50 。</td>
        </tr>
    </tbody>
</table>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top"><a class="ibm-anchor-up-link" href="#ibm-pcon">回页首</a></p>
<p><a name="N102A6"><span class="atitle">实体标识自动生成</span></a></p>
<p>在上面的小节中，我们了解了和实体标识自动生成相关的注释，接下来我们将结合一个简单的例子讲述如何分别使用这些实体标识自动生成策略实现实体标识的自动生成。</p>
<p>我们首先假设有一个 <code>Animal</code>实体需要被持久化，它包括 <code>ID</code>和 <code>NAME</code>属性，其中 <code>ID</code>是它的主键字段。<code>Animal</code>实体的标识需要自动生成，我们将分析在这四种不用的情况下，如何使用 OpenJPA 提供的注释，结合具体数据库支持的特性，如自增长字段、序列号等来实现实体标识的自动生成。</p>
<p><a name="N102C5"><span class="smalltitle">容器自动生成</span></a></p>
<p>OpenJPA 容器默认的实体标识自动生成策略是由容器管理实体标识的自动生成，容器管理的实体标识可以支持数值型和字符型两种。当容器管理的实体标识是数字型时，OpenJPA 容器自动创建一个数据库表 <code>OPENJPA_SEQUENCE_TABLE</code>，用其中的 <code>SEQUENCE_VALUE</code>字段来记录实体的实体标识的增长。</p>
<p>当容器管理的实体标识是字符串类型时，OpenJPA 支持使用 uuid-string 和 uuid-hex 两种方式生成相应的实体标识。如果我们选择使用 uuid-string 方式生成实体标识时，OpenJPA 框架会自动为实体生成一个 128 位的 UUID，并且将这个 UUID 转化为使用 16 位字符表示的字符串。如果我们选择使用 uuid-hex 方式生成实体标识时，OpenJPA 框架会自动为实体生成一个 128 位的 UUID，并且将这个 UUID 转化为使用 32 位字符表示的 16 进制的字符串。</p>
<p><strong>数值标识</strong> </p>
<p>容器管理的实体标识可以是数值型的，OpenJPA 框架管理的实体标识借助于数据库的表来实现，在运行时 OpenJPA 框架会自动在数据库中创建表 <code>OPENJPA_SEQUENCE_TABLE</code>。它有两个字段：<code>ID</code>和 <code>SEQUENCE_VALUE</code>，这两个字段都是数值类型，其中 <code>ID</code>是表的主键字段，它的内容是查询当前实体标识时所使用的关键词，默认值是 0。而 <code>SEQUENCE_VALUE</code>记录了当前 OpenJPA 框架中当前实体标识的历史数据，内容是已经被获取实体标识的最大数值加 1。</p>
<p>我们要使用注释描述 <code>Animal</code>实体的标识由容器自动生成，只需要为它的标识字段提供 <code>GeneratedValue</code>注释，并且把它的 <code>strategy</code>属性设置为 <code>GenerationType.AUTO</code>, <code>Animal</code>实体类的代码片断如下：</p>
<br />
<a name="listing1"><strong>清单 1. 标识由容器自动生成的 Animal 实体类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            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
            <strong>9. 		 @GeneratedValue(strategy=GenerationType.AUTO)</strong>
            10. 		 private long id;
            11. 		 private String name;
            12.
            13. 	  &#8230;
            14.
            15. 	 }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>保存 <code>Animal</code>实体的第一个实例时，OpenJPA 框架自动调用 SQL 语句 <code>SELECT SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID=0</code>，从默认保存实体标识的 <code>OPENJPA_SEQUENCE_TABLE</code>表中获取实体的标识，如果不存在 <code>ID</code>为 0 的记录，OpenJPA 框架自动将实体的标识设置为 1。</p>
<p>容器管理实体标识的情况下，为了获得实体标识，应用程序将不得不频繁地和数据库交互，这会影响应用程序的运行效率。OpenJPA 中使用实体标识缓存机制解决这个问题。默认情况下，当应用程序第一次获取实体标识时，OpenJPA 框架从数据库中一次性获取 50 个连续的实体标识缓存起来，当下一次应用程序需要获取实体标识时，OpenJPA 将首先检测缓存中是否存在实体标识，如果存在，OpenJPA 将直接使用缓存中的实体标识，如果不存在，OpenJPA 框架将会从数据库中再次获取 50 个连续的实体标识缓存起来，如此类推。这样的处理方式可以大大减少由于获取实体标识而产生的数据库交互，提升应用程序的运行效率。</p>
<p>当实体标识成功获取之后，OpenJPA 框架会把当前实体标识的最大值 +1 后持久化到数据库中。由于实体标识缓存的原因，当我们第一次获取实体标识后，OpenJPA 会将 <code>OPENJPA_SEQUENCE_TABLE</code>表的 <code>SEQUENCE_VALUE</code>的值设置为 51，当 OpenJPA 多次从数据库中获取实体标识后，<code>SEQUENCE_VALUE</code>的值会以 50 为单位递增，变为 101、151、201 &#8230;。</p>
<p>OpenJPA 缓存的实体标识不是永久存在的，只能在同一个 <code>EntityManagerFactory</code>管理范围内起作用，也就是说，当获取实体标识的 <code>EntityManagerFactory</code>对象被关闭后，这些被获取的实体标识中没有用掉的那一部分标识就丢失了，这会造成实体标识的不连续。由同一个 <code>EntityManagerFactory</code>对象创建的 <code>EntityManager</code>上下文之间则能够共享 OpenJPA 框架获取的实体标识，这意味着，我们可以使用同一个 <code>EntityManagerFactory</code>对象创建多个 <code>EntityManager</code>对象，用它来持久化实体，然后关闭它，在持久化过程中所需要的实体表示将会使用同一个实体标识的缓存区，因此不会引起实体标识的丢失。</p>
<p>容器管理的实体标识还有一个非常重要的特性：所有被容器管理的实体标识都是共享的。不管 OpenJPA 容器中存在多少个不同的被容器管理的实体标识，它们都会从同一个实体标识缓存中获取实体标识。我们可以用下面的例子说明这种情况：假设 OpenJPA 容器中存在两个实体类 <code>Dog</code>和 <code>Fish</code>，它们的实体标识字段都是数值型，并且都由 OpenJPA 管理。当我们首先持久化一个 <code>Dog</code>对象时，它的实体标识将会是 1，紧接着我们持久化一个 <code>Fish</code>对象，它的实体标识就是 2，依次类推。</p>
<p><strong>uuid-string</strong> </p>
<p>要使用 uuid-string 机制自动生成实体标识，我们需要将实体主键字段的 <code>GeneratedValue</code>注释的 <code>strategy</code>属性设置为 <code>GenarationType.AUTO</code>，然后将 <code>GeneratedValue</code>注释的 <code>generator</code>属性设置为 <code>uuid-string</code>。以 Animal 实体类为例，我们只需要将 Animal 实体修改为如下内容：</p>
<br />
<a name="listing2"><strong>清单 2. 使用 uuid-string 机制自动生成实体标识</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            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. 		 <strong>@GeneratedValue(strategy=GenerationType.AUTO, generator = "uuid-string")</strong>
            10. 		 <strong>private String id;</strong>
            11. 		 private String name;
            12.
            13. 	  &#8230;
            14.
            15. 	 }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><strong>uuid-hex</strong> </p>
<p>要使用 uuid-hex 机制自动生成实体标识，我们必须将实体主键字段的 <code>GeneratedValue</code>注释的 <code>strategy</code>属性设置为 <code>GenarationType.AUTO</code>，然后将 <code>GeneratedValue</code>注释的 <code>generator</code>属性设置为 <code>uuid-hex</code>。以 Animal 实体类为例，我们只需要将 Animal 实体修改为如下内容：</p>
<br />
<a name="listing3"><strong>清单 3. 使用 uuid-hex 机制自动生成实体标识</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            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. 		 <strong>@GeneratedValue(strategy=GenerationType.AUTO, generator = "uuid-hex")</strong>
            10. 		 <strong>private String id;</strong>
            11. 		 private String name;
            12.
            13. 	  &#8230;
            14.
            15. 	 }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N103CB"><span class="smalltitle">自增长字段</span></a></p>
<p>自增长字段是 HSQL、SQL Server、MySQL、DB2、Derby 等数据库提供的一种特性，用于为数据库的记录提供自动增长的编号，应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性，OpenJPA 框架中的实体标识能够满足应用程序设计者的要求，使用数据库的自增长字段为实体自动生成标识。</p>
<p>要将实体标识的自动生成委托给数据库的自增长字段特性，需要数据库和实体定义的双方配合才能够达到：首先，必须将实体标识字段对应的数据库列修改为自动增长列，另外还需要将实体类中实体标识字段的 <code>GeneratedValue</code>注释的 <code>stragety</code>属性的值设置为 <code>GenerationType.IDENTITY</code>。</p>
<p>我们以 Animal 实体在 HSQL 数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤：</p>
<p>首先，我们使用下面的 SQL 语句创建 Animal 表，把它的 <code>ID</code>字段设置为自动增长类型：</p>
<br />
<a name="listing4"><strong>清单 4. 将 ID 字段设置为自动增长类型的 SQL 语句</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            CREATE TEXT TABLE ANIMAL (
            ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,
            NAME VARCHAR(255) NOT NULL
            )
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在数据库部分将表的主键字段设置为自动增长字段后，在实体 <code>Animal</code>的定义中，我们需要将 <code>id</code>字段 <code>GeneratedValue</code>注释的 <code>stragety</code>属性的值设置为 <code>GenerationType.IDENTITY</code>。Animal 实体类修改后的代码片段如下。</p>
<br />
<a name="listing5"><strong>清单 5. 标识由自增长字段生成的 Animal 实体类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            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
            <strong>9. 		 @GeneratedValue(strategy=GenerationType.IDENTITY)</strong>
            10. 		 private long id;
            11. 		 private String name;
            12.
            13. 	  &#8230;
            14.
            15. 	 }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N10418"><span class="smalltitle">序列号（Sequence）</span></a></p>
<p>序列号是 Oracle、PostgreSQL 等数据库提供的一种特性，用于为数据库的记录提供自动增长的编号，使用 Oracle、PostgreSQL 等数据库应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性，OpenJPA 框架中的实体标识能够满足应用程序设计者的要求，使用数据库的序列号为实体自动生成标识。</p>
<p>要将实体标识的自动生成委托给数据库的序列号特性，需要数据库和实体定义的双方配合才能够达到：首先，必须在数据库中创建合适的序列号，另外还需要为实体标识字段提供 <code>SequenceGenerator</code>注释，设置它的参数，为实体类提供关于序列号的信息，同时将实体类中实体标识字段的 <code>GeneratedValue</code>注释的 <code>stragety</code>属性的值设置为 <code>GenerationType.SEQUENCE</code>，将 <code>generator</code>属性的值设置为 <code>SequenceGenerator</code>注释的 <code>name</code>属性的值。</p>
<p>我们以 Animal 实体在 Oracle 数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤：</p>
<p>首先，在 Oracle 数据库中运行下面的 SQL 语句创建名为 <code>HelloWorldSequence</code>的序列号，序列号支持 cache，大小为 50：</p>
<br />
<a name="listing6"><strong>清单 6. 创建序列号的 SQL 语句</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            CREATE SEQUENCE HELLOWORLDSEQUENCE
            START WITH 0
            INCREMENT BY 1
            MINVALUE 1
            CACHE 50
            NOCYCLE
            NOORDER
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>然后，在 Oracle 数据库中，我们使用下面的 SQL 语句创建 <code>ANIMAL</code>表：</p>
<br />
<a name="listing7"><strong>清单 7. 创建 ANIMAL 表</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            CREATE TABLE EOS52.ANIMAL
            (
            ID CHAR(10),
            NAME VARCHAR2(100) NOT NULL,
            CONSTRAINT PK_ANIMAL PRIMARY KEY (ID )
            )
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在数据库部分创建合适的序列号和相应的数据库表后，在实体 <code>Animal</code>的定义中，我们需要将 <code>id</code>字段 <code>GeneratedValue</code>注释的 <code>stragety</code>属性的值设置为 <code>GenerationType.SEQUENCE</code>，设置它的 <code>generator</code>属性的值为 <code>SeqGenerator</code>。我们还需要为 <code>id</code>字段提供另外一个相关的注释 <code>SequenceGenerator</code>，设置它的 <code>name</code>属性为 <code>SeqGenerator</code>，设置它 <code>sequenceName</code>属性为 <code>HelloWorldSequence</code>。Animal 实体类修改后的代码片段如下。</p>
<br />
<a name="listing8"><strong>清单 8. 标识由序列号生成的 Animal 实体类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            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.      <strong>@GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator = "SeqGenerator")</strong>
            10.     <strong>@SequenceGenerator(name = "SeqGenerator",
            sequenceName = " HelloWorldSequence")</strong>
            11.     private long id;
            12.     private String name;
            13.
            14.     &#8230;
            15.
            16. }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N104A8"><span class="smalltitle">数据库表</span></a></p>
<p>除了使用容器生成的实体标识，或者借助于数据库的自增长字段或者序列号等方式生成实体标识之外，我们还可以选择借助数据库表来自动生成实体标识。原理是我们提供一个独立的数据库表，该表的主键列 ( 假设列名 <code>ID</code>) 记录实体编号的特征字符串 ( 假设存在一条记录的 <code>ID</code>为 <code>customID</code>)，另外一列 ( 假设列名为 <code>SEQUENCE_VALUE</code>) 记录该特征字符串对应实体标识的最大值。编写实体代码时，我们指定实体标识由数据库表中指定的特征字符串 ( 如 <code>customID</code>) 对应的列 <code>SEQUENCE_VALUE</code>处理，当有新的实体被持久化时，容器将获取行 <code>customID</code>、列 <code>SEQUENCE_VALUE</code>对应的数值 +1 后作为新实体的标识，同时将该列的值也自动 +1。</p>
<p>要将实体标识的自动生成委托给数据库表，需要数据库和实体定义的双方配合才能够达到：首先，必须在数据库中创建合适的保存实体标识的表，另外还需要为实体标识字段提供 <code>TableGenerator</code>注释，设置它的参数，为实体类提供关于数据库表、字段的信息，同时将实体类中实体标识字段的 <code>GeneratedValue</code>注释的 <code>stragety</code>属性的值设置为 <code>GenerationType.Table</code>，将 <code>generator</code>属性的值设置为 <code>SequenceGenerator</code>注释的 <code>name</code>属性的值。</p>
<p>我们以 Animal 实体类来说明使用数据库表自动生成实体标识所需要采取的步骤：我们假设存在这样的场景，Animal 实体的标识由应用程序中自定义的数据库表 <code>MY_KEYS</code>自动生成，<code>MY_KEYS</code>表中有两列，一列是 <code>KEYID</code>，它保存实体标识的特征值，一列是 <code>KEYVALUE</code>，它保存实体当前的最大编号，除此之外，我们还决定使用 <code>ANIMALID</code>作为 Animal 实体标识的特征字符串。</p>
<p>首先，在数据库中使用下面的 SQL 语句创建名为 <code>MY_KEYS</code>的数据库表。在 OpenJPA 容器中，如果我们没有创建 <code>MY_KEYS</code>表，OpenJPA 容器将帮我们自动生成对应的表结构。</p>
<br />
<a name="listing9"><strong>清单 9. 创建数据库表 MY_KEYS</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            CREATE TABLE MY_KEYS (
            KEYID VARCHAR(255) NOT NULL,
            KEYVALUE BIGINT,
            PRIMARY KEY (KEYID)
            )
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在数据库部分创建合适的数据库表后，在实体 Animal 的定义中，我们需要将 <code>id</code>字段 <code>GeneratedValue</code>注释的 <code>stragety</code>属性的值设置为 <code>GenerationType.TABLE</code>，设置它的 <code>generator</code>属性的值为 <code>TableGenerator</code>。我们还需要为 <code>id</code>字段提供另外一个注释 <code>TableGenerator</code>，设置它的 <code>name</code>属性为 <code>TableGenerator</code>，设置它的 <code>table</code>属性为 <code>MYKEYS</code>、<code>pkColumnName</code>属性为 <code>KEYID</code>、<code>valueColumnName</code>属性为 <code>KEYVALUE</code>、 <code>ANIMALID</code>属性为 <code>ANIMALID</code>。Animal 实体类修改后的代码片段如下。</p>
<br />
<a name="listing10"><strong>清单 10. 标识由数据库表生成的 Animal 实体类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            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.     <strong>@GeneratedValue(strategy = GenerationType.TABLE,
            generator = " TableGenerator ")</strong>
            10.    <strong>@TableGenerator(name = " TableGenerator", table = "MY_KEYS",</strong>
            <strong>pkColumnName = "KEYID", valueColumnName = "KEYVALUE",
            pkColumnValue = "ANIMALID")</strong>
            11.    <strong>private long id;</strong>
            12.    private String name;
            13.
            14.    &#8230;
            15.
            16. }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top"><a class="ibm-anchor-up-link" href="#ibm-pcon">回页首</a></p>
<p><a name="N1057A"><span class="atitle">调用代码</span></a></p>
<p>上面的章节中我们学习了分别使用四种方式来自动生成实体的标识，由于这四种情况下，Animal 实体的标识都由 OpenJPA 和数据库协作后自动生成，对于开发者而言，这个过程是透明的，因此我们可以使用相同的方式来创建这些实体：创建新的 Animal 实例的时候不再需要为主键字段提供属性值，只需要设置 Animal 实例的非标识字段 <code>name</code>的值即可。下面的代码演示了 Animal 实例的持久化代码，请注意代码中并没有调用 Animal 实例的 setId 方法。</p>
<br />
<a name="listing11"><strong>清单 11. Animal 实例的持久化代码</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">            1. 	 EntityManagerFactory factory = Persistence.
            2. 	         createEntityManagerFactory(
            3. 	         "jpa-unit", System.getProperties());
            4. 		 EntityManager em = factory.createEntityManager();
            5. 		 em.getTransaction().begin();
            6.
            7. 		 <strong>Animal animal = new Animal();</strong>
            8. 		 <strong>// 此处不需要调用 animal 的 setId 方法</strong>
            9. 		 <strong>animal.setName("ba guai!");</strong>
            10. 	 <strong>em.persist(animal);</strong>
            11.
            12. 	 em.getTransaction().commit();
            13. 	 em.close();
            14. 	 em2.close();
            15. 	 factory.close();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top"><a class="ibm-anchor-up-link" href="#ibm-pcon">回页首</a></p>
<p><a name="N1059B"><span class="atitle">总结</span></a></p>
<p>本文介绍了开发者使用 OpenJPA 实现实体标识自动生成时可选择使用的注释，并且结合简单的例子，分别介绍了 OpenJPA 中实现容器管理的实体标识自动生成、结合数据库自增长字段、序列号、数据库表等特性实现实体标识自动生成时注释的具体用法和操作步骤。</p>
<!-- CMA ID: 263234 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-document-html-6.0.xsl --><br />
http://www.ibm.com/developerworks/cn/java/j-lo-openjpa5/<br />
<br />
<br /><img src ="http://www.blogjava.net/Alpha/aggbug/349454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2011-05-03 23:06 <a href="http://www.blogjava.net/Alpha/archive/2011/05/03/349454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE11g 安装于基本配置说明</title><link>http://www.blogjava.net/Alpha/archive/2011/05/03/349450.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Tue, 03 May 2011 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2011/05/03/349450.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/349450.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2011/05/03/349450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/349450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/349450.html</trackback:ping><description><![CDATA[<p><strong>1，</strong><strong>oracle中实例的创建</strong>：oracle中实例创建即SID的创建，通常在安装完oracle后，启动 配置和移植工具中的（数据库配置向导）</p>
<p>&nbsp;database configuration assistant ，按照向导去创建SID，当日利用database configuration assistant 还可以 创建数据库、配置数据选件、删除数据库、管理模板、配置自动存储管理。</p>
<p><strong>2，</strong><strong>oracle中服务的创建：</strong>在oracle实例创建完后，就可以创建服务名了。注意：连接一个实例可以有多个服务名。启动 配置和移植工具中的net manager（网络配置），按照向导开始配置 网络服务名==》TCP/IP协议==》主机名（服务端的IP地址）==》oracle8i或更高版本 服务名（<strong>即SID实例名称</strong>）==》测试 ==》完成。</p>
<p><strong>3，</strong><strong>框架中db.properties的配置：</strong></p>
<p>datasource.driverClassName=oracle.jdbc.OracleDriver<br />
datasource.url=jdbc:oracle:thin:@//127.0.0.1:1521/<strong>ORCL&nbsp; （注意，这个orcl就是指第二项 oracle中服务的创建）</strong><br />
datasource.username=card<br />
datasource.password=1111</p>
<p>c3p0.minPoolSize=1<br />
c3p0.maxPoolSize=30<br />
&nbsp;<br />
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect<br />
hibernate.jdbc.batch_size=25<br />
hibernate.jdbc.fetch_size=50<br />
hibernate.show_sql=true</p><img src ="http://www.blogjava.net/Alpha/aggbug/349450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2011-05-03 22:19 <a href="http://www.blogjava.net/Alpha/archive/2011/05/03/349450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle关键字</title><link>http://www.blogjava.net/Alpha/archive/2011/05/03/349451.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Tue, 03 May 2011 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2011/05/03/349451.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/349451.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2011/05/03/349451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/349451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/349451.html</trackback:ping><description><![CDATA[access&nbsp;&nbsp; add&nbsp;&nbsp; all&nbsp;&nbsp; alter&nbsp;&nbsp; and&nbsp;&nbsp; any&nbsp;&nbsp; as&nbsp;&nbsp; asc&nbsp;&nbsp; audit&nbsp;&nbsp; between&nbsp;&nbsp; by&nbsp;&nbsp; char&nbsp;&nbsp; check&nbsp;&nbsp; cluster&nbsp;&nbsp; column&nbsp;&nbsp; comment&nbsp;&nbsp; <br />
compress&nbsp;&nbsp; connect&nbsp;&nbsp; create&nbsp;&nbsp; current&nbsp;&nbsp; date&nbsp;&nbsp; decimal&nbsp;&nbsp; default&nbsp;&nbsp; delete&nbsp;&nbsp; desc&nbsp;&nbsp; distinct&nbsp;&nbsp; drop&nbsp;&nbsp; else&nbsp;&nbsp; exclusive&nbsp;&nbsp; <br />
exists&nbsp;&nbsp; file&nbsp;&nbsp; float&nbsp;&nbsp; for&nbsp;&nbsp; from&nbsp;&nbsp; grant&nbsp;&nbsp; group&nbsp;&nbsp; having&nbsp;&nbsp; identified&nbsp;&nbsp; immediate&nbsp;&nbsp; in&nbsp;&nbsp; increment&nbsp;&nbsp; index&nbsp;&nbsp; initial&nbsp;&nbsp; <br />
insert&nbsp;&nbsp; integer&nbsp;&nbsp; intersect&nbsp;&nbsp; into&nbsp;&nbsp; is&nbsp;&nbsp; level&nbsp;&nbsp; like&nbsp;&nbsp; lock&nbsp;&nbsp; long&nbsp;&nbsp; maxextents&nbsp;&nbsp; minus&nbsp;&nbsp; mlslabel&nbsp;&nbsp; mode&nbsp;&nbsp; modify&nbsp;&nbsp; <br />
noaudit&nbsp;&nbsp; nocompress&nbsp;&nbsp; not&nbsp;&nbsp; nowait&nbsp;&nbsp; null&nbsp;&nbsp; number&nbsp;&nbsp; of&nbsp;&nbsp; offline&nbsp;&nbsp; on&nbsp;&nbsp; online&nbsp;&nbsp; option&nbsp;&nbsp; or&nbsp;&nbsp; order&nbsp;&nbsp; pctfree&nbsp;&nbsp; prior&nbsp;&nbsp; <br />
privileges&nbsp;&nbsp; public&nbsp;&nbsp; raw&nbsp;&nbsp; rename&nbsp;&nbsp; resource&nbsp;&nbsp; revoke&nbsp;&nbsp; row&nbsp;&nbsp; rowid&nbsp;&nbsp; rownum&nbsp;&nbsp; rows&nbsp;&nbsp; select&nbsp;&nbsp; session&nbsp;&nbsp; set&nbsp;&nbsp; <br />
share&nbsp;&nbsp; size&nbsp;&nbsp; smallint&nbsp;&nbsp; start&nbsp;&nbsp; successful&nbsp;&nbsp; synonym&nbsp;&nbsp; sysdate&nbsp;&nbsp; table&nbsp;&nbsp; then&nbsp;&nbsp; to&nbsp;&nbsp; trigger&nbsp;&nbsp; uid&nbsp;&nbsp; union&nbsp;&nbsp; unique&nbsp;&nbsp; <br />
update&nbsp;&nbsp; user&nbsp;&nbsp; validate&nbsp;&nbsp; values&nbsp;&nbsp; varchar&nbsp;&nbsp; varchar2&nbsp;&nbsp; view&nbsp;&nbsp; whenever&nbsp;&nbsp; where&nbsp;&nbsp; with <br /><img src ="http://www.blogjava.net/Alpha/aggbug/349451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2011-05-03 22:19 <a href="http://www.blogjava.net/Alpha/archive/2011/05/03/349451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux和Mysql常用命令</title><link>http://www.blogjava.net/Alpha/archive/2010/04/16/318526.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Fri, 16 Apr 2010 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2010/04/16/318526.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/318526.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2010/04/16/318526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/318526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/318526.html</trackback:ping><description><![CDATA[本人经常用到的命令，在这里做下记录。<br />
&nbsp;
<p><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">.tar.bz2</span></strong></p>
<p><strong><span style="font-size: 9pt; font-family: 宋体">解压</span></strong><span style="font-size: 9pt; font-family: 宋体">：tar jxvf FileName.tar.bz2&nbsp;<strong>压缩</strong>：tar jcvf FileName.tar.bz2 DirName</span></p>
<p><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">.gz</span></strong><strong><span style="font-size: 9pt; color: blue; font-family: 宋体"><br />
</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">解压1</span></strong><span style="font-size: 9pt; font-family: 宋体">：gunzip FileName.gz&nbsp;&nbsp; <strong>解压2</strong>：gzip -d FileName.gz&nbsp;<strong>压缩</strong>：gzip FileName<br />
<strong><span style="color: blue; font-family: 宋体">.tar.gz </strong></span><strong><span style="color: blue; font-family: 宋体">和 .tgz</span></strong><strong><span style="color: blue"><br />
</span></strong><strong>解压</strong>：tar zxvf FileName.tar.gz&nbsp;<strong>压缩</strong>：tar zcvf FileName.tar.gz DirName</span></p>
<p><strong><span style="font-size: 9pt; color: blue; font-family: 宋体">.rpm</span></strong><span style="font-size: 9pt; font-family: 宋体"><br />
</span><strong><span style="font-size: 9pt; font-family: 宋体">解包：</span></strong><span style="font-size: 9pt; font-family: 宋体">rpm2cpio FileName.rpm | cpio -div<br />
<strong><span style="color: blue; font-family: 宋体">.deb</span></strong><br />
</span><strong><span style="font-size: 9pt; font-family: 宋体">解包：</span></strong><span style="font-size: 9pt; font-family: 宋体">ar p FileName.deb data.tar.gz | tar zxf -<br />
<br />
</span></p>
<p><strong><span style="font-size: 9pt; font-family: 宋体">从远程scp到本地：</span></strong></p>
<p><span style="font-size: 9pt; font-family: 宋体">scp root@192.168.2.100:/opt/test/* /opt/test </span><span style="font-size: 9pt; font-family: 宋体">，输入</span><span style="font-size: 9pt; font-family: 宋体">远程机器密码后完成</span></p>
<p><span style="font-size: 9pt; color: black; font-family: 宋体">scp -P 3588 &nbsp;</span><span style="font-size: 9pt; font-family: 宋体">root@192.168.2.100:/opt/test/* /opt/test&nbsp;</span><span style="font-size: 9pt; font-family: 宋体">走特殊端口号<br />
</span></p>
<p><strong><span style="font-size: 9pt; font-family: 宋体"><br />
从本地scp到远程：</span></strong></p>
<p><span style="font-size: 9pt; font-family: 宋体">scp /opt/test/* &nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#111;&#111;&#116;&#64;&#49;&#57;&#50;&#46;&#49;&#54;&#56;&#46;&#50;&#46;&#49;&#48;&#48;&#58;&#47;&#111;&#112;&#116;">root@192.168.2.100:/opt</a>/test </span><span style="font-size: 9pt; font-family: 宋体">，输入</span><span style="font-size: 9pt; font-family: 宋体">远程机器密码后完成</span></p>
<p><span style="font-size: 9pt; color: black; font-family: 宋体">使用方式&nbsp;:&nbsp;chmod&nbsp;[-cfvR]&nbsp;[--help]&nbsp;[--version]&nbsp;mode&nbsp;file...</span></p>
<p><span style="font-size: 9pt; color: black; font-family: 宋体">使用方式&nbsp;:</span><span style="font-size: 9pt; color: black; font-family: 宋体">chown&nbsp;jessie:users&nbsp;file1.txt&nbsp;</span></p>
<p><span style="font-size: 9pt; color: black; font-family: 宋体">Mysql </span><span style="font-size: 9pt; color: black; font-family: 宋体">初始化：chkconfig &#8211;add mysqld </span></p>
<p><span style="font-size: 9pt; color: black; font-family: 宋体">正在使用的端口：netstat -ant</span></p>
<p><span style="font-size: 9pt; color: black; font-family: 宋体">挂载USB： mount &nbsp;/dev/sdc&nbsp;/mnt/usb</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">Rpm </span><span style="font-size: 9pt; font-family: 宋体">安装： rpm &#8211;ivh&nbsp;filename</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">www</span><span style="font-size: 9pt; font-family: 宋体">服务配置：/etc/httpd/conf/httpd.conf</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">网络测试：curl&nbsp;-I&nbsp;<a href="http://www.job5156.com/">http://www.job5156.com</a></span></p>
<p><span style="font-size: 9pt; font-family: 宋体">改IP地址：ifconfig&nbsp;eth0 192.168.2.29 netmask&nbsp;255.255.255.0</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">改网关：route add default gw 192.168.2.254&nbsp;&nbsp; 查看：route &#8211;n</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">改DNS：nano -w /etc/resolv.conf&nbsp;&nbsp;<br />
<br />
<br />
</span><span style="font-size: 9pt; font-family: 宋体">导出表结构：mysqldump&nbsp;-u&nbsp;root&nbsp;-p&nbsp;-d&nbsp;--add-drop-table&nbsp;dbName tableName &gt; /opt/name.sql </span></p>
<p><span style="font-size: 9pt; font-family: 宋体">导入表结构：mysql dbName &lt; name.sql</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">修复Mysql表：&nbsp;mysqlrepair&nbsp;--auto-repair -F -r </span><span style="font-size: 9pt; font-family: 宋体">dbName &nbsp;tableName</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">给mysql用户加账号权限： grant all on dbName.* to user@'%' identified by 'pwd'; FLUSH PRIVILEGES;</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">加字段：</span><span style="font-size: 9pt; font-family: 宋体">ALTER TABLE table_name ADD field_name field_type;</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">删字段：alter table t2 drop column c;</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">字段重命名：alter table t1 change a b integer;</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">表重命名：alter table t1 rename t2;</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">加索引：alter table tablename add index 索引名 (字段名1[，字段名2 &#8230;]);</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">删索引：alter table tablename drop index emp_name;</span></p><img src ="http://www.blogjava.net/Alpha/aggbug/318526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2010-04-16 15:17 <a href="http://www.blogjava.net/Alpha/archive/2010/04/16/318526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从MySQL得到最大的性能</title><link>http://www.blogjava.net/Alpha/archive/2009/09/22/296050.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Tue, 22 Sep 2009 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2009/09/22/296050.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/296050.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2009/09/22/296050.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/296050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/296050.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 优化是一项复杂的任务，因为它最终需要对整个系统的理解。当用你的系统/应用的小知识做一些局部优化是可能的时候，你越想让你的系统更优化，你必须知道它也越多。&nbsp;&nbsp;<a href='http://www.blogjava.net/Alpha/archive/2009/09/22/296050.html'>阅读全文</a><img src ="http://www.blogjava.net/Alpha/aggbug/296050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2009-09-22 16:55 <a href="http://www.blogjava.net/Alpha/archive/2009/09/22/296050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL 字符集问题</title><link>http://www.blogjava.net/Alpha/archive/2009/04/11/264986.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Sat, 11 Apr 2009 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2009/04/11/264986.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/264986.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2009/04/11/264986.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/264986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/264986.html</trackback:ping><description><![CDATA[<div class="postcontent">前一段时间，一直被mysql的字符集困扰，今天就这方面的知识总结一下.<br />
MySQL的字符集支持(Character Set Support)有两个方面：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 字符集(Character set)和排序方式(Collation)。<br />
对于字符集的支持细化到四个层次: <br />
&nbsp;&nbsp;&nbsp;&nbsp; 服务器(server)，数据库(database)，数据表(table)和连接(connection)。<br />
<br />
<br />
1.MySQL默认字符集
<p>&nbsp; MySQL对于字符集的指定可以细化到一个数据库，一张表，一列，应该用什么字符集。</p>
<p>但是，传统的程序在创建数据库和数据表时并没有使用那么复杂的配置，它们用的是默认的配置，那么，默认的配置从何而来呢？</p>
&nbsp;&nbsp;&nbsp; (1)编译MySQL 时，指定了一个默认的字符集，这个字符集是 latin1；<br />
&nbsp;&nbsp;&nbsp; (2)安装MySQL 时，可以在配置文件 (my.ini) 中指定一个默认的的字符集，如果没指定，这个值继承自编译时指定的；<br />
&nbsp;&nbsp;&nbsp; (3)启动mysqld 时，可以在命令行参数中指定一个默认的的字符集，如果没指定，这个值继承自配置文件中的配置,此时 <strong>character_set_server</strong> 被设定为这个默认的字符集；<br />
&nbsp;&nbsp;&nbsp; (4)当创建一个新的数据库时，除非明确指定，这个数据库的字符集被缺省设定为<strong>character_set_server</strong>；<br />
&nbsp;&nbsp;&nbsp; (5)当选定了一个数据库时，<strong>character_set_database</strong> 被设定为这个数据库默认的字符集；<br />
&nbsp;&nbsp;&nbsp; (6)在这个数据库里创建一张表时，表默认的字符集被设定为 <strong>character_set_database</strong>，也就是这个数据库默认的字符集；<br />
&nbsp;&nbsp;&nbsp; (7)当在表内设置一栏时，除非明确指定，否则此栏缺省的字符集就是表默认的字符集；<br />
<p>简单的总结一下，如果什么地方都不修改，那么所有的数据库的所有表的所有栏位的都用 latin1 存储，不过我们如果安装 MySQL，一般都会选择多语言支持，也就是说，安装程序会自动在配置文件中把 <strong>default_character_set</strong> 设置为 UTF-8，这保证了缺省情况下，所有的数据库的所有表的所有栏位的都用 UTF-8 存储。</p>
<br />
2.查看默认字符集(默认情况下，mysql的字符集是latin1(ISO_8859_1)<br />
通常，查看系统的字符集和排序方式的设定可以通过下面的两条命令：<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SHOW VARIABLES LIKE 'character%';<br />
+--------------------------+---------------------------------+<br />
| Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+--------------------------+---------------------------------+<br />
| character_set_client&nbsp;&nbsp;&nbsp;&nbsp; | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_connection | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_database&nbsp;&nbsp; | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_filesystem | binary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; |<br />
| character_set_results&nbsp;&nbsp;&nbsp; | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_server &nbsp;&nbsp;&nbsp; | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_system&nbsp; &nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_sets_dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | D:"mysql-5.0.37"share"charsets" |<br />
+--------------------------+---------------------------------+<br />
<br />
&nbsp; mysql&gt; SHOW VARIABLES LIKE 'collation_%';<br />
+----------------------+-----------------+<br />
| Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+----------------------+-----------------+<br />
| collation_connection | utf8_general_ci |<br />
| collation_database&nbsp;&nbsp; | utf8_general_ci |<br />
| collation_server&nbsp;&nbsp;&nbsp;&nbsp; | utf8_general_ci |<br />
+----------------------+-----------------+<br />
<br />
3.修改默认字符集<br />
&nbsp; (1) 最简单的修改方法，就是修改mysql的my.ini文件中的字符集键值，<br />
如 &nbsp;&nbsp; default-character-set = utf8<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; character_set_server =&nbsp; utf8<br />
&nbsp;&nbsp; 修改完后，重启mysql的服务，service mysql restart<br />
&nbsp;&nbsp; 使用 mysql&gt; SHOW VARIABLES LIKE 'character%';查看，发现数据库编码均已改成utf8<br />
+--------------------------+---------------------------------+<br />
| Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+--------------------------+---------------------------------+<br />
| character_set_client&nbsp;&nbsp;&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_connection | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_database&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_filesystem | binary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_results&nbsp;&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_server&nbsp;&nbsp;&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_system&nbsp;&nbsp;&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_sets_dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | D:"mysql-5.0.37"share"charsets" |<br />
+--------------------------+---------------------------------+<br />
<br />
&nbsp;&nbsp; (2) 还有一种修改字符集的方法，就是使用mysql的命令<br />
&nbsp;&nbsp; &nbsp; mysql&gt; SET character_set_client = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET character_set_connection = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET character_set_database = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET character_set_results = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET character_set_server = utf8 ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET collation_connection = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET collation_database = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET collation_server = utf8 ;<br />
<br />
<br />
一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询，你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句：
<p>SET NAMES 'utf8';</p>
它相当于下面的三句指令：<br />
SET character_set_client = utf8;<br />
SET character_set_results = utf8;<br />
SET character_set_connection = utf8;<br />
<br />
总结: <br />
<span>因此，使用什么数据库版本，不管是3.x，还是4.0.x还是4.1.x，其实对我们来说不重要，重要的有二： <br />
&nbsp; 1) 正确的设定数据库编码.MySQL4.0以下版本的字符集总是默认ISO8859-1，MySQL4.1在安装的时候会让你选择。如果你准备使用UTF- 8，那么在创建数据库的时候就要指定好UTF-8(创建好以后也可以改，4.1以上版本还可以单独指定表的字符集) <br />
&nbsp; 2) 正确的设定数据库connection编码.设置好数据库的编码后，在连接数据库时候，应该指定connection的编码，比如使用jdbc连接时，指定连接为utf8方式.<br />
<br />
<br />
<span style="font-size: 8pt"><span style="font-size: 10pt"><span style="font-family: Arial">参考 "关中刀客" 的&nbsp; &lt;Mysql编码问题&gt;，原文地址http://lixiang.cn/?q=node/98</span></span></span></span><br />
<span><br />
<br />
<br />
<br />
</span><br />
<br />
<br />
</div><img src ="http://www.blogjava.net/Alpha/aggbug/264986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2009-04-11 10:29 <a href="http://www.blogjava.net/Alpha/archive/2009/04/11/264986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL的mysqldump工具的基本用法</title><link>http://www.blogjava.net/Alpha/archive/2007/08/10/135694.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Fri, 10 Aug 2007 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2007/08/10/135694.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/135694.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2007/08/10/135694.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/135694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/135694.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 导出要用到MySQL的mysqldump工具，基本用法是：&nbsp;&nbsp;<a href='http://www.blogjava.net/Alpha/archive/2007/08/10/135694.html'>阅读全文</a><img src ="http://www.blogjava.net/Alpha/aggbug/135694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2007-08-10 09:21 <a href="http://www.blogjava.net/Alpha/archive/2007/08/10/135694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql alter 语句用法,添加、修改、删除字段等</title><link>http://www.blogjava.net/Alpha/archive/2007/07/23/131912.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Mon, 23 Jul 2007 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2007/07/23/131912.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/131912.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2007/07/23/131912.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/131912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/131912.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: alter table t2 add d timestamp;<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/Alpha/archive/2007/07/23/131912.html'>阅读全文</a><img src ="http://www.blogjava.net/Alpha/aggbug/131912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2007-07-23 17:21 <a href="http://www.blogjava.net/Alpha/archive/2007/07/23/131912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 安装与使用</title><link>http://www.blogjava.net/Alpha/archive/2007/03/30/107464.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Fri, 30 Mar 2007 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2007/03/30/107464.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/107464.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2007/03/30/107464.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/107464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/107464.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MySQL 资料库的确是值得推广的一个产品，它的稳定性已经稳得大家的赞同，只要你曾经学习过 SQL Language（结构化查询语言），相信要摸熟 MySQL 的使用只消一两个小时的时间。如果搭配 PHP （Personal  HomePage Program）和 Apache Web Server，更可很轻松建构一个与资料库结合的动态 Web Site。如果再配合 phpMyAdmin 这个 Web 化的 MySQL 管理工具，建立 MySQL 的资料库和  MySQL 的管理将会更加方便。&nbsp;&nbsp;<a href='http://www.blogjava.net/Alpha/archive/2007/03/30/107464.html'>阅读全文</a><img src ="http://www.blogjava.net/Alpha/aggbug/107464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2007-03-30 13:45 <a href="http://www.blogjava.net/Alpha/archive/2007/03/30/107464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql日期和时间函数大全</title><link>http://www.blogjava.net/Alpha/archive/2006/04/07/39844.html</link><dc:creator>Alpha</dc:creator><author>Alpha</author><pubDate>Fri, 07 Apr 2006 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/Alpha/archive/2006/04/07/39844.html</guid><wfw:comment>http://www.blogjava.net/Alpha/comments/39844.html</wfw:comment><comments>http://www.blogjava.net/Alpha/archive/2006/04/07/39844.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Alpha/comments/commentRss/39844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Alpha/services/trackbacks/39844.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/Alpha/archive/2006/04/07/39844.html'>阅读全文</a><img src ="http://www.blogjava.net/Alpha/aggbug/39844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Alpha/" target="_blank">Alpha</a> 2006-04-07 14:51 <a href="http://www.blogjava.net/Alpha/archive/2006/04/07/39844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>