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

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

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

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

    2014年3月3日

    --查詢表空間、表空間大小及表空間對應(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)前表級鎖的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.殺掉鎖表進程:

    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ù)庫誰在運行什么SQL語句

    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.具有最高等待的對象

    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)前連接會話數(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語句的資源消耗

    SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls

    FROM V$SQLAREA

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

     

     

    13.查詢會話執(zhí)行的實際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.顯示正在等待鎖的所有會話

    SELECT * FROM DBA_WAITERS;

     

    DDL

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

    /*注意點:

     

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

     

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

     

    /*分為四步 */

     

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

     

    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 閱讀(344) | 評論 (0)編輯 收藏

    2013年11月4日

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

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

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

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

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

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

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

    attachEvent與addEventListener區(qū)別
    適應(yīng)的瀏覽器版本不同,同時在使用的過程中要注意
    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進行事件綁定的按鈕" id="btn1"/>
    18<input type="button"  value="火狐瀏覽器: addEventListener進行事件綁定的按鈕" 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注冊事件. 格式如下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í)行順序為method1->method2->method3
    35
    </SCRIPT>
    36<br/>attachEvent按照注冊倒敘執(zhí)行:    執(zhí)行順序為method3->method2->method1 
    37<br/>addEventListener按照注冊順序執(zhí)行:    執(zhí)行順序為method1->method2->method3 
    38</body>
    39</html>

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

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

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

    2013年4月16日

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

    2012年9月5日

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

    2012年7月20日

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

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

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

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

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

    會生成兩個執(zhí)行計劃

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

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

    SELECT colume FROM TABLE WHERE colume=:x;

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

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

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

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

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

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

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

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

    2012年7月19日

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

    如何修改mysql root密碼
      忘記MySQL ROOT密碼是在MySQ使用中很常見的問題,可是有很多朋友并不會重置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到對應(yīng)安裝目錄的bin下執(zhí)行:
    MySQL -u root -p MySQL或mysql -u root -p
    直接回車無需密碼即可進入數(shù)據(jù)庫了。
    此時,在命令行下執(zhí)行 use mysql;
    現(xiàn)在我們執(zhí)行如下語句把root密碼更新為:
    update user set password=PASSWORD("root") where user='root';
    (注意:此時不用使用mysqladmin -u root -p password '你的新密碼'這條命令修改密碼,因為'skip-grant-tables'配置,
    不信的話,你可以試用一下,它肯定會報如下所示的錯誤:
    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試一下吧,又能登入重新進入mysql了?



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

    2. mysqladmin -u 用戶名 -p 舊密碼 password 新密碼
    例1:給root 加個密碼root。首先進入cmd中,然后鍵入
    以下命令,至于在CMD下能否使用mysqladmin,
    就要看你的Windows環(huán)境變量PATH中是否添加“E:\Program Files\MySQL\MySQL Server 5.1\bin;”(請改為你自己的安裝路徑)了。)
    mysqladmin -u root password root
    注:因為開始時root 沒有密碼,所以-p 舊密碼一項就可以省略了。
    例2:再將root 的密碼改為admin。
    mysqladmin –u root -proot password admin(注意-p 不要和后面的密碼分
    開寫,要寫在一起,不然會出錯,錯誤如下所示:
    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
    此時,root用戶又沒有密碼了.可以通過下面的方法設(shè)置:
    F:\Documents and Settings\long>mysql -u root
    mysql>set password for 'root'@'localhost'=password('root');(語法:SET PASSWORD FOR '用戶名'@'主機' = PASSWORD('密碼'))
    mysql>set password for 'root'@'%'=password('root');
    //本條可選,這是在配置mysql數(shù)據(jù)庫,如果你選擇了允許root通過遠程登錄進來時,你在mysql數(shù)據(jù)庫下的user表中,
    use mysql;
    select * from user;可以看到有兩條記錄,如果你沒有配置這一項的話,只會第一條記錄!
    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'

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

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

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


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

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

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

    2012年6月13日

    怎么查看端口占用情況?

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

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

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

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

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

    TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING 2016


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

    C:\>tasklist|findstr "2016"

    tor.exe 2016 Console 0 16,064 K

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

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

    2012年2月27日

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

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

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

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

    String,Number 和 Boolean 用 JSON 表示非常簡單。例如,用 JSON 表示一個簡單的 String “ abc ”,其格式為:

    "abc"

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

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

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

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

    ["abc",12345,false,null]

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

    例如,一個 Address 對象包含如下 Key-Value:

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

    用 JSON 表示如下:

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

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

    {"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 頁面中用 JavaScript 處理 JSON 數(shù)據(jù)。我們通過一個簡單的 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}
    }

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

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


    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)將每一個元素編碼出來:


    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 格式,因為 JavaScript 的 Object 實際上對應(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 對象,我們編寫一個入口方法 toJson(Object),能夠?qū)⑷我獾?Java 對象編碼為 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());
    }

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

    最后,通過 Servlet 或 MVC 框架輸出 JSON 時,需要設(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)的一部分。目前,主流的瀏覽器對 JSON 支持都非常完善。應(yīng)用 JSON,我們可以從 XML 的解析中擺脫出來,對那些應(yīng)用 Ajax 的 Web 2.0 網(wǎng)站來說,JSON 確實是目前最靈活的輕量級方案。

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

    2012年2月14日

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

    要了解JNDI的作用,我們可以從“如果不用JNDI我們怎樣做?用了JNDI后我們又將怎樣做?”這個問題來探討。

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

    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并進行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ā)過程中不會產(chǎn)生問題,只要程序員熟悉Java語言、了解JDBC技術(shù)和MySQL,可以很快開發(fā)出相應(yīng)的應(yīng)用程序。

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

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

    由此,就有了JNDI。

    用了JNDI之后的做法:
    首先,在在J2EE容器中配置JNDI參數(shù),定義一個數(shù)據(jù)源,也就是JDBC引用參數(shù),給這個數(shù)據(jù)源設(shè)置一個名稱;然后,在程序中,通過數(shù)據(jù)源名稱引用數(shù)據(jù)源從而訪問后臺數(shù)據(jù)庫。
    具體操作如下(以JBoss為例):
    1、配置數(shù)據(jù)源
    在JBoss的 D:\jboss420GA\docs\examples\jca 文件夾下面,有很多不同數(shù)據(jù)庫引用的數(shù)據(jù)源定義模板。將其中的 mysql-ds.xml 文件Copy到你使用的服務(wù)器下,如 D:\jboss420GA\server\default\deploy。
    修改 mysql-ds.xml 文件的內(nèi)容,使之能通過JDBC正確訪問你的MySQL數(shù)據(jù)庫,如下:
    <?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>

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

    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進行數(shù)據(jù)庫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ù)庫的相關(guān)參數(shù)變更,只需要重新配置 mysql-ds.xml 修改其中的JDBC參數(shù),只要保證數(shù)據(jù)源的名稱不變,那么程序源代碼就無需修改。

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

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

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

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


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

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

    常用鏈接

    留言簿(3)

    隨筆分類(22)

    隨筆檔案(76)

    文章分類(12)

    文章檔案(17)

    搜索

    •  

    積分與排名

    • 積分 - 250504
    • 排名 - 227

    最新評論

    評論排行榜


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

    主站蜘蛛池模板: 国产亚洲中文日本不卡二区| 亚洲成A人片在线观看中文| 久久99精品视免费看| a级毛片在线免费| 女同免费毛片在线播放| 国产亚洲精品不卡在线| 四虎精品亚洲一区二区三区| 免费在线观看黄网| 亚洲精品无码久久不卡| 亚洲一区二区三区在线播放| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 色窝窝亚洲AV网在线观看| 亚洲熟妇av午夜无码不卡| 亚洲国产精品乱码在线观看97| 在线观看国产情趣免费视频| 日韩欧美一区二区三区免费观看| 精品多毛少妇人妻AV免费久久| 亚洲国产片在线观看| 亚洲一区二区观看播放| 亚洲av无一区二区三区| 深夜福利在线免费观看| 色吊丝性永久免费看码| 久久久久久av无码免费看大片| 亚洲精品色播一区二区| 蜜桃传媒一区二区亚洲AV| 免费精品国自产拍在线播放 | 亚洲热线99精品视频| 亚洲成年轻人电影网站www| 亚洲日本乱码一区二区在线二产线| 国产精品亚洲玖玖玖在线观看| 在线免费观看a级片| 免费人妻av无码专区| 国产亚洲色视频在线| 亚洲精品人成在线观看| 在线a亚洲老鸭窝天堂av高清| 亚洲国产电影在线观看| 亚洲AV第一成肉网| 在线涩涩免费观看国产精品 | 国产亚洲中文日本不卡二区| 国产亚洲欧美日韩亚洲中文色| 亚洲粉嫩美白在线|