隨筆:93 文章:11 評(píng)論:22 引用:0
          首頁(yè) 發(fā)新隨筆
          發(fā)新文章 聯(lián)系 聚合管理

          2014年3月3日

          --查詢表空間、表空間大小及表空間對(duì)應(yīng)物理路徑

          select a.tablespace_name,b.file_name,a.block_size,a.block_size,b.bytes/1024

          /1024 "Sum MB" from dba_tablespaces a,dba_data_files b where a.tablespace_name=b.tablespace_name;

          --查詢表空間使用情況

            SELECT UPPER(F.TABLESPACE_NAME) "表空間名",

            D.TOT_GROOTTE_MB "表空間大小(M)",

            D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",

            TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",

            F.TOTAL_BYTES "空閑空間(M)",

            F.MAX_BYTES "最大塊(M)"

            FROM (SELECT TABLESPACE_NAME,

            ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,

            ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES

            FROM SYS.DBA_FREE_SPACE

            GROUP BY TABLESPACE_NAME) F,

            (SELECT DD.TABLESPACE_NAME,

             ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB

            FROM SYS.DBA_DATA_FILES DD

            GROUP BY DD.TABLESPACE_NAME) D

            WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME

            ORDER BY 1;

          --查詢表空間的free space

            select tablespace_name,

            count(*) as extends,

            round(sum(bytes) / 1024 / 1024, 2) as MB,

            sum(blocks) as blocks

            from dba_free_space

          group by tablespace_name;

           

          --查詢表空間的總?cè)萘?/h3>

            select tablespace_name, sum(bytes) / 1024 / 1024 as MB

            from dba_data_files

            group by tablespace_name;

           

           

          --查詢表空間使用率

            select total.tablespace_name,

            round(total.MB, 2) as Total_MB,考試大論壇

            round(total.MB - free.MB, 2) as Used_MB,

            round((1 - free.MB / total.MB) * 100, 2) || '%' as Used_Pct

            from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB

            from dba_free_space

            group by tablespace_name) free,

            (select tablespace_name, sum(bytes) / 1024 / 1024 as MB

            from dba_data_files

            group by tablespace_name) total

            where free.tablespace_name = total.tablespace_name;

           

           

          1.查找當(dāng)前表級(jí)鎖的SQL如下:

          select sess.sid,

              sess.serial#,

              lo.oracle_username,

              lo.os_user_name,

              ao.object_name,

              lo.locked_mode

              from v$locked_object lo,

              dba_objects ao,

              v$session sess

          where ao.object_id = lo.object_id and lo.session_id = sess.sid;

           

          2.殺掉鎖表進(jìn)程:

          alter system kill session '436,35123';

           

          3.RAC環(huán)境中鎖查找:

          SELECT inst_id,DECODE(request,0,'Holder: ','Waiter: ')||sid sess,

                  id1, id2, lmode, request, type,block,ctime

          FROM GV$LOCK

          WHERE (id1, id2, type) IN

                 (SELECT id1, id2, type FROM GV$LOCK WHERE request>0)

          ORDER BY id1, request;

            

           

           

          4.監(jiān)控當(dāng)前數(shù)據(jù)庫(kù)誰(shuí)在運(yùn)行什么SQL語(yǔ)句

          select osuser, username, sql_text 

          from  v$session a, v$sqltext b

          where  a.sql_address =b.address order by address, piece;

           

           

           

          5.找使用CPU多的用戶session

          select a.sid,spid,status,substr(a.program,1,40) prog, a.terminal,osuser,value/60/100 value

          from  v$session a,v$process b,v$sesstat c

          where  c.statistic#=12 and 

                 c.sid=a.sid and 

                 a.paddr=b.addr 

                 order by value desc;

           

           

          6.查看死鎖信息

          SELECT (SELECT username

                    FROM v$session

                   WHERE SID = a.SID) blocker, a.SID, 'is blocking',

                 (SELECT username

                    FROM v$session

                   WHERE SID = b.SID) blockee, b.SID

            FROM v$lock a, v$lock b

           WHERE a.BLOCK = 1 AND b.request > 0 AND a.id1 = b.id1 AND a.id2 = b.id2;

           

           

          7.具有最高等待的對(duì)象

          SELECT   o.OWNER,o.object_name, o.object_type, a.event,

                   SUM (a.wait_time + a.time_waited) total_wait_time

              FROM v$active_session_history a, dba_objects o

             WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE

               AND a.current_obj# = o.object_id

          GROUP BY o.OWNER,o.object_name, o.object_type, a.event

          ORDER BY total_wait_time DESC;

           

           

          SELECT   a.session_id, s.osuser, s.machine, s.program, o.owner, o.object_name,

                   o.object_type, a.event,

                   SUM (a.wait_time + a.time_waited) total_wait_time

              FROM v$active_session_history a, dba_objects o, v$session s

             WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE

               AND a.current_obj# = o.object_id

               AND a.session_id = s.SID

          GROUP BY o.owner,

                   o.object_name,

                   o.object_type,

                   a.event,

                   a.session_id,

                   s.program,

                   s.machine,

                   s.osuser

          ORDER BY total_wait_time DESC;

           

           

           

          8.查詢當(dāng)前連接會(huì)話數(shù)

          select s.value,s.sid,a.username

          from

          v$sesstat S,v$statname N,v$session A

          where

          n.statistic#=s.statistic# and

          name='session pga memory'

          and s.sid=a.sid

          order by s.value;

           

           

           

          9.等待最多的用戶

          SELECT   s.SID, s.username, SUM (a.wait_time + a.time_waited) total_wait_time

              FROM v$active_session_history a, v$session s

             WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE

          GROUP BY s.SID, s.username

          ORDER BY total_wait_time DESC;

           

           

           

          10.等待最多的SQL

          SELECT   a.program, a.session_id, a.user_id, d.username, s.sql_text,

                   SUM (a.wait_time + a.time_waited) total_wait_time

              FROM v$active_session_history a, v$sqlarea s, dba_users d

             WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE

               AND a.sql_id = s.sql_id

               AND a.user_id = d.user_id

          GROUP BY a.program, a.session_id, a.user_id, s.sql_text, d.username;

           

           

           

          11.查看消耗資源最多的SQL

          SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls

          FROM V$SQLAREA

          WHERE buffer_gets > 10000000 OR disk_reads > 1000000

          ORDER BY buffer_gets + 100 * disk_reads DESC;

           

           

           

          12.查看某條SQL語(yǔ)句的資源消耗

          SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls

          FROM V$SQLAREA

          WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');

           

           

          13.查詢會(huì)話執(zhí)行的實(shí)際SQL

          SELECT   a.SID, a.username, s.sql_text

              FROM v$session a, v$sqltext s

             WHERE a.sql_address = s.address

               AND a.sql_hash_value = s.hash_value

               AND a.status = 'ACTIVE'

          ORDER BY a.username, a.SID, s.piece;

           

           

          14.顯示正在等待鎖的所有會(huì)話

          SELECT * FROM DBA_WAITERS;

           

          DDL

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

          /*注意點(diǎn):

           

          1.如果在PL/SQL 等工具里打開的話,直接修改下面的代碼中[斜體加粗部分]執(zhí)行

           

          2.確保路徑存在,比如【D:\oracle\oradata\Oracle9i\】也就是你要保存文件的路徑存在

           

          /*分為四步 */

           

          /*第1步:創(chuàng)建臨時(shí)表空間  */

           

          create temporary tablespace user_temp 

           

          tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'

           

          size 50m 

           

          autoextend on 

           

          next 50m maxsize 20480m 

           

          extent management local; 

           

           

           

          /*第2步:創(chuàng)建數(shù)據(jù)表空間  */

           

          create tablespace user_data 

           

          logging 

           

          datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'

           

          size 50m 

           

          autoextend on 

           

          next 50m maxsize 20480m 

           

          extent management local; 

           

           

           

          /*第3步:創(chuàng)建用戶并指定表空間  */

           

          create user username identified by password 

           

          default tablespace user_data 

           

          temporary tablespace user_temp; 

           

           

           

          /*第4步:給用戶授予權(quán)限  */

           

          grant connect,resource,dba to username; 

          posted @ 2014-03-03 15:48 redcoatjk 閱讀(343) | 評(píng)論 (0)編輯 收藏

          2013年11月4日

          摘自: http://www.douban.com/note/235086917/
          http://jackleechina.iteye.com/blog/1595397

          為什么一般要采用事件監(jiān)聽而不是直接對(duì)元素的事件屬性(如:onclick、onmouseover)賦值?

          原來用事件屬性只能賦值一種方法,即:

          button1.onclick = function() { alert(1); };
          button1.onclick = function() { alert(2); };

          這樣后面的賦值語(yǔ)句就將前面的onclick屬性覆蓋了

          而使用添加事件監(jiān)聽的方式就可以實(shí)現(xiàn)并行。特別是當(dāng)團(tuán)隊(duì)合作時(shí),事件并行的需求增多,比如:監(jiān)聽document對(duì)象的鼠標(biāo)事件或者window對(duì)象的載入事件等。使用事件屬性則很容易造成事件覆蓋掉

          使用事件監(jiān)聽有兩種方式:attachEvent和addEventListener

          attachEvent與addEventListener區(qū)別
          適應(yīng)的瀏覽器版本不同,同時(shí)在使用的過程中要注意
          attachEvent方法 按鈕onclick
          addEventListener方法 按鈕click
          attachEvent方法, (ie系列)
          addEventListener方法 Mozilla系列

          例子如下:
           1<!DOCTYPE html>
           2<html>
           3
           4<SCRIPT LANGUAGE="JavaScript">
           5function method1(){
           6    alert("method1");
           7}

           8function method2(){
           9    alert("method2");
          10}

          11function method3(){
          12    alert("method3");
          13}

          14
          </SCRIPT>
          15<body>
          16<input type="button"  value="dom 元素事件屬性綁定的按鈕" id="button1"/>
          17<input type="button"  value="IE瀏覽器: attachEvent進(jìn)行事件綁定的按鈕" id="btn1"/>
          18<input type="button"  value="火狐瀏覽器: addEventListener進(jìn)行事件綁定的按鈕" id="btn2"/>
          19
          20<SCRIPT LANGUAGE="JavaScript">
          21     /**方法一: 使用元素的事件屬性. [這種方式事件只可綁定一次,最后綁定的執(zhí)行]**/
          22     button1.onclick = function() { alert("1-1"); };
          23     button1.onclick = function() { alert("1-2"); };
          24     /**方法二: 使用attachEvent注冊(cè)事件. 格式如下object.attachEvent(event,function);**/
          25   var btn1Obj = document.getElementById("btn1");
          26    btn1Obj.attachEvent("onclick", method1);
          27   btn1Obj.attachEvent("onclick", method2);
          28    btn1Obj.attachEvent("onclick", method3);
          29     /**方法三: addEventListener. 格式如下element.addEventListener(type,listener,useCapture);**/
          30    var btn2Obj = document.getElementById("btn2");
          31    btn2Obj.addEventListener("click",method1,false);
          32    btn2Obj.addEventListener("click",method2,false);
          33    btn2Obj.addEventListener("click",method3,false);
          34    //執(zhí)行順序?yàn)閙ethod1->method2->method3
          35
          </SCRIPT>
          36<br/>attachEvent按照注冊(cè)倒敘執(zhí)行:    執(zhí)行順序?yàn)閙ethod3->method2->method1 
          37<br/>addEventListener按照注冊(cè)順序執(zhí)行:    執(zhí)行順序?yàn)閙ethod1->method2->method3 
          38</body>
          39</html>

          相關(guān)衍生閱讀:

          JavaScript欲速則不達(dá)——基本處理事件詳解和阻止事件傳播

          posted @ 2013-11-04 14:22 redcoatjk 閱讀(434) | 評(píng)論 (0)編輯 收藏

          2013年4月16日

               摘要: 摘自http://zhangjunhd.blog.51cto.com/113473/20629/ 1.Servlet過濾器 1.1 什么是過濾器 過濾器是一個(gè)程序,它先于與之相關(guān)的servlet或JSP頁(yè)面運(yùn)行在服務(wù)器上。過濾器可附加到一個(gè)或多個(gè)servlet或JSP頁(yè)面上,并且可以檢查進(jìn)入這些資源的請(qǐng)求信息。在這之后,過濾器可以作如下的選擇: ①以常規(guī)的方式調(diào)用資源(即,調(diào)...  閱讀全文
          posted @ 2013-04-16 17:28 redcoatjk 閱讀(260) | 評(píng)論 (0)編輯 收藏

          2012年9月5日

               摘要: 摘自 http://www.sandzhang.com/blog/2010/04/07/mysql-show-status-explained-detail/ 要查看MySQL運(yùn)行狀態(tài),要優(yōu)化MySQL運(yùn)行效率都少不了要運(yùn)行show status查看各種狀態(tài),下面是參考官方文檔及網(wǎng)上資料整理出來的中文詳細(xì)解釋:  如有問題,歡迎指正 狀態(tài)名 作用域 ...  閱讀全文
          posted @ 2012-09-05 15:33 redcoatjk 閱讀(2108) | 評(píng)論 (1)編輯 收藏

          2012年7月20日

               摘要: 代碼中反復(fù)開關(guān)自動(dòng)提交沒有必要. 其他方面寫得還是很不錯(cuò)的.清晰.摘自 http://wangqinqin.iteye.com/blog/547277  PreparedStatement: 1) addBatch()將一組參數(shù)添加到PreparedStatement對(duì)象內(nèi)部。 2) executeBatch()將一批參數(shù)提交給數(shù)據(jù)庫(kù)來執(zhí)行,如果全部命令執(zhí)行成功...  閱讀全文
          posted @ 2012-07-20 15:04 redcoatjk 閱讀(18630) | 評(píng)論 (1)編輯 收藏
           
          摘自 http://neoremind.net/2010/12/preparedstatement_diff/

          JDBC中Statement與PreparedStatement的區(qū)別

          1. statement每次執(zhí)行sql語(yǔ)句,相關(guān)數(shù)據(jù)庫(kù)都要執(zhí)行sql語(yǔ)句的編譯;preparedstatement是預(yù)編譯的, 采用Cache機(jī)制(預(yù)編譯語(yǔ)句,放在Cache中,下次執(zhí)行相同SQL語(yǔ)句時(shí),則可以直接從Cache中取出來,有利于sql生成查詢計(jì)劃。),對(duì)于批量處理可以大大提高效率. 也叫JDBC存儲(chǔ)過程。

          例如,如果要執(zhí)行兩條sql語(yǔ)句

          SELECT colume FROM TABLE WHERE colume=1;
          SELECT colume FROM TABLE WHERE colume=2;

          會(huì)生成兩個(gè)執(zhí)行計(jì)劃

          一千個(gè)查詢就生成一千個(gè)執(zhí)行計(jì)劃!

          PreparedStatement用于使用綁定變量重用執(zhí)行計(jì)劃

          SELECT colume FROM TABLE WHERE colume=:x;

          通過set不同數(shù)據(jù)只需要生成一次執(zhí)行計(jì)劃,可以重用

          是否使用綁定變量對(duì)系統(tǒng)影響非常大,生成執(zhí)行計(jì)劃極為消耗資源

          兩種實(shí)現(xiàn) 速度差距可能成百上千倍

          后者使用了PreparedStatement對(duì)象,而前者是普通的Statement對(duì)象。PreparedStatement對(duì)象不僅包含了SQL語(yǔ)句,而且大多數(shù)情況下這個(gè)語(yǔ)句已經(jīng)被預(yù)編譯過,因而當(dāng)其執(zhí)行時(shí),只需DBMS運(yùn)行SQL語(yǔ)句,而不必先編譯。當(dāng)你需要執(zhí)行Statement對(duì)象多次的時(shí)候,PreparedStatement對(duì)象將會(huì)大大降低運(yùn)行時(shí)間,當(dāng)然也加快了訪問數(shù)據(jù)庫(kù)的速度。

          這種轉(zhuǎn)換也給你帶來很大的便利,不必重復(fù)SQL語(yǔ)句的句法,而只需更改其中變量的值,便可重新執(zhí)行SQL語(yǔ)句。選擇PreparedStatement對(duì)象與否,在于相同句法的SQL語(yǔ)句是否執(zhí)行了多次,而且兩次之間的差別僅僅是變量的不同。如果僅僅執(zhí)行了一次的話,在對(duì)數(shù)據(jù)庫(kù)只執(zhí)行一次性存取的時(shí)侯,用 Statement 對(duì)象進(jìn)行處理,PreparedStatement 對(duì)象的開銷比Statement大,對(duì)于一次性操作并不會(huì)帶來額外的好處。

          2. PrepareStatement中執(zhí)行的SQL語(yǔ)句中是可以帶參數(shù)的,也就是說可以替換變量,盡量采用使用?號(hào)的方式傳遞參數(shù),增加代碼的可讀性又可以預(yù)編譯加速;而Statement則不可以。

          3. 防止SQL注入。在SQL中包含特殊字符或SQL的關(guān)鍵字(如:’ or 1 or ‘)時(shí),Statement將出現(xiàn)不可預(yù)料的結(jié)果(出現(xiàn)異?;虿樵兊慕Y(jié)果不正確),可用PreparedStatement來解決。

          SQL注入或者說SQL注入攻擊就是利用Statement的漏洞完成的,例如用個(gè)用戶登錄,那么form表單有用戶名和密碼
          那么我提交時(shí),在用戶名輸入框內(nèi) 輸入 “aaa’ or ’a’=’a” 密碼框隨便輸入,那么這樣意味著 sql的
          查詢語(yǔ)言就是 “select * from 表 where 用戶名=’aaa’ or ’a’=’a’ and 密碼=’123’  ”,這樣查詢出來所有的數(shù)據(jù)或者是混亂。那么不被授權(quán)的用戶照樣可以登錄,豈不是被黑了?!實(shí)際中現(xiàn)在java程序員早都不用這種方式寫查詢了,一般都用PreparedStatement來查詢,或干脆就用hibernate之類的持久層框架,這樣通過sql注入就無從談起了。
          posted @ 2012-07-20 11:14 redcoatjk 閱讀(4417) | 評(píng)論 (2)編輯 收藏

          2012年7月19日

          摘自:http://ryxxlong.iteye.com/blog/552884

          如何修改mysql root密碼
            忘記MySQL ROOT密碼是在MySQ使用中很常見的問題,可是有很多朋友并不會(huì)重置ROOT密碼,那叫苦啊,特寫此文章與大家交流:

          1、編輯MySQL的配置文件:my.ini
          一般在MySQL安裝目錄下有my.ini即MySQL的配置文件。
          在此配置文件的最后添加如下一行:
          skip-grant-tables
          保存退出編輯。

          2、然后重啟MySQL服務(wù)
          在命令行下執(zhí)行:
          net stop MySQL
          net start MySQL

          3、設(shè)置新的ROOT密碼
          然后用命令提示符cd到對(duì)應(yīng)安裝目錄的bin下執(zhí)行:
          MySQL -u root -p MySQL或mysql -u root -p
          直接回車無需密碼即可進(jìn)入數(shù)據(jù)庫(kù)了。
          此時(shí),在命令行下執(zhí)行 use mysql;
          現(xiàn)在我們執(zhí)行如下語(yǔ)句把root密碼更新為:
          update user set password=PASSWORD("root") where user='root';
          (注意:此時(shí)不用使用mysqladmin -u root -p password '你的新密碼'這條命令修改密碼,因?yàn)?skip-grant-tables'配置,
          不信的話,你可以試用一下,它肯定會(huì)報(bào)如下所示的錯(cuò)誤:
          F:\Documents and Settings\long>mysqladmin -u root -p password 'root'
          Enter password:
          Warning: single quotes were not trimmed from the password by your command
          line client, as you might have expected.
          mysqladmin:
          You cannot use 'password' command as mysqld runs
           with grant tables disabled (was started with --skip-grant-tables).
          Use: "mysqladmin flush-privileges password '*'" instead)
          exit 退出MySQL。

          4、還原配置文件并重啟服務(wù)

          然后修改MySQL配置文件把剛才添加的那一行'skip-grant-tables'刪除。
          再次重起MySQL服務(wù),密碼修改完畢。
          用新密碼root試一下吧,又能登入重新進(jìn)入mysql了?



          附mysql修改密碼的一些方法:
          1. 用MYSQL的grant語(yǔ)句,例如
          mysql -h hostname –u root 命令登錄到mysqld server 用grant 命令改變口令:
          mysql -h 192.168.1.101 -u root
          上邊的192.168.1.101 是偶的mysqld 運(yùn)行機(jī)器,你換成自己的,這樣登錄上去,就可以修改密碼了,
          其實(shí)沒必要這么麻煩,直接mysql -u root就可以了。
          GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'root' WITH GRANT OPTION

          2. mysqladmin -u 用戶名 -p 舊密碼 password 新密碼
          例1:給root 加個(gè)密碼root。首先進(jìn)入cmd中,然后鍵入
          以下命令,至于在CMD下能否使用mysqladmin,
          就要看你的Windows環(huán)境變量PATH中是否添加“E:\Program Files\MySQL\MySQL Server 5.1\bin;”(請(qǐng)改為你自己的安裝路徑)了。)
          mysqladmin -u root password root
          注:因?yàn)殚_始時(shí)root 沒有密碼,所以-p 舊密碼一項(xiàng)就可以省略了。
          例2:再將root 的密碼改為admin。
          mysqladmin –u root -proot password admin(注意-p 不要和后面的密碼分
          開寫,要寫在一起,不然會(huì)出錯(cuò),錯(cuò)誤如下所示:
          F:\Documents and Settings\long>mysqladmin -u root -p root password admin
          Enter password: ****
          mysqladmin: Unknown command: 'root')
          當(dāng)然你也可以這樣寫:mysqladmin –u root -p password admin回車,
          然后再輸入你的舊密碼,這樣也是完全也可以的,看你的愛好了.
          例3:再將root用戶的密碼去掉.
          F:\Documents and Settings\long>mysqladmin -u root -p password  ;
          Enter password: root
          此時(shí),root用戶又沒有密碼了.可以通過下面的方法設(shè)置:
          F:\Documents and Settings\long>mysql -u root
          mysql>set password for 'root'@'localhost'=password('root');(語(yǔ)法:SET PASSWORD FOR '用戶名'@'主機(jī)' = PASSWORD('密碼'))
          mysql>set password for 'root'@'%'=password('root');
          //本條可選,這是在配置mysql數(shù)據(jù)庫(kù),如果你選擇了允許root通過遠(yuǎn)程登錄進(jìn)來時(shí),你在mysql數(shù)據(jù)庫(kù)下的user表中,
          use mysql;
          select * from user;可以看到有兩條記錄,如果你沒有配置這一項(xiàng)的話,只會(huì)第一條記錄!
          Host                    User     Password
          'localhost', 'root', '*9C9F4927129ECC3209D8550DC8B67156FDBF9418', ...
          '%', 'root', '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B', ...
          通過以上設(shè)置,root的密碼將變?yōu)閞oot這樣就完成了根用戶root密碼的設(shè)置工作。

          3. use mysql;
           update user set password =password('yourpass') where user='root'

          (注:下面的這些方法我本人沒有試過,不知對(duì)不對(duì),我只是轉(zhuǎn)載了一下:)
          下面的方法都在mysql提示符下使用,且必須有mysql的root權(quán)限:
          方法4
          mysql> INSERT INTO mysql.user (Host,User,Password)
          VALUES('%','jeffrey',PASSWORD('biscuit'));
          mysql> FLUSH PRIVILEGES
          確切地說這是在增加一個(gè)用戶,用戶名為jeffrey,密碼為biscuit。
          在《mysql中文參考手冊(cè)》里有這個(gè)例子,所以我也就寫出來了。
          注意要使用PASSWORD函數(shù),然后還要使用FLUSH PRIVILEGES。

          方法5
          和方法三一樣,只是使用了REPLACE語(yǔ)句
          mysql> REPLACE INTO mysql.user (Host,User,Password)
          VALUES('%','jeffrey',PASSWORD('biscuit'));
          mysql> FLUSH PRIVILEGES

          方法6
          使用SET PASSWORD語(yǔ)句,
          mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
          你也必須使用PASSWORD()函數(shù),
          但是不需要使用FLUSH PRIVILEGES。


          方法7
          使用GRANT ... IDENTIFIED BY語(yǔ)句
          mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
          這里PASSWORD()函數(shù)是不必要的,也不需要使用FLUSH PRIVILEGES。

          注:mysql 新設(shè)置用戶或更改密碼后需用flush privileges刷新MySQL的系統(tǒng)權(quán)限相關(guān)表,
          否則會(huì)出現(xiàn)拒絕訪問,還有一種方法,就是重新啟動(dòng)mysql服務(wù)器,來使新設(shè)置生效。

          posted @ 2012-07-19 10:54 redcoatjk 閱讀(323) | 評(píng)論 (0)編輯 收藏

          2012年6月13日

          怎么查看端口占用情況?

                 開始--運(yùn)行--cmd 進(jìn)入命令提示符 輸入netstat -ano 即可看到所有連接的PID 之后在任務(wù)管理器中找到這個(gè)PID所對(duì)應(yīng)的程序如果任務(wù)管理器中沒有PID這一項(xiàng),可以在任務(wù)管理器中選"查看"-"選擇列"

                  經(jīng)常,我們?cè)趩?dòng)應(yīng)用的時(shí)候發(fā)現(xiàn)系統(tǒng)需要的端口被別的程序占用,如何知道誰(shuí)占有了我們需要的端口,很多人都比較頭疼,下面就介紹一種非常簡(jiǎn)單的方法,希望對(duì)大家有用

          假如我們需要確定誰(shuí)占用了我們的9050端口

          1、Windows平臺(tái)
          在windows命令行窗口下執(zhí)行:

          C:\>netstat -aon|findstr "9050"

          TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING 2016


          看到了嗎,端口被進(jìn)程號(hào)為2016的進(jìn)程占用,繼續(xù)執(zhí)行下面命令:

          C:\>tasklist|findstr "2016"

          tor.exe 2016 Console 0 16,064 K

          很清楚吧,tor占用了你的端口。

          posted @ 2012-06-13 13:51 redcoatjk 閱讀(254) | 評(píng)論 (0)編輯 收藏

          2012年2月27日

          JSON 即 JavaScript Object Natation,它是一種輕量級(jí)的數(shù)據(jù)交換格式,非常適合于服務(wù)器與 JavaScript 的交互。本文將快速講解 JSON 格式,并通過代碼示例演示如何分別在客戶端和服務(wù)器端進(jìn)行 JSON 格式數(shù)據(jù)的處理。
          管有許多宣傳關(guān)于 XML 如何擁有跨平臺(tái),跨語(yǔ)言的優(yōu)勢(shì),然而,除非應(yīng)用于 Web Services,否則,在普通的 Web 應(yīng)用中,開發(fā)者經(jīng)常為 XML 的解析傷透了腦筋,無論是服務(wù)器端生成或處理 XML,還是客戶端用 JavaScript 解析 XML,都常常導(dǎo)致復(fù)雜的代碼,極低的開發(fā)效率。實(shí)際上,對(duì)于大多數(shù) Web 應(yīng)用來說,他們根本不需要復(fù)雜的 XML 來傳輸數(shù)據(jù),XML 的擴(kuò)展性很少具有優(yōu)勢(shì),許多 AJAX 應(yīng)用甚至直接返回 HTML 片段來構(gòu)建動(dòng)態(tài) Web 頁(yè)面。和返回 XML 并解析它相比,返回 HTML 片段大大降低了系統(tǒng)的復(fù)雜性,但同時(shí)缺少了一定的靈活性。

          現(xiàn)在, JSON 為 Web 應(yīng)用開發(fā)者提供了另一種數(shù)據(jù)交換格式。讓我們來看看 JSON 到底是什么,同 XML 或 HTML 片段相比,JSON 提供了更好的簡(jiǎn)單性和靈活性。

          JSON 數(shù)據(jù)格式解析

          和 XML 一樣,JSON 也是基于純文本的數(shù)據(jù)格式。由于 JSON 天生是為 JavaScript 準(zhǔn)備的,因此,JSON 的數(shù)據(jù)格式非常簡(jiǎn)單,您可以用 JSON 傳輸一個(gè)簡(jiǎn)單的 String,Number,Boolean,也可以傳輸一個(gè)數(shù)組,或者一個(gè)復(fù)雜的 Object 對(duì)象。

          String,Number 和 Boolean 用 JSON 表示非常簡(jiǎn)單。例如,用 JSON 表示一個(gè)簡(jiǎn)單的 String “ abc ”,其格式為:

          "abc"

          這與絕大多數(shù)編程語(yǔ)言的表示方法一致,例如:

          12345(整數(shù))
          -3.9e10(浮點(diǎn)數(shù))

          Boolean 類型表示為 truefalse 。此外,JavaScript 中的 null 被表示為 null,注意,true、falsenull 都沒有雙引號(hào),否則將被視為一個(gè) String 。

          JSON 還可以表示一個(gè)數(shù)組對(duì)象,使用 [] 包含所有元素,每個(gè)元素用逗號(hào)分隔,元素可以是任意的 Value,例如,以下數(shù)組包含了一個(gè) String,Number,Boolean 和一個(gè) null:

          ["abc",12345,false,null]

          Object 對(duì)象在 JSON 中是用 {} 包含一系列無序的 Key-Value 鍵值對(duì)表示的,實(shí)際上此處的 Object 相當(dāng)于 Java 中的 Map<String, Object>,而不是 Java 的 Class 。注意 Key 只能用 String 表示。

          例如,一個(gè) Address 對(duì)象包含如下 Key-Value:

          city:Beijing 
          street:Chaoyang Road
          postcode:100025(整數(shù))

          用 JSON 表示如下:

          {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}

          其中 Value 也可以是另一個(gè) Object 或者數(shù)組,因此,復(fù)雜的 Object 可以嵌套表示,例如,一個(gè) Person 對(duì)象包含 name 和 address 對(duì)象,可以表示如下:

          {"name":"Michael","address":
          {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
          }

          JavaScript 處理 JSON 數(shù)據(jù)

          上面介紹了如何用 JSON 表示數(shù)據(jù),接下來,我們還要解決如何在服務(wù)器端生成 JSON 格式的數(shù)據(jù)以便發(fā)送到客戶端,以及客戶端如何使用 JavaScript 處理 JSON 格式的數(shù)據(jù)。

          我們先討論如何在 Web 頁(yè)面中用 JavaScript 處理 JSON 數(shù)據(jù)。我們通過一個(gè)簡(jiǎn)單的 JavaScript 方法就能看到客戶端如何將 JSON 數(shù)據(jù)表示給用戶:

          function handleJson() { 
          var j={"name":"Michael","address":
          {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
          };
          document.write(j.name);
          document.write(j.address.city);
          }

          假定服務(wù)器返回的 JSON 數(shù)據(jù)是上文的:

          {"name":"Michael","address":
          {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
          }

          只需將其賦值給一個(gè) JavaScript 變量,就可以立刻使用該變量并更新頁(yè)面中的信息了,相比 XML 需要從 DOM 中讀取各種節(jié)點(diǎn)而言,JSON 的使用非常容易。我們需要做的僅僅是發(fā)送一個(gè) Ajax 請(qǐng)求,然后將服務(wù)器返回的 JSON 數(shù)據(jù)賦值給一個(gè)變量即可。有許多 Ajax 框架早已包含了處理 JSON 數(shù)據(jù)的能力,例如 Prototype(一個(gè)流行的 JavaScript 庫(kù):http://prototypejs.org)提供了 evalJSON() 方法,能直接將服務(wù)器返回的 JSON 文本變成一個(gè) JavaScript 變量:

          new Ajax.Request("http://url", { 
          method: "get",
          onSuccess: function(transport) {
          var json = transport.responseText.evalJSON();
          // TODO: document.write(json.xxx);
          }
          });

          服務(wù)器端輸出 JSON 格式數(shù)據(jù)

          下面我們討論如何在服務(wù)器端輸出 JSON 格式的數(shù)據(jù)。以 Java 為例,我們將演示將一個(gè) Java 對(duì)象編碼為 JSON 格式的文本。

          將 String 對(duì)象編碼為 JSON 格式時(shí),只需處理好特殊字符即可。另外,必須用 (") 而非 (') 表示字符串:


          static String string2Json(String s) {
          StringBuilder sb = new StringBuilder(s.length()+20);
          sb.append('\"');
          for (int i=0; i<s.length(); i++) {
          char c = s.charAt(i);
          switch (c) {
          case '\"':
          sb.append("\\\"");
          break;
          case '\\':
          sb.append("\\\\");
          break;
          case '/':
          sb.append("\\/");
          break;
          case '\b':
          sb.append("\\b");
          break;
          case '\f':
          sb.append("\\f");
          break;
          case '\n':
          sb.append("\\n");
          break;
          case '\r':
          sb.append("\\r");
          break;
          case '\t':
          sb.append("\\t");
          break;
          default:
          sb.append(c);
          }
          }
          sb.append('\"');
          return sb.toString();
          }

          將 Number 表示為 JSON 就容易得多,利用 Java 的多態(tài),我們可以處理 Integer,Long,F(xiàn)loat 等多種 Number 格式:


          static String number2Json(Number number) {
          return number.toString();
          }

          Boolean 類型也可以直接通過 toString() 方法得到 JSON 的表示:


          static String boolean2Json(Boolean bool) {
          return bool.toString();
          }

          要將數(shù)組編碼為 JSON 格式,可以通過循環(huán)將每一個(gè)元素編碼出來:


          static String array2Json(Object[] array) {
          if (array.length==0)
          return "[]";
          StringBuilder sb = new StringBuilder(array.length << 4);
          sb.append('[');
          for (Object o : array) {
          sb.append(toJson(o));
          sb.append(',');
          }
          // 將最后添加的 ',' 變?yōu)?']':
          sb.setCharAt(sb.length()-1, ']');
          return sb.toString();
          }

          最后,我們需要將 Map<String, Object> 編碼為 JSON 格式,因?yàn)?JavaScript 的 Object 實(shí)際上對(duì)應(yīng)的是 Java 的 Map<String, Object> 。該方法如下:


          static String map2Json(Map<String, Object> map) {
          if (map.isEmpty())
          return "{}";
          StringBuilder sb = new StringBuilder(map.size() << 4);
          sb.append('{');
          Set<String> keys = map.keySet();
          for (String key : keys) {
          Object value = map.get(key);
          sb.append('\"');
          sb.append(key);
          sb.append('\"');
          sb.append(':');
          sb.append(toJson(value));
          sb.append(',');
          }
          // 將最后的 ',' 變?yōu)?'}':
          sb.setCharAt(sb.length()-1, '}');
          return sb.toString();
          }

          為了統(tǒng)一處理任意的 Java 對(duì)象,我們編寫一個(gè)入口方法 toJson(Object),能夠?qū)⑷我獾?Java 對(duì)象編碼為 JSON 格式:


          public static String toJson(Object o) {
          if (o==null)
          return "null";
          if (o instanceof String)
          return string2Json((String)o);
          if (o instanceof Boolean)
          return boolean2Json((Boolean)o);
          if (o instanceof Number)
          return number2Json((Number)o);
          if (o instanceof Map)
          return map2Json((Map<String, Object>)o);
          if (o instanceof Object[])
          return array2Json((Object[])o);
          throw new RuntimeException("Unsupported type: " + o.getClass().getName());
          }

          我們并未對(duì) Java 對(duì)象作嚴(yán)格的檢查。不被支持的對(duì)象(例如 List)將直接拋出 RuntimeException 。此外,為了保證輸出的 JSON 是有效的,Map<String, Object> 對(duì)象的 Key 也不能包含特殊字符。細(xì)心的讀者可能還會(huì)發(fā)現(xiàn)循環(huán)引用的對(duì)象會(huì)引發(fā)無限遞歸,例如,精心構(gòu)造一個(gè)循環(huán)引用的 Map,就可以檢測(cè)到 StackOverflowException


          @Test(expected=StackOverflowError.class)
          public void testRecurrsiveMap2Json() {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("key", map);
          JsonUtil.map2Json(map);
          }

          好在服務(wù)器處理的 JSON 數(shù)據(jù)最終都應(yīng)該轉(zhuǎn)化為簡(jiǎn)單的 JavaScript 對(duì)象,因此,遞歸引用的可能性很小。

          最后,通過 Servlet 或 MVC 框架輸出 JSON 時(shí),需要設(shè)置正確的 MIME 類型(application/json)和字符編碼。假定服務(wù)器使用 UTF-8 編碼,則可以使用以下代碼輸出編碼后的 JSON 文本:


          response.setContentType("application/json;charset=UTF-8");
          response.setCharacterEncoding("UTF-8");
          PrintWriter pw = response.getWriter();
          pw.write(JsonUtil.toJson(obj));
          pw.flush();

          小結(jié)

          JSON 已經(jīng)是 JavaScript 標(biāo)準(zhǔn)的一部分。目前,主流的瀏覽器對(duì) JSON 支持都非常完善。應(yīng)用 JSON,我們可以從 XML 的解析中擺脫出來,對(duì)那些應(yīng)用 Ajax 的 Web 2.0 網(wǎng)站來說,JSON 確實(shí)是目前最靈活的輕量級(jí)方案。

          posted @ 2012-02-27 11:00 redcoatjk 閱讀(335) | 評(píng)論 (0)編輯 收藏

          2012年2月14日

          JNDI是 Java 命名與目錄接口(Java Naming and Directory Interface),在J2EE規(guī)范中是重要的規(guī)范之一,不少專家認(rèn)為,沒有透徹理解JNDI的意義和作用,就沒有真正掌握J(rèn)2EE特別是EJB的知識(shí)。
          那么,JNDI到底起什么作用?

          要了解JNDI的作用,我們可以從“如果不用JNDI我們?cè)鯓幼觯坑昧薐NDI后我們又將怎樣做?”這個(gè)問題來探討。

          沒有JNDI的做法:
          程序員開發(fā)時(shí),知道要開發(fā)訪問MySQL數(shù)據(jù)庫(kù)的應(yīng)用,于是將一個(gè)對(duì) MySQL JDBC 驅(qū)動(dòng)程序類的引用進(jìn)行了編碼,并通過使用適當(dāng)?shù)?JDBC URL 連接到數(shù)據(jù)庫(kù)。
          就像以下代碼這樣:

          Connection conn=null;
          try {Class.forName("com.mysql.jdbc.Driver",true, Thread.currentThread().getContextClassLoader());
          conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
          /* 使用conn并進(jìn)行SQL操作 */......
          conn.close();
          }
          catch(Exception e)
          {e.printStackTrace();}
          finally {if(conn!=null)
          {try {conn.close();}
          catch(SQLException e) {
          }}}

          這是傳統(tǒng)的做法,也是以前非Java程序員(如Delphi、VB等)常見的做法。這種做法一般在小規(guī)模的開發(fā)過程中不會(huì)產(chǎn)生問題,只要程序員熟悉Java語(yǔ)言、了解JDBC技術(shù)和MySQL,可以很快開發(fā)出相應(yīng)的應(yīng)用程序。

          沒有JNDI的做法存在的問題:
          1、數(shù)據(jù)庫(kù)服務(wù)器名稱MyDBServer 、用戶名和口令都可能需要改變,由此引發(fā)JDBC URL需要修改;
          2、數(shù)據(jù)庫(kù)可能改用別的產(chǎn)品,如改用DB2或者Oracle,引發(fā)JDBC驅(qū)動(dòng)程序包和類名需要修改;
          3、隨著實(shí)際使用終端的增加,原配置的連接池參數(shù)可能需要調(diào)整;
          4、......

          解決辦法:
          程序員應(yīng)該不需要關(guān)心“具體的數(shù)據(jù)庫(kù)后臺(tái)是什么?JDBC驅(qū)動(dòng)程序是什么?JDBC URL格式是什么?訪問數(shù)據(jù)庫(kù)的用戶名和口令是什么?”等等這些問題,程序員編寫的程序應(yīng)該沒有對(duì) JDBC 驅(qū)動(dòng)程序的引用,沒有服務(wù)器名稱,沒有用戶名稱或口令 —— 甚至沒有數(shù)據(jù)庫(kù)池或連接管理。而是把這些問題交給J2EE容器來配置和管理,程序員只需要對(duì)這些配置和管理進(jìn)行引用即可。

          由此,就有了JNDI。

          用了JNDI之后的做法:
          首先,在在J2EE容器中配置JNDI參數(shù),定義一個(gè)數(shù)據(jù)源,也就是JDBC引用參數(shù),給這個(gè)數(shù)據(jù)源設(shè)置一個(gè)名稱;然后,在程序中,通過數(shù)據(jù)源名稱引用數(shù)據(jù)源從而訪問后臺(tái)數(shù)據(jù)庫(kù)。
          具體操作如下(以JBoss為例):
          1、配置數(shù)據(jù)源
          在JBoss的 D:\jboss420GA\docs\examples\jca 文件夾下面,有很多不同數(shù)據(jù)庫(kù)引用的數(shù)據(jù)源定義模板。將其中的 mysql-ds.xml 文件Copy到你使用的服務(wù)器下,如 D:\jboss420GA\server\default\deploy。
          修改 mysql-ds.xml 文件的內(nèi)容,使之能通過JDBC正確訪問你的MySQL數(shù)據(jù)庫(kù),如下:
          <?xml version="1.0" encoding="UTF-8"?>
          <datasources>
          <local-tx-datasource>
              <jndi-name>MySqlDS</jndi-name>
              <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>
              <driver-class>com.mysql.jdbc.Driver</driver-class>
              <user-name>root</user-name>
              <password>rootpassword</password>
          <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
              <metadata>
                 <type-mapping>mySQL</type-mapping>
              </metadata>
          </local-tx-datasource>
          </datasources>

          這里,定義了一個(gè)名為MySqlDS的數(shù)據(jù)源,其參數(shù)包括JDBC的URL,驅(qū)動(dòng)類名,用戶名及密碼等。

          2、在程序中引用數(shù)據(jù)源:

          Connection conn=null;
          try
          {
          Context ctx=new InitialContext();
          Object datasourceRef=ctx.lookup("java:MySqlDS");
          //引用數(shù)據(jù)源
          DataSource ds=(Datasource)datasourceRef;
          conn=ds.getConnection();
          /* 使用conn進(jìn)行數(shù)據(jù)庫(kù)SQL操作 */......
          c.close();
          }
          catch(Exception e)
          {e.printStackTrace();}
          finally {if(conn!=null)
          {
          try
          {
          conn.close();
          }
          catch(SQLException e)
          {
          }}}
          直接使用JDBC或者通過JNDI引用數(shù)據(jù)源的編程代碼量相差無幾,但是現(xiàn)在的程序可以不用關(guān)心具體JDBC參數(shù)了。
          在系統(tǒng)部署后,如果數(shù)據(jù)庫(kù)的相關(guān)參數(shù)變更,只需要重新配置 mysql-ds.xml 修改其中的JDBC參數(shù),只要保證數(shù)據(jù)源的名稱不變,那么程序源代碼就無需修改。

          由此可見,JNDI避免了程序與數(shù)據(jù)庫(kù)之間的緊耦合,使應(yīng)用更加易于配置、易于部署。

          JNDI的擴(kuò)展:
          JNDI在滿足了數(shù)據(jù)源配置的要求的基礎(chǔ)上,還進(jìn)一步擴(kuò)充了作用:所有與系統(tǒng)外部的資源的引用,都可以通過JNDI定義和引用。

          所以,在J2EE規(guī)范中,J2EE 中的資源并不局限于 JDBC 數(shù)據(jù)源。引用的類型有很多,其中包括資源引用(已經(jīng)討論過)、環(huán)境實(shí)體和 EJB 引用。特別是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一項(xiàng)關(guān)鍵角色:查找其他應(yīng)用程序組件。

          EJB 的 JNDI 引用非常類似于 JDBC 資源的引用。在服務(wù)趨于轉(zhuǎn)換的環(huán)境中,這是一種很有效的方法。可以對(duì)應(yīng)用程序架構(gòu)中所得到的所有組件進(jìn)行這類配置管理,從 EJB 組件到 JMS 隊(duì)列和主題,再到簡(jiǎn)單配置字符串或其他對(duì)象,這可以降低隨時(shí)間的推移服務(wù)變更所產(chǎn)生的維護(hù)成本,同時(shí)還可以簡(jiǎn)化部署,減少集成工作。 外部資源”。


          總結(jié):
          J2EE 規(guī)范要求所有 J2EE 容器都要提供 JNDI 規(guī)范的實(shí)現(xiàn)。JNDI 在 J2EE 中的角色就是“交換機(jī)” —— J2EE 組件在運(yùn)行時(shí)間接地查找其他組件、資源或服務(wù)的通用機(jī)制。在多數(shù)情況下,提供 JNDI 供應(yīng)者的容器可以充當(dāng)有限的數(shù)據(jù)存儲(chǔ),這樣管理員就可以設(shè)置應(yīng)用程序的執(zhí)行屬性,并讓其他應(yīng)用程序引用這些屬性(Java 管理擴(kuò)展(Java Management Extensions,JMX)也可以用作這個(gè)目的)。JNDI 在 J2EE 應(yīng)用程序中的主要角色就是提供間接層,這樣組件就可以發(fā)現(xiàn)所需要的資源,而不用了解這些間接性。

          在 J2EE 中,JNDI 是把 J2EE 應(yīng)用程序合在一起的粘合劑,JNDI 提供的間接尋址允許跨企業(yè)交付可伸縮的、功能強(qiáng)大且很靈活的應(yīng)用程序。這是 J2EE 的承諾,而且經(jīng)過一些計(jì)劃和預(yù)先考慮,這個(gè)承諾是完全可以實(shí)現(xiàn)的。
          posted @ 2012-02-14 10:24 redcoatjk 閱讀(343) | 評(píng)論 (0)編輯 收藏
          CALENDER
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(3)

          隨筆分類(22)

          隨筆檔案(76)

          文章分類(12)

          文章檔案(17)

          搜索

          •  

          積分與排名

          • 積分 - 250403
          • 排名 - 227

          最新評(píng)論

          評(píng)論排行榜


          Powered By: 博客園
          模板提供滬江博客

          主站蜘蛛池模板: 黔南| 永寿县| 贵德县| 资中县| 武城县| 嘉义市| 马尔康县| 阳新县| 江津市| 庆云县| 平山县| 杨浦区| 龙井市| 荣成市| 仙桃市| 曲靖市| 清涧县| 苍溪县| 静宁县| 阿克苏市| 兴业县| 新邵县| 新丰县| 多伦县| 冀州市| 桐柏县| 永兴县| 宜川县| 大姚县| 新田县| 湖口县| 巴彦淖尔市| 巴彦县| 隆林| 松溪县| 宣汉县| 平邑县| 台山市| 堆龙德庆县| 西丰县| 建德市|