Energy of Love |
|
|||
日歷
統(tǒng)計(jì)
導(dǎo)航常用鏈接留言簿隨筆分類
隨筆檔案
搜索最新評(píng)論
閱讀排行榜評(píng)論排行榜 |
<c3p0-config>
<default-config> <!--當(dāng)連接池中的連接耗盡的時(shí)候c3p0一次同時(shí)獲取的連接數(shù)。Default: 3 --> <property name="acquireIncrement">3</property> <!--定義在從數(shù)據(jù)庫獲取新連接失敗后重復(fù)嘗試的次數(shù)。Default: 30 --> <property name="acquireRetryAttempts">30</property> <!--兩次連接中間隔時(shí)間,單位毫秒。Default: 1000 --> <property name="acquireRetryDelay">1000</property> <!--連接關(guān)閉時(shí)默認(rèn)將所有未提交的操作回滾。Default: false --> <property name="autoCommitOnClose">false</property> <!--c3p0將建一張名為Test的空表,并使用其自帶的查詢語句進(jìn)行測試。如果定義了這個(gè)參數(shù)那么 屬性preferredTestQuery將被忽略。你不能在這張Test表上進(jìn)行任何操作,它將只供c3p0測試 使用。Default: null--> <property name="automaticTestTable">Test</property> <!--獲取連接失敗將會(huì)引起所有等待連接池來獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效 保留,并在下次調(diào)用getConnection()的時(shí)候繼續(xù)嘗試獲取連接。如果設(shè)為true,那么在嘗試 獲取連接失敗后該數(shù)據(jù)源將申明已斷開并永久關(guān)閉。Default: false--> <property name="breakAfterAcquireFailure">false</property> <!--當(dāng)連接池用完時(shí)客戶端調(diào)用getConnection()后等待獲取新連接的時(shí)間,超時(shí)后將拋出 SQLException,如設(shè)為0則無限期等待。單位毫秒。Default: 0 --> <property name="checkoutTimeout">100</property> <!--通過實(shí)現(xiàn)ConnectionTester或QueryConnectionTester的類來測試連接。類名需制定全路徑。 Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--> <property name="connectionTesterClassName"></property> <!--指定c3p0 libraries的路徑,如果(通常都是這樣)在本地即可獲得那么無需設(shè)置,默認(rèn)null即可 Default: null--> <property name="factoryClassLocation">null</property> <!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. (文檔原文)作者強(qiáng)烈建議不使用的一個(gè)屬性--> <property name="forceIgnoreUnresolvedTransactions">false</property> <!--每60秒檢查所有連接池中的空閑連接。Default: 0 --> <property name="idleConnectionTestPeriod">60</property> <!--初始化時(shí)獲取三個(gè)連接,取值應(yīng)在minPoolSize與maxPoolSize之間。Default: 3 --> <property name="initialPoolSize">3</property> <!--最大空閑時(shí)間,60秒內(nèi)未使用則連接被丟棄。若為0則永不丟棄。Default: 0 --> <property name="maxIdleTime">60</property> <!--連接池中保留的最大連接數(shù)。Default: 15 --> <property name="maxPoolSize">15</property> <!--JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量。但由于預(yù)緩存的statements 屬于單個(gè)connection而不是整個(gè)連接池。所以設(shè)置這個(gè)參數(shù)需要考慮到多方面的因素。 如果maxStatements與maxStatementsPerConnection均為0,則緩存被關(guān)閉。Default: 0--> <property name="maxStatements">100</property> <!--maxStatementsPerConnection定義了連接池內(nèi)單個(gè)連接所擁有的最大緩存statements數(shù)。Default: 0 --> <property name="maxStatementsPerConnection"></property> <!--c3p0是異步操作的,緩慢的JDBC操作通過幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能 通過多線程實(shí)現(xiàn)多個(gè)操作同時(shí)被執(zhí)行。Default: 3--> <property name="numHelperThreads">3</property> <!--當(dāng)用戶調(diào)用getConnection()時(shí)使root用戶成為去獲取連接的用戶。主要用于連接池連接非c3p0 的數(shù)據(jù)源時(shí)。Default: null--> <property name="overrideDefaultUser">root</property> <!--與overrideDefaultUser參數(shù)對(duì)應(yīng)使用的一個(gè)參數(shù)。Default: null--> <property name="overrideDefaultPassword">password</property> <!--密碼。Default: null--> <property name="password"></property> <!--定義所有連接測試都執(zhí)行的測試語句。在使用連接測試的情況下這個(gè)一顯著提高測試速度。注意: 測試的表必須在初始數(shù)據(jù)源的時(shí)候就存在。Default: null--> <property name="preferredTestQuery">select id from test where id=1</property> <!--用戶修改系統(tǒng)配置參數(shù)執(zhí)行前最多等待300秒。Default: 300 --> <property name="propertyCycle">300</property> <!--因性能消耗大請(qǐng)只在需要的時(shí)候使用它。如果設(shè)為true那么在每個(gè)connection提交的 時(shí)候都將校驗(yàn)其有效性。建議使用idleConnectionTestPeriod或automaticTestTable 等方法來提升連接測試的性能。Default: false --> <property name="testConnectionOnCheckout">false</property> <!--如果設(shè)為true那么在取得連接的同時(shí)將校驗(yàn)連接的有效性。Default: false --> <property name="testConnectionOnCheckin">true</property> <!--用戶名。Default: null--> <property name="user">root</property> <!--早期的c3p0版本對(duì)JDBC接口采用動(dòng)態(tài)反射代理。在早期版本用途廣泛的情況下這個(gè)參數(shù) 允許用戶恢復(fù)到動(dòng)態(tài)反射代理以解決不穩(wěn)定的故障。最新的非反射代理更快并且已經(jīng)開始 廣泛的被使用,所以這個(gè)參數(shù)未必有用。現(xiàn)在原先的動(dòng)態(tài)反射與新的非反射代理同時(shí)受到 支持,但今后可能的版本可能不支持動(dòng)態(tài)反射代理。Default: false--> <property name="usesTraditionalReflectiveProxies">false</property> <property name="automaticTestTable">con_test</property> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">25</property> <property name="minPoolSize">10</property> <property name="maxStatements">0</property> <user-overrides user="swaldman"> </user-overrides> </default-config> <named-config name="dumbTestConfig"> <property name="maxStatements">200</property> <user-overrides user="poop"> <property name="maxStatements">300</property> </user-overrides> </named-config> </c3p0-config> 最近的一個(gè)項(xiàng)目在Hibernate使用C3P0的連接池,數(shù)據(jù)庫為Mysql。開發(fā)測試沒有問題,在運(yùn)行中每個(gè)一段長的空閑時(shí)間就出現(xiàn)異常:
查看了Mysql的文檔,以及Connector/J的文檔以及在線說明發(fā)現(xiàn),出現(xiàn)這種異常的原因是: Mysql服務(wù)器默認(rèn)的“wait_timeout”是8小時(shí),也就是說一個(gè)connection空閑超過8個(gè)小時(shí),Mysql將自動(dòng)斷開該connection。這就是問題的所在,在C3P0 pools中的connections如果空閑超過8小時(shí),Mysql將其斷開,而C3P0并不知道該connection已經(jīng)失效,如果這時(shí)有Client請(qǐng)求connection,C3P0將該失效的Connection提供給Client,將會(huì)造成上面的異常。 解決的方法有3種:
當(dāng)然最好的辦法是同時(shí)綜合使用上述3種方法,下面就DBCP和C3P0分別做一說明,假設(shè)wait_timeout為默認(rèn)的8小時(shí) DBCP增加以下配置信息:
在配置文件中要寫成 <property name="minPoolSize"><value>1</value></property> 格式 不能寫成 這樣<property name="properties"> </props> </property> c3p0不能完全識(shí)別!! 當(dāng)某個(gè)數(shù)據(jù)庫用戶在數(shù)據(jù)庫中插入、更新、刪除一個(gè)表的數(shù)據(jù),或者增加一個(gè)表的主鍵時(shí)或者表的索引時(shí),常常會(huì)出現(xiàn)ora-00054:resource busy and acquire with nowait specified這樣的錯(cuò)誤。 主要是因?yàn)橛惺聞?wù)正在執(zhí)行(或者事務(wù)已經(jīng)被鎖),所有導(dǎo)致執(zhí)行不成功。 1、用dba權(quán)限的用戶查看數(shù)據(jù)庫都有哪些鎖 select t2.username,t2.sid,t2.serial#,t2.logon_time 如:testuser 339 13545 2009-3-5 17:40:05 2、根據(jù)sid查看具體的sql語句,如果sql不重要,可以kill select sql_text from v$session a,v$sqltext_with_newlines b 查出來的sql,如: begin :id := sys.dbms_transaction.local_transaction_id; end; 3、kill該事務(wù) 4、這樣就可以執(zhí)行其他的事務(wù)sql語句了 如增加表的主鍵: 一、過時(shí)參數(shù)和強(qiáng)調(diào)參數(shù) Oracle數(shù)據(jù)庫中,系統(tǒng)提供了幾個(gè)視圖可以查看系統(tǒng)參數(shù)的情況。視圖V$OBSOLETE_PARAMETER中含有所有的過時(shí)(obsolete)和強(qiáng)調(diào)(underscored)參數(shù)。這里首先說明一下什么是Oracle的過時(shí)(obsolote)和強(qiáng)調(diào)(underscored)參數(shù),過時(shí)參數(shù),顧名思義就是在Oracle以前的版本中存在,但在新版本中已經(jīng)淘汰了的參數(shù),已經(jīng)不再使用;而強(qiáng)調(diào)參數(shù),是指那些在新版本中保留了下來,但是除非特殊需要不希望用戶使用的那些參數(shù)。在視圖V$OBSOLETE_PARAMETER中,包含這些參數(shù)的名稱和一個(gè)標(biāo)志字ISSPECIFIED,該標(biāo)志字用來指出這個(gè)參數(shù)是否在init.ora文件中已實(shí)際設(shè)置。 下面的SQL腳本列出了當(dāng)前系統(tǒng)中所有的過時(shí)參數(shù)名稱以及它們是否在當(dāng)前系統(tǒng)中設(shè)定。
上面談到,Oracle系統(tǒng)并沒有將V$OBSOLETE_PARAMETER視圖中的所有參數(shù)均丟棄,而是將其中的一部分轉(zhuǎn)換為強(qiáng)調(diào)參數(shù),下面就來討論如何查看這些參數(shù)是已被丟棄還是被轉(zhuǎn)換。這可以通過系統(tǒng)視圖X$KSPPO來查看,該視圖中包含一個(gè)名為KSPPOFLAG的字段,用來指明該參數(shù)在當(dāng)前版本中是被丟棄還是被強(qiáng)調(diào),如果該值為1,則表示該參數(shù)已被丟棄,該值為2,則表明該參數(shù)現(xiàn)為強(qiáng)調(diào)參數(shù)。
注:該視圖只在sys用戶下可以看到。 二、隱藏參數(shù) Oracle系統(tǒng)中還有一類參數(shù)稱之為隱藏參數(shù)(hidden parameters),是系統(tǒng)中使用,但Oracle官方?jīng)]有公布的參數(shù),這些參數(shù)可能是那些還沒有成熟或者是系統(tǒng)開發(fā)中使用的參數(shù)。這些參數(shù)在所有Oracle 8i中的_trace_files_public和_lock_sga_areas等等。 下面的查詢可以得到當(dāng)前系統(tǒng)中的所有隱藏參數(shù)(以sys身份登錄):
三、系統(tǒng)當(dāng)前參數(shù) 下面的腳本以英文字母順序列出了系統(tǒng)當(dāng)前使用的所有參數(shù)。在列出的參數(shù)中,如果參數(shù)名稱前面有#這個(gè)符號(hào),則表示該參數(shù)沒有明確指定,采用了系統(tǒng)中的默認(rèn)參數(shù)。一般在一個(gè)新的Oracle版本安裝完成后,首先運(yùn)行該腳本,則可以生成該版本數(shù)據(jù)庫的標(biāo)準(zhǔn)init.ora文件。
注意:上面的SQL腳本沒有列出系統(tǒng)中的隱藏參數(shù) SVRMGR> select * from dba_jobs; 初始化相關(guān)參數(shù)job_queue_processes 1 select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)
SVRMGR> select * from dba_jobs; 初始化相關(guān)參數(shù)job_queue_processes job_queue_interval = 10 //調(diào)度作業(yè)刷新頻率秒為單位
1 select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)
請(qǐng)問我如何停止一個(gè)JOB PL/SQL 過程已成功完成。 啟動(dòng)作業(yè) PL/SQL 過程已成功完成。 停其他用戶的job
exec dbms_job.broken(:job) 停止 把一個(gè)broken job重新運(yùn)行
例如,我們已經(jīng)建立了一個(gè)存儲(chǔ)過程,其名稱為my_job,在sql/plus中以scott用戶身份登錄,執(zhí)行如下命令: 系統(tǒng)提示執(zhí)行成功。
簡單例子 創(chuàng)建測試表 表已創(chuàng)建。 創(chuàng)建一個(gè)自定義過程 過程已創(chuàng)建。 創(chuàng)建JOB PL/SQL 過程已成功完成。 運(yùn)行JOB PL/SQL 過程已成功完成。 SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 時(shí)間 from TEST; 時(shí)間 刪除JOB PL/SQL 過程已成功完成。 =======================================
======================================== 創(chuàng)建一個(gè)過程 提交作業(yè) 運(yùn)行作業(yè) 刪除作業(yè)
DBA_JOBS
在Hibernate中處理批量更新和批量刪除 發(fā)布時(shí)間:2007.08.03 06:06 來源:賽迪網(wǎng) 作者:dxaw 批量更新是指在一個(gè)事務(wù)中更新大批量數(shù)據(jù),批量刪除是指在一個(gè)事務(wù)中刪除大批量數(shù)據(jù)。以下程序直接通過Hibernate API批量更新CUSTOMERS表中年齡大于零的所有記錄的AGE字段: tx = session.beginTransaction(); Iterator customers=session.find("from Customer c where c.age>0").iterator(); while(customers.hasNext()){ Customer customer=(Customer)customers.next(); customer.setAge(customer.getAge()+1); } tx.commit(); session.close(); 如果CUSTOMERS表中有1萬條年齡大于零的記錄,那么Session的find()方法會(huì)一下子加載1萬個(gè)Customer對(duì)象到內(nèi)存。當(dāng)執(zhí)行tx.commit()方法時(shí),會(huì)清理緩存,Hibernate執(zhí)行1萬條更新CUSTOMERS表的update語句: update CUSTOMERS set AGE=? …. where ID=i; update CUSTOMERS set AGE=? …. where ID=j; …… update CUSTOMERS set AGE=? …. where ID=k; 以上批量更新方式有兩個(gè)缺點(diǎn): (1) 占用大量內(nèi)存,必須把1萬個(gè)Customer對(duì)象先加載到內(nèi)存,然后一一更新它們。 (2) 執(zhí)行的update語句的數(shù)目太多,每個(gè)update語句只能更新一個(gè)Customer對(duì)象,必須通過1萬條update語句才能更新一萬個(gè)Customer對(duì)象,頻繁的訪問數(shù)據(jù)庫,會(huì)大大降低應(yīng)用的性能。 為了迅速釋放1萬個(gè)Customer對(duì)象占用的內(nèi)存,可以在更新每個(gè)Customer對(duì)象后,就調(diào)用Session的evict()方法立即釋放它的內(nèi)存: tx = session.beginTransaction(); Iterator customers=session.find("from Customer c where c.age>0").iterator(); while(customers.hasNext()){ Customer customer=(Customer)customers.next(); customer.setAge(customer.getAge()+1); session.flush(); session.evict(customer); } tx.commit(); session.close(); 在以上程序中,修改了一個(gè)Customer對(duì)象的age屬性后,就立即調(diào)用Session的 flush()方法和evict()方法,flush()方法使Hibernate立刻根據(jù)這個(gè)Customer對(duì)象的狀態(tài)變化同步更新數(shù)據(jù)庫,從而立即執(zhí)行相關(guān)的update語句;evict()方法用于把這個(gè)Customer對(duì)象從緩存中清除出去,從而及時(shí)釋放它占用的內(nèi)存。 但evict()方法只能稍微提高批量操作的性能,因?yàn)椴还苡袥]有使用evict()方法,Hibernate都必須執(zhí)行1萬條update語句,才能更新1萬個(gè)Customer對(duì)象,這是影響批量操作性能的重要因素。假如Hibernate能直接執(zhí)行如下SQL語句: update CUSTOMERS set AGE=AGE+1 where AGE>0; 那么以上一條update語句就能更新CUSTOMERS表中的1萬條記錄。但是Hibernate并沒有直接提供執(zhí)行這種update語句的接口。應(yīng)用程序必須繞過Hibernate API,直接通過JDBC API來執(zhí)行該SQL語句: tx = session.beginTransaction(); Connection con=session.connection(); PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGE=AGE+1 " +"where AGE>0 "); stmt.executeUpdate(); tx.commit(); 以上程序演示了繞過Hibernate API,直接通過JDBC API訪問數(shù)據(jù)庫的過程。應(yīng)用程序通過Session的connection()方法獲得該Session使用的數(shù)據(jù)庫連接,然后通過它創(chuàng)建 PreparedStatement對(duì)象并執(zhí)行SQL語句。值得注意的是,應(yīng)用程序仍然通過Hibernate的Transaction接口來聲明事務(wù)邊界。 如果底層數(shù)據(jù)庫(如Oracle)支持存儲(chǔ)過程,也可以通過存儲(chǔ)過程來執(zhí)行批量更新。存儲(chǔ)過程直接在數(shù)據(jù)庫中運(yùn)行,速度更加快。在Oracle數(shù)據(jù)庫中可以定義一個(gè)名為batchUpdateCustomer()的存儲(chǔ)過程,代碼如下: create or replace procedure batchUpdateCustomer(p_age in number) as begin update CUSTOMERS set AGE=AGE+1 where AGE>p_age; end; 以上存儲(chǔ)過程有一個(gè)參數(shù)p_age,代表客戶的年齡,應(yīng)用程序可按照以下方式調(diào)用存儲(chǔ)過程: tx = session.beginTransaction(); Connection con=session.connection(); String procedure = "{call batchUpdateCustomer(?) }"; CallableStatement cstmt = con.prepareCall(procedure); cstmt.setInt(1,0); //把年齡參數(shù)設(shè)為0 cstmt.executeUpdate(); tx.commit(); 從上面程序看出,應(yīng)用程序也必須繞過Hibernate API,直接通過JDBC API來調(diào)用存儲(chǔ)過程。 Session的各種重載形式的update()方法都一次只能更新一個(gè)對(duì)象,而delete()方法的有些重載形式允許以HQL語句作為參數(shù),例如: session.delete("from Customer c where c.age>0"); 如果CUSTOMERS表中有1萬條年齡大于零的記錄,那么以上代碼能刪除一萬條記錄。但是Session的delete()方法并沒有執(zhí)行以下delete語句: delete from CUSTOMERS where AGE>0; Session的delete()方法先通過以下select語句把1萬個(gè)Customer對(duì)象加載到內(nèi)存中: select * from CUSTOMERS where AGE>0; 接下來執(zhí)行一萬條delete語句,逐個(gè)刪除Customer對(duì)象: delete from CUSTOMERS where ID=i; delete from CUSTOMERS where ID=j; …… delete from CUSTOMERS where ID=k; 由此可見,直接通過Hibernate API進(jìn)行批量更新和批量刪除都不值得推薦。而直接通過JDBC API執(zhí)行相關(guān)的SQL語句或調(diào)用相關(guān)的存儲(chǔ)過程,是批量更新和批量刪除的最佳方式,這兩種方式都有以下優(yōu)點(diǎn): (1) 無需把數(shù)據(jù)庫中的大批量數(shù)據(jù)先加載到內(nèi)存中,然后逐個(gè)更新或修改它們,因此不會(huì)消耗大量內(nèi)存。 (2) 能在一條SQL語句中更新或刪除大批量的數(shù)據(jù)。 2、ORACLE安裝路徑為:C:ORANT 含義解釋: 問:什么是NULL? 答:在我們不知道具體有什么數(shù)據(jù)的時(shí)候,也即未知,可以用NULL,我們稱它為空,ORACLE中,含有空值的表列長度為零。 ORACLE允許任何一種數(shù)據(jù)類型的字段為空,除了以下兩種情況: 1、主鍵字段(primary key), 2、定義時(shí)已經(jīng)加了NOT NULL限制條件的字段 說明: 1、等價(jià)于沒有任何值、是未知數(shù)。 2、NULL與0、空字符串、空格都不同。 3、對(duì)空值做加、減、乘、除等運(yùn)算操作,結(jié)果仍為空。 4、NULL的處理使用NVL函數(shù)。 5、比較時(shí)使用關(guān)鍵字用“is null”和“is not null”。 6、空值不能被索引,所以查詢時(shí)有些符合條件的數(shù)據(jù)可能查不出來,count(*)中,用nvl(列名,0)處理后再查。 7、排序時(shí)比其他數(shù)據(jù)都大(索引默認(rèn)是降序排列,小→大),所以NULL值總是排在最后。 使用方法: SQL> select 1 from dual where null=null; 沒有查到記錄 SQL> select 1 from dual where null=''; 沒有查到記錄 SQL> select 1 from dual where ''=''; 沒有查到記錄 SQL> select 1 from dual where null is null; 1 --------- 1 SQL> select 1 from dual where nvl(null,0)=nvl(null,0); 1 --------- 1 對(duì)空值做加、減、乘、除等運(yùn)算操作,結(jié)果仍為空。 SQL> select 1+null from dual; SQL> select 1-null from dual; SQL> select 1*null from dual; SQL> select 1/null from dual; 查詢到一個(gè)記錄. 注:這個(gè)記錄就是SQL語句中的那個(gè)null 設(shè)置某些列為空值 update table1 set 列1=NULL where 列1 is not null; 現(xiàn)有一個(gè)商品銷售表sale,表結(jié)構(gòu)為: month char(6) --月份 sell number(10,2) --月銷售金額 create table sale (month char(6),sell number); insert into sale values('200001',1000); insert into sale values('200002',1100); insert into sale values('200003',1200); insert into sale values('200004',1300); insert into sale values('200005',1400); insert into sale values('200006',1500); insert into sale values('200007',1600); insert into sale values('200101',1100); insert into sale values('200202',1200); insert into sale values('200301',1300); insert into sale values('200008',1000); insert into sale(month) values('200009');(注意:這條記錄的sell值為空) commit; 共輸入12條記錄 SQL> select * from sale where sell like '%'; MONTH SELL ------ --------- 200001 1000 200002 1100 200003 1200 200004 1300 200005 1400 200006 1500 200007 1600 200101 1100 200202 1200 200301 1300 200008 1000 查詢到11記錄. 結(jié)果說明: 查詢結(jié)果說明此SQL語句查詢不出列值為NULL的字段 此時(shí)需對(duì)字段為NULL的情況另外處理。 SQL> select * from sale where sell like '%' or sell is null; SQL> select * from sale where nvl(sell,0) like '%'; MONTH SELL ------ --------- 200001 1000 200002 1100 200003 1200 200004 1300 200005 1400 200006 1500 200007 1600 200101 1100 200202 1200 200301 1300 200008 1000 200009 查詢到12記錄. Oracle的空值就是這么的用法,我們最好熟悉它的約定,以防查出的結(jié)果不正確。 以上來自http://www.cnoug.org/viewthread.php?tid=15087
但對(duì)于char 和varchar2類型的數(shù)據(jù)庫字段中的null和空字符串是否有區(qū)別呢? 作一個(gè)測試: create table test (a char(5),b char(5)); SQL> insert into test(a,b) values('1','1'); SQL> insert into test(a,b) values('2','2'); SQL> insert into test(a,b) values('3','');--按照上面的解釋,b字段有值的 SQL> insert into test(a) values('4'); SQL> select * from test; A B SQL> select * from test where b='';----按照上面的解釋,應(yīng)該有一條記錄,但實(shí)際上沒有記錄 未選定行 SQL> select * from test where b is null;----按照上面的解釋,應(yīng)該有一跳記錄,但實(shí)際上有兩條記錄。 A B SQL>update table test set b='' where a='2'; 未選定行 SQL> select * from test where b is null; A B 測試結(jié)果說明,對(duì)char和varchar2字段來說,''就是null;但對(duì)于where 條件后的'' 不是null。 對(duì)于缺省值,也是一樣的! http://yseraphi.itpub.net/post/720/114646 oEle= document.all.aaa ;//這里有一個(gè)aaa的對(duì)象,但我們不知道它現(xiàn)在長度是多少,所以沒辦法對(duì)它操作.因此,我們要先做判斷長度的過程.如下: if(oEle.length){}else{}; 在兩種情況下,花括號(hào)里面的內(nèi)容寫法也是不一樣的: if(oEle.length){ for(var i = 0 ;i<oEle.length;i++){ oEle[i].value........ } } else{ oEle.value........ }; 但是這樣寫是不是太復(fù)雜了點(diǎn)?而且當(dāng)花括號(hào)里面的代碼比較多的時(shí)候,我們要寫兩遍代碼,暈了先~ 還好有document.getElementsByName()這個(gè)方法.它對(duì)一個(gè)和多個(gè)的處理是一樣的,我們可以用: oEle = document.getElementsByName('aaa')來引用 當(dāng)oEle只有1個(gè)的時(shí)候,那么就是oEle[0],有多個(gè)的時(shí)候,用下標(biāo)法oEle[i]循環(huán)獲取,是不是很簡單? 值得一提的是它對(duì)Name和ID的同樣有效的. 但是它只能應(yīng)用到document對(duì)象.相對(duì)應(yīng)的,還有另一個(gè)方法,可以應(yīng)用的對(duì)象會(huì)更廣一點(diǎn): getElementsByTagName,比如我知道了一個(gè)<DIV ID='aaa'><input/><input/>......</DIV> 我要取DIV里面的所有input,這樣寫就可以了:aaa.getElementsByTagName('INPUT'),這樣就有效的可以和別的DIV(比如說有個(gè)叫bbb的DIV,里面的也是一樣的input)相區(qū)別. 同getElementsByTagName相對(duì)應(yīng),還有一個(gè)document.body.all.tags(),能用這個(gè)方法的對(duì)象比getElementsByTagName要小得多.但比getElementsByName要多. 到這里我們還要提一下getElementById,它也是只有document對(duì)象才能使用,而且返回的是數(shù)組的第一個(gè)元素,呵呵,它的方法名都寫明了是getElement而不是getElements,所以,千萬不要搞渾了. |
![]() |
|
Copyright © 不高興 | Powered by: 博客園 模板提供:滬江博客 |