X-Spirit
Always Beyond the Time
|
|
BlogJava |
首頁 |
發新隨筆 |
發新文章 |
聯系 |
聚合![]() |
隨筆:91 文章:1 評論:65 引用:0 |
然后,在源包節點下創建Spring配置文件applicationContext.xml,選擇如圖所示的幾個命名空間: 選擇完成,然后在Beans節點之間添加如下內容:
3. 配置JPA持久化支持 在服務選項卡中,選擇MySQL數據庫驅動,然后右鍵單擊,選擇連接設置,配置你要使用的數據庫: 數據庫配置完畢,然后回到項目選項卡,右鍵單擊剛創建的項目,選擇新建-->其它-->持久性-->持久性單元 在新建持久性單元對話框中選擇持久性庫為Hibernate,即選擇Hibernate為JPA持久單元的實現,數據庫連接選擇我們剛配置好的MySQL連接。 單擊完成。此時,Hibernate的JPA庫已經被添加到項目的lib目錄下了。包含了基本的Hibernate jar包和Hibernate JPA支持jar包。 注:使用JPA的一個好處就是我們不需要在一個統一的配置文件里羅列所有的實體類,而是可以讓實體管理器自動掃描所有被@Entity注解了的實體類。要實現這種功能,如果項目的JPA實現遷移到TopLink Essential,需要加入下面的配置: 找到項目中的“配置文件”節點,打開persistence.xml文件,調整到XML視圖中,在<provider> </provider>節點后添加: <exclude-unlisted-classes>false</exclude-unlisted-classes> 一行。如果希望使用Hibernate實現,請一定不要加入這一行,否則,您必須將您創建的所有實體類逐一添加到persistence.xml中。 如果要使用Spring提供的JpaTemplate(即實現JpaDaoSupport方式),則回到spring的applicationContext.xml文件,在<beans>節點里面添加:
至此,持久化支持配置完畢。 創建實體類和相應的JPA控制類右鍵單擊項目,選擇新建-->其它-->持久性-->通過數據庫生成實體類,選擇數據庫表: 點擊下一步,輸入合適的包名 下一步,映射選項如下圖所示: 選擇新建-->其它-->持久性-->基于實體類的JPA控制器類,下一步: 添加要生成控制器類的實體類,下一步: 選擇合適的包,然后完成。 后面的配置無非就是將JPA的控制器類寫入Spring的配置文件,然后在AOM的LiteBean中注入這些控制器類,實現數據庫操作以及相應的業務邏輯。 注:解決Spring與Hibernate JPA的沖突: 如上圖所示:選擇工具--> 庫 --> 庫位置-->選擇當前編輯的項目,選中Spring Framework 2.5,然后去掉cglib2.2那個jar包。這個包與Hibernate JPA中的cglib 2.1.3.jar有沖突
文章來源:http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!776.entry
今天發現服務器上的Oracle11g突然登錄不上去了,提示ORA-28002錯誤,說是口令過期。
不當DBA還真不知道Oracle有這神秘功能。 上網上一查,有類似遭遇的朋友在論壇上求助,人家讓他找DBA。汗。。。 好在有的DBA樂于分享,終于找到了解決方案: 1. 用DBA賬戶登錄SQL PLUS。我用的是sysman。 2. 系統會提示口令失效,但是會馬上讓你重置新密碼。 3. 重置之后,進入SQL PLUS控制臺。 4. 查看口令失效用戶的profile文件 SQL>SELECT username,profile FROM dba_users;
EM(Web界面的控制臺):服務器>用戶,查看口令失效的用戶對應的概要文件,這里假設為DEFAULT,下同。 5. 查看對應的概要文件的口令有效期設置 SQL>SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';
EM(Web界面的控制臺):服務 器>概要文件>選擇剛剛查到的概要文件DEFAULT>查看,查看口令下面的有效期值。 6.將口令有效期默認值180天 修改成“無限制”(此項要慎重!除非你真得不想要這個密碼失效的機制!) SQL>ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
EM:服務器>概要文件>選擇剛剛查到的概要文件DEFAULT>編輯>口令,在有效期輸入 或選擇你需要的值,保存。 該參數修改實時生效。 出于數據庫安全性考慮,不建議將PASSWORD_LIFE_TIME值設置 成UNLIMITED,即建議客戶能夠定期修改數據庫用戶口令。 在修改PASSWORD_LIFE_TIME值之前已經失效的用戶,還是需 要重新修改一次密碼才能使用。 SQL>ALTER USER test INDENTIFIED BYpassword
也可以從SQL Developer 里面來修改用戶的密碼,用sysman賬戶登錄以后,找到數據庫中的其他用戶節點,展開,找到你要修改密碼的用戶。然后編輯用戶,對用戶密碼進行重置,如下圖: ![]()
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
內部服務參數配置:
JAVA_OPTS="-server -XX:+UseParNewGC -Xms1024m -Xmx2048m -XX:MaxNewSize=128m -XX:NewSize=128m -XX:PermSize=96m -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:CMSInitiatingOccupancyFraction=1 -XX:+CMSIncrementalMode -XX:MaxTenuringThreshold=0 -XX:SurvivorRatio=20000 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:CMSIncrementalDutyCycleMin=10 -XX:CMSIncrementalDutyCycle=30 -XX:CMSMarkStackSize=8M -XX:CMSMarkStackSizeMax=32M"前端應用參數配置: JAVA_OPTS="-server -Xmx4096m -Xms4096m -Xmn480m -Xss256k -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=8 -XX:CMSFullGCsBeforeCompaction=0
-XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0" 參數說明: -Xmx1280m:設置JVM最大可用內存為1280m。最大可設為3550m。具體應用可適當調整。 -Xms1280m:設置JVM初始內存為1280m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。 -Xmn480m:設置年輕代大小為480m。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。 -Xss256k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。 -XX:PermSize=64m:指定 jvm 中 Perm Generation 的最小值。 這個參數需要看你的實際情況。可以通過jmap 命令看看到底需要多少。 -XX:MaxPermSize=128m:指定 Perm Generation 的最大值 -XX:+UseConcMarkSweepGC:設置并發收集器 -XX:ParallelGCThreads=8:配置并行收集器的線程數,即:同時多少個線程一起進行垃圾回收。此值最好配置與處理器數目相等。 -XX:CMSFullGCsBeforeCompaction=0:由于并發收集器不對內存空間進行壓縮、整理,所以運行一段時間以后會產生“碎片”,使得運行效率降低。此值設置運行多少次GC以后對內存空間進行壓縮、整理。 -XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮。可能會影響性能,但是可以消除碎片。 -XX:SurvivorRatio=8:每個survivor space 和 eden之間的比例。 -XX:MaxTenuringThreshold=7:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代。對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概率。 -XX:GCTimeRatio=19:設置垃圾回收時間占程序運行時間的百分比,公式為1/(1+n)。 -Xnoclassgc:禁用類垃圾回收,性能會有一定提高。 -XX:+DisableExplicitGC:當此參數打開時,在程序中調用System.gc()將會不起作用。默認是off。 -XX:+UseParNewGC:設置年輕代為并行收集。可與CMS收集同時使用。 -XX:-CMSParallelRemarkEnabled:在使用 UseParNewGC 的情況下 , 盡量減少 mark 的時間。 -XX:CMSInitiatingOccupancyFraction=70:指示在 old generation 在使用了 70% 的比例后 , 啟動 concurrent collector。 -XX:SoftRefLRUPolicyMSPerMB=0:每兆堆空閑空間中SoftReference的存活時間。 @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
首先我要感謝aa和Liu Xing幫我發現了我日志中的錯誤。之前比較粗心,把3條SQL語句寫成一樣的了,對于給讀者造成的麻煩,我深表抱歉。
今天我把原文做了修訂,為了對得起讀者對我的關注,我重新深入的研究了這個問題,在后面,我會把來龍去脈寫清楚。 問題: 語句1: Select * from table1 A where A.col1 not in ( select col1 from table2 B )
如果這樣,本來應該有一條數據,結果沒有。 如果我改寫成這樣: 語句2: select * from table1 A where not exists (SELECT * FROM table2 B where B.col1 = A.col1)
結果就正確,有一條數據顯示。 經過一番搜索,原以為是子查詢結果集太大的原因。 后來有網上強人指點:子查詢里面有空集。即子查詢的結果集里面有NULL的結果。 把查詢語句修改成: 語句3: Select * from table1 A where A.col1 not in ( select col1 from table2 B where B.col1 is not null )
果然就查出來了。而且一點不差。。。厲害阿~~~ 下面是針對本文題的分析: 1。 首先來說說Oracle中的NULL。 Oracle中的NULL代表的是無意義,或者沒有值。將NULL和其他的值進行邏輯運算,運算過程中,NULL的表現更象是FALSE。 下面請看真值表:
另外,NULL和其他的值進行比較或者算術運算(<、>、=、!=、+、-、*、/),結果仍是NULL。 如果想要判定某個值是否為NULL,可以用IS NULL或者IS NOT NULL。 2. 再來說說Oracle中的IN。 in是一個成員條件, 對于給定的一個集合或者子查詢,它會比較每一個成員值。 IN功能上相當于 =ANY 的操作,而NOT IN 功能上相當于 !=ALL 的操作。 IN在邏輯上實際上就是對給定的成員集合或者子查詢結果集進行逐條的判定,例如: SELECT * FROM table1 A WHERE A.col1 in (20,50,NULL);
實際上就是執行了SELECT * FROM table1 A WHERE A.col1=20 OR A.col1=50 OR A.col1=NULL;
這樣,根據NULL的運算特點和真值表,我們可以看出,上邊這個WHERE 字句可以被簡化(如果返回NULL則無結果集返回,這一點和FALSE是一樣的)為WHERE A.col1=20 OR A.col1=50
也就是說,如果你的table1中真的存在含有NULL值的col1列,則執行該語句,無法查詢出那些值為null的記錄。再來看看NOT IN。根據邏輯運算關系,我們知道,NOT (X=Y OR N=M) 等價于 X!=Y AND N!=M,那么: SELECT * FROM table1 A WHERE A.col1 not in (20,50,NULL)
等價于SELECT * FROM table1 A WHERE A.col1!=20 AND A.col1!=50 AND A.col1!=NULL
根據NULL的運算特性和真值表,該語句無論前兩個判定條件是否為真,其結果一定是NULL或者FALSE。故絕對沒有任何記錄可以返回。這就是為什么語句1查不到應有結果的原因。當然,如果你用NOT IN的時候,預先在子查詢里把NULL去掉的話,那就沒問題了,例如語句3。 有些童鞋可能要問了:那如果我想把A表里面那些和B表一樣col1列的值一樣的記錄都查出來,即便A、B兩表里面的col1列都包括值為NULL的記錄的話,用這一條語句就沒辦法了嗎? 我只能很遺憾的告訴你,如果你想在WHERE后面單純用IN 似乎不太可能了,當然,你可以在外部的查詢語句中將NULL條件并列進去,例如: SELECT * FROM table1 A WHERE A.col1 in (SELECT B.col1 FROM table2 B) OR A.col1 IS NULL;
3. 最后談談EXISTS。 有人說EXISTS的性能比IN要好。但這是很片面的。我們來看看EXISTS的執行過程: select * from t1 where exists ( select * from t2 where t2.col1 = t1.col1 )
相當于:for x in ( select * from t1 )
loop if ( exists ( select * from t2 where t2.col1 = x.col1 ) then OUTPUT THE RECORD in x end if end loop 也就是說,EXISTS語句實際上是通過循環外部查詢的結果集,來過濾出符合子查詢標準的結果集。于是外部查詢的結果集數量對該語句執行性能影響最大,故如果外部查詢的結果集數量龐大,用EXISTS語句的性能也不一定就會好很多。 當然,有人說NOT IN是對外部查詢和子查詢都做了全表掃描,如果有索引的話,還用不上索引,但是NOT EXISTS是做連接查詢,所以,如果連接查詢的兩列都做了索引,性能會有一定的提升。 當然至于實際的查詢效率,我想還是具體情況具體分析吧。 那么我們不妨來分析一下語句2為什么能夠的到正確的結果吧: 語句2是這樣的: select * from table1 A where not exists (SELECT B.col1 FROM table2 B where B.col1 = A.col1)
實際上是這樣的執行過程: for x in ( select * from table1 A )
loop if (not exists ( select * from table2 B where B.col1 = x.col1 ) then OUTPUT THE RECORD in x end if end loop 由于表A中不包含NULL的記錄,所以,遍歷完表A,也只能挑出表A中獨有的記錄。 這就是為什么語句2能夠完成語句3的任務的原因。 但如果表A中存在NULL記錄而表B中不存在呢? 這個問題請大家自己分析吧。哈哈。有答案了可以給我留言哦。 答案:A表中的NULL也會被查出來。因為select * from table2 B where B.col1 = NULL不返回結果,故 not exists ( select * from table2 B where B.col1 = x.col1 )的值為真。 以上SQL運行結果在MySQL和Oracle上都已經通過。
想從備份的dmp文件中導入某些表的時候,可以用如下imp命令,格式:
imp username/password@本地net服務名 file=xxx.dmp fromuser=xx touser=xx tables=(tablename) username:登陸數據庫的用戶名 password:登陸數據庫的密碼 本地net服務名:連接服務器的本地net服務名 file:你的dmp文件的路徑 fromuser,touser:從一個用戶導入到另外一個用戶 tables:從dmp文件中導入的表名
一、emacs編輯器簡介
emacs編輯器是由C語言和LISP語言編寫的。LISP(鏈表處理語言)是由約翰·麥卡錫在1960年左右創造的一種基于λ演算的函數式編程語言。 我們可以使用LISP來擴展emacs,從而為emacs添加更多的命令。(補:emacs -nw:以命令行的方式來運行emacs,而不啟動GUI界面)
* 其他
2. 回顯區
emacs所提供的這些功能,都是先喚起代表此功能的模式(mode)。emacs的模式,分成主要模式(major mode)與次要模式(minor mode)。每一次只能使用一個主模式,而且主模式是必須要的。在一個主模式下,俄可以搭配一個以上的次要模式。使用次要模式相當于啟用了該次要模式所對應的插件。
* 基本光標控制
* 編輯命令
* 查找與替換
* 文件操作
* 緩沖區
* Dired功能
;;顯示時間
(display-time) ;;顯示行號 (column-number-mode t) (show-paren-mode t) ;;設置TAB寬度為4 (setq default-tab-width 4) ;;以下設置縮進 (setq c-indent-level 4) (setq c-continued-statement-offset 4) (setq c-brace-offset -4) (setq c-argdecl-indent 4) (setq c-label-offset -4) (setq c-basic-offset 4) (global-set-key "\C-m" 'reindent-then-newline-and-indent) (setq indent-tabs-mode nil) (setq standard-indent 4) ;;開啟語法高亮。 (global-font-lock-mode 1) ;;設置默認工作目錄 (setq default-directory "/home/test/source/") ;; 去掉滾動條 (set-scroll-bar-mode nil) ;;關閉開啟畫面 (setq inhibit-startup-message t) (setq indent-tabs-mode t) ;;不產生備份文件 (setq make-backup-files nil) ;;設置自定義變量 (custom-set-variables '(column-number-mode t) '(current-language-environment "UTF-8") '(display-time-mode t) '(ecb-options-version "2.32") '(mouse-1-click-in-non-selected-windows t) '(mouse-drag-copy-region t) '(mouse-yank-at-point t) '(save-place t nil (saveplace)) '(show-paren-mode t) '(transient-mark-mode t)) (custom-set-faces ;;選擇小工具欄圖標 (tool-bar-mode -1)
也可以通過其他方式來開啟shell,例如: 文章來源:http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!826.entry |