這兩天裝了ubuntu系統,然后把整個開發環境都裝到上面了 。 但發現一個很奇怪的問題,hibernate的事務無法會滾,這個問題困擾我好幾天,今天終于解決了,原來mysql有配置有問題。mysql總共有4種存儲方式,MyISAM 是默認存儲方式,但是不支持事務,所以導致了我的問題,只要把默認設置成default-storage-engine=innodb就可以了,當然也可以在每個table創建的時候指定。 希望對碰到此類問題的朋友有所幫助。
今天星期六,放假。
很久沒有雙休日了。
本來想睡個懶覺的,但是到了正常工作時間,還是醒來睡不著了。起來開電腦是我的第一反應,那么多年的電腦和網絡生活讓我有了一種下意識,但是今天這個念頭一閃而過,工作是為了生活,因為我想到了這句話。我們為了工作,而忘記自己的生活應該怎么樣的了。我想我開始去尋找生活還有什么,有爸爸媽媽,有朋友,有痛苦和感動,有無奈和追求,突然發現生活是多么寬廣,原來我把自己局限在工作這個狹窄的空間里了。好好享受我的周末巴。起來給自己弄點東西,拿本自己喜歡的書,一杯咖啡,我喜歡的生活,之一。......
????? 這段時間發生很多的事情,也讓我認識到一些事情。 ????? 羅列一下: ????? 一天早上醒來,我突然產生一個感覺:我沒有那么多的精力去研究那些深奧復雜的it技術細節!這個想法讓我有點發呆 ,一直以來我都是很喜歡這個工作,以極大的熱情投入到研發這個工作中,不知道怎么會產生這樣的想法的。這段時間看了很多資料,也看到自己很多的不足,學的越多,知道自己越不足,難道我在這個無知面前害怕了?還是我的思維中心產生了轉移,因為我在慢慢的考慮往項目管理方面發展。我也搞不清楚了。 ?????? 這兩天在看一本書,《第五項修煉》,很早的書 ,主要講系統的思考方面的。其實去年已經看過,但是只看了前幾章,感覺不好理解,這段時間我又拿起來了,發現里面很多概念和想法,比較容易理解了,而且可以繼續看下去了。我感到很欣喜,這個算不算是一種進步呢?現在每天上班下班,因為是長期出差,平時的活動很少了,朋友接觸也少,感覺有點封閉,我慢慢感到自己的激情在磨損,這個現象終于在我身上體現了 (我居然用了終于這個詞)。進步了,思想在成熟,激情在減少,難道這個是反比的嗎?以我現在的水平無法看清這個問題,等以后慢慢去慢慢弄清楚吧。 ????? 這段時間總的來說不是很快樂,快樂是什么?我有點模糊了,難道就是腦子中的一種蛋白質?還是我想得到的太多,而擁有的太少?這段時間煙抽的有點多,感覺嘴巴不舒服,該收斂一下了,難道是煙抽多了?這段時間喝酒很少,我是一個喜歡喝酒的人,難道是酒的緣故?細細想來,這樣的狀態其實已經很久了。難道是一種必經的過程,我不得而知了。 ????? 今天早上又讓我看到了一句話,工作是為了生活,工作只是生活的一部分。我想我應該重新去理解這句話了,回到我自己喜歡的生活。回的去嗎?不知道,還有半包煙在桌子上,不抽了。抽煙無助與生活和思考。
內容介紹
本書是名著《心靈地圖》的續集。《心靈地圖》從1978年出版以來,連續十多年居于美國最著名的《紐約時報》暢銷書排行榜上,總發行量上千萬冊,在讀者中產生了廣泛的影響和獲得了巨大的認同。 本書為《心靈地圖》添了一個注腳:“人生多變”。每一個人的人生道路都得自己探索,沒有任何絕對的答案可以憑借。但是,我們也不必堅持踽踽獨行,可以向出現在我們生活中任何一種超過我們的力量求助。 在本書中,派克著重談的是“宗教”,但這并不是那種扼殺個人意志的宗教團體所傳播的宗教,而是作為個人信仰追求和靈魂提升的“心靈的宗教”,亦即,本書所宣傳的是一種極其自省的信仰。 本書有助于你避免以偏概全的思考模式,拒絕所有以偏概全的沖動,不要鉆牛角尖去尋找公式或簡單的解答,而開始從多元化的角度思考,崇揚生命的神秘與矛盾,不要因為每一次經驗內在的多重因果關系而惶惑不安,安心去欣賞生命的復雜多變。 愿本書與更多的讀者相遇,共結一段心靈共嗚的緣份!
本書精彩言論選 伊甸園的故事是神話,可是它蘊含著真理,告訴我們害羞是人性的一部分。 任何終生追求心理和心靈成長的人,都可以預防心理上的失調。 我們必須有一點罪惡感,才能在社會中生存。 不恐懼不等于有勇氣;勇氣是你盡管害怕、盡管痛苦,但還是繼續向前。 為自己的極限辯護,你就永遠受制于它們。 治療一個受苦的人最好的法子,并不是設法消除痛苦,而是懷著愿意分享的心坐在他身旁。 愈愿意承擔別人的痛苦,就愈能感受到更多的歡樂。 憤怒有其存在的必要;求生絕對少不了它。 我們必須學習一套復雜的方法,以處理憤怒的情緒。 我們的生活品質就決定于我們所作判斷的品質。 人生一切際遇無非是為了幫助我們靈性的成長。 堅強的意志是人類最大的優點,雖然有了它不一定能擔保成功或善良,但是少了它卻幾乎保證會失敗。 你不能用自己的意志控制意志,因為這樣等于沒有控制。 歸咎游戲也可稱做“要不是因為你”游戲,這是所有婚姻關系中最常見的游戲。 原諒需要正視邪惡,真正的原諒是一個非常困難的過 程,但它也是你維持心里健康一個不可或缺的要素。 你不能因一個人沒有犯的罪而原諒他。只有在確定他有罪以后,才能原諒。 原諒是療傷的必要條件 我們不可忘記任何事。我們做不到真正遺忘,只可能做到真正寬赦。 死亡不僅不剝奪生命的意義,反而是意義的賦與者。 你在跟自己的死亡之秘搏斗的過程中,一定會發現人生的意義。 除非我們能坦然面對自己的死亡、否則就永遠不可能 在生活中找到勇氣和自信。 大多數人其實有能力選擇在何時、何地、以何種方式死去。 要是世界上沒有一件我們愿意為之犧牲生命的事,生命就不完整。 所有的疾病都有心理、心靈、社會、生理的因素。求 生意志能大幅延長壽命,并改善生活的品質。 學習生活一定要面對死亡。因為死亡讓我們記住生命的有限。 如果你罹患嚴重的慢性病,倒不妨檢討一下,自問可 曾做過促使自己生病的事。 如果我們只把死亡當作一場意外,就不僅忽視了大多 數死亡的現實面,也忽視了它的神秘性。 我們遭遇的每一件事,無非是幫助我們學習,而最能 幫助我們學習的就是死亡。 只要我們向前跨出一大步,都會經過否定、憤怒、討 價還價、沮喪、接受的過程。 信仰宗教而能承認死亡的重要性,但然面對死亡,才更勇敢。 漫無節制的自戀是心理與心靈疾病的主要前兆。健全 的心靈生活是一種脫離自戀的漸進成長。 我們對百分之九十的事物的了解還不到百分之一。 我一開始問:“我們不知道什么?”所有我以為已經關 閉的疆域就又重新開放。 我們的知識像一葉扁舟,在無知的大海、神秘的汪洋中漂泊。 現代文化有逃避痛苦的特質,對心理建康并不特別鼓勵。 我們愈能適應現實,生活就愈有意義。 在現實生活里,探究神秘不僅是心理保健的目標也是心靈之旅的目的地。 有人為了逃避神秘而投身宗教,同樣有人為了逃避神秘而投身科學。 迷惑是追尋清晰的第一步,在追尋過程中,你會獲得很多知識。 謙遜就是確實了解自我的真相。真正的謙遜總要與實際相符。 為了生存,我們需要某種程度的罪惡感。要是我們一 直都自以為很好,當然就無法改正有缺點的部分。 我不好,你也不好,不過沒關系。 我們需要破裂時刻,讓我們覺悟到自己有問題,我們并不完美。 罪惡感涌現的時刻、懺悔的時刻、缺乏自信的時刻、面 對自己不喜歡自己的試煉時刻,對我們的成長都是不可或缺。 愛自己,追求自己靈魂的進步,是人生最重要的事。 準備是不能分享的。我們唯一能做的就是盡可能提供別人好好準備的動機。 神話對于了解自我可提供很大幫助,我們可以從中發掘人性的知識。 任何過于簡化的思考方式都會出問題。 神話是有關人性各種矛盾、多重向度、復雜面的一個最佳知識泉源。 人不可能像神一般無所不能,我們不可能靠自己的力量上達于神。 當某種東西擋了你的路,妨礙你的心理健康或心靈成 長,你就該除掉它,不要只是坐著抱怨。 做好事的動機就是創造力的泉源。做壞事的動機只會帶來毀滅,不能創造。 我們只有有學會同時發揮自身的男性和女性特質—— 左腦和右腦并用之后,才能成為英雄。 總有一天我們要放開孩子,他們是上天賜下的禮物,交 給我們照顧——但不是永遠。 人的本性是汁么?我最常給的答復就是,根本沒有這種東西。 我們人類最大的不同,就是在自身行為上享有完全的自由和變通可能。 大多數人當然早已脫離胚胎期。但會隨著年齡增長,更 加堅持自己的方法和本性。 身體的老化不能遇阻,但人的心理不一定要變老。 觸及自身生命的混沌,這可能是人類最痛苦的經驗。 信奉神秘主義的人熱愛神秘,喜歡解開神秘,同時也 知道,解開的愈多,發現的會更多。 處于心靈旅程不同階段的人,相互之間會產生飽受威脅的感覺。 悔改不是一時就結束的事。它跟所有靈性成長一樣,是一種持續不斷的程序。 立足不夠堅定時,固然可能墮落回去,但我們不可能 因此省略心靈成長過程的任何一階段。 關于心靈成長。不論我們發展到多遠,都還會保留一部分早期各階段的痕跡。 每個圣人都有不可告人的過去,每個罪人都有美好的展望。 上癮者有回家的渴望,證明他們比大多數人更努力追 求靈性和上帝,只不過他們搞錯了方向。 西方語言傳統上酒精和靈魂用同一個字表示,并非意 外,也許酗酒者比一般人更渴求靈性。 很多人聽到宗教都會退避三舍,一般人都不久喜歡被 感化而改變,他們有抗拒心理。你唯一改變得了的人就是自己。 每個人都有自己的憂傷與恐懼;也許我們沒有意識到,但這些情緒是存在的。 只有面臨危機時,共同體才會自然發展。 健康心理一大特征就是,及早面對危機的能力。 我們亟須賦與危機應有的尊嚴,只有透過這些痛苦與危機,我們才會成長。 我們的生活太缺乏戲劇味,整日混沌過活,對生命的重要本質毫無覺悟。 不同的人有不同的生存使命,每個人的使命都很獨特 不同的宗教往往殊途同歸,只要能到達同一個目的地, 走不同的路又有什么關系。 只要你認罪、懺侮,那么所有的罪就此滌清。唯一需 要的就是為自己的所作所為。覺得難過、痛苦。 每一個人都應該盡可能從各種宗教傳統中汲取智慧。 不論多么善良的人,都不免偶而因疲倦或過于自信,以至于顯得不夠努力。 用全部的靈魂和全部的力量,全心全意愛你的神。愛如鄰己 學習把自己交給上帝,心甘情愿讓他駕馭我這仍末脫離青春的人生。 或許基督教最大的罪,就是以一種獨特的傲慢或自戀 心態,讓許多基督徒自以為可以量身裁制一個上帝。 我對于凡是號稱足以解釋所有事物的觀念,都采取保留的立場。 身體只是一種限制,我相信靈魂可以不靠肉體存在,它不需要肉體就能進步。 地獄的大門是敝開的,任何人都隨時可以走出去,他 們之所以待在地獄是因為他們選擇不離開。 追求知識最好的方法就是透過經驗。 唯物主義和科學發展帶來一種使人坐立難安的匾乏 感,一種對內在生命的渴望。 分化使事情容易,整合則帶來痛苦。迫不經過整合,一個人永遠是支離破碎。 厘清科學的領域可視為人類智慧史上最重要的事件。 整合的過程需要我們坦然面對各種互相沖突的力量、 觀念,以及生活中的壓力 每當面對一個號稱能解決社會問題的方案,一定要問: “缺少了什么? 佛洛伊德用“愛”與“工作”界定心理健康。 為患恐懼癥的人灌輸比較樂視的世界觀,是唯一的治療辦法。 審慎運用宗教觀念,對于很多精神病例,也有加強療效或加速痊愈的效果。 抑郁源自無禮和不肯贊美別人。 如果父母能溫和的對待孩子,盡可能提供支持,孩子 就能朝脫離自戀邁出一大步。人生就是在你已定好的計劃之外所發生的事。 接受人生層出不窮的矛盾,是心理健康不可或缺的要素。 新時代運動的最大特色,就是對新觀念、新方法采取完全開放的態度。 救贖可以說是一種矛盾的混合,其中有恩典也有努力。 不論我們如何抉擇,其他的選擇并不因此被犧牲、被拋棄。 邪惡跟虛偽有很密切的關系。 從事任何冒險之前,都必須知道如何辨認對健康有益 或有害的事物,心靈旅程當然也不例外。 打好高爾夫球的原則,就是不要以一桿進洞為目標。心靈生活也應是如此。 上帝一方面是我們里面的一個小聲音,但同時也存在 我們外面,無比超越、偉大。 信心若不能化為行動,還有什么價值呢? 我們需要跟自己的極限、自己的支離破碎、以及人際 關系之間無可避免的互相倚賴關系妥協。 新時代運動最大的貢獻也無非是帶來新鮮空氣。 我們應該擺脫競爭和分化,全心追求社會生活和靈性生活各方面的整合。 根據神話的說法,性欲源自有一種不完整感,表現于追求個體完整和神性。 如果你追求最高品質的性高潮,最好的方法就是找自己深愛的人從事性行為。 對沉浸在愛情狂喜里的戀人而言,對方就像通往祭壇 的廟字大門,已經無關重要。 任何以為兩性關系中可以建立永恒羅曼史的人,都注定要失望。 這世界可被當作是一個上帝設計的魔鬼訓練營,其中 最難超越的一項障礙就是性。 性是上天賜與的好禮物,但這不代表它在所有季節,所 有時候都適合所有的人。 我發現了解上帝本質最有意義的方式,就是把人性中 最好的部分投射在他身上。
阮大年
生命的饑渴?????
? 《與心靈對話》是美國著名精神導師派克醫生繼《心靈地圖》(The Road Less Traveled)而寫的續集,顧名思義他所探討的乃是一般人不常去思考的問題,也是一般認為不實際的問題。? ??中國人一向重視實用,也許是中國人的歷史一直是為了生活而努力、奮斗,不得不實際的面對生存問題,在臺灣的這數十年經驗里,果然看到了實用主義的輝煌成果,而使臺灣人民走到任何地方都感到抬頭挺胸、趾高氣昴,甚至表現出不可一世的氣概,只是令人擔心的是,經濟的成就并沒有帶來真正生命的豐盛和愉悅,反而普遍的沉迷與失落。? ??其實臺灣的問題不是偶發的,而是一味追求發達及富足之后的必然因果,一九九二年的《美國新聞與世界報導》雜志中記載︰「近來有一種饑渴,那是源自唯物主義和科學發展而來的,一種使人不安的匱乏感,一種對內在生命的渴望……愈來愈多的人亟于找尋一個從心靈與精神層次出發的答案」。同樣的話可描繪在臺灣的中國人,我們目前心靈的饑渴及精神的苦悶,比當時的美國人可謂有過之而無不及。? ??派克醫生的主張是因應這種饑渴而寫的。? ??人生是由一連串的饑渴而編織成的,一個嬰孩一生下來就饑渴--需要食物及溫情;稍長后又對知識、真理產生饑渴--因此要上學、讀書;有生理及性的饑渴--因此進入婚姻之門;有群居及歸屬的饑渴--因此組織家庭、參加社團;有追求卓越的饑渴--因此努力于求名求利,著書立言等。? ??饑渴感并沒什么不好,而且是使人類努力的原動力,然而吾生也有涯,往往因為忙于解決上述一般的饑渴后,人生也就在解饑止渴的過程中溜走了,而很多人一輩子都沒有體會到生命中有另一種更基本及深邃的饑渴--心靈永恒的需求。? ??圣法蘭西斯有言︰「神啊!我心永遠不得安息(或作永遠在饑渴),直到在你里面。」? ??派克醫生的話,不一定能解除你我心靈中的饑渴,就像他一開始就說的「壞消息--我什么也不知道。」他的目的也不是給我們一個標準答案,雖然他承認已經尋到了自己的答案及方向。? ??派克醫生提醒我們,生命是有限卻又可能是永恒的,我們外在、可見的身體是會變老及消逝,但我們內心已經看見心靈是永存及可以日新又新的,只可惜我們幾乎把一生的精力及時間都去改進和化裝外在的形體,而忽視了對心靈的貫注及追尋。從某方面講,外在努力是可見且容易見效的,也易引人注意,甚至功成名就還可以遺傳給兒女,惠及子孫何樂而不為,反之,對心靈的追尋,是非只存乎一心,別人也體會不到,更不易傳授轉贈,因此在功利的環境中更加不受重視及被忽略了。? ??我推薦這本書,因為它系暮鼓晨鐘,在這個多元卻無目標的社會中發出了一個聲音,「要追求永恒!」、「要自省!」確實,這一代可稱為不多自省的一代,我們每天看到的都是批評、不滿,卻鮮見任何人自省。? ??派克醫生認為人類的心靈有無止境求新求變的獨特能力,這也是孟子所說人之異于禽獸者的「幾希」,而作者認為心靈的成長可大致分為四個階段︰? ??第一階段的人可謂是混沌的心靈,只有生活的過程而沒有明確的人生目標。? ??第二階段的人屬于需要形式才能滿足的心靈,他們倚賴某些形式作為生命意義之所依,這形式可能是宗教、藝術團體,也可能是黨派、社團,他們的特征是強調組織內的形式及教條,而以儀式為最高準則。? ??第三階段的心靈較自由且理性,也許沒有明顯的信仰主題,但都熱心積極正面的參與社會,認為生命的意義在貢獻自己,使世界更美好。? ??第四階段的心靈可以說是第三階段努力尋求后的答案,他們不迷信宗教,卻真正的可以認識上帝,生命中有不能說的真正神秘,也真正能感到天人合一的生命境地。然而這并不是一個目的地,第四階段只是表明真正進入一個有無限發展可能的心靈之旅,也正如基督教所謂的信仰是一條路--來于信,以致于信。? ??無論如何,一個好好接納本書的讀者,對自己心靈的成長都有更高、更深一層的激勵,也能認清自己內心有比目前更進步的可能,正如王爾德所說的︰「每個圣人都有不可告人的過去,每個罪人都能有美好的盼望!」?
王浩威醫師(專欄作家、臺大醫院精神部兼任主治醫師)的導讀
?
原先翻閱派克醫生著的《心靈地圖》時,總有些隨興消遣的意味,畢竟市面有太多「勵志」、「心理」或「心靈」的書籍了,令人覺得翻來翻去,也不過如此。偶爾拾遇了一本令我眼睛一亮的這類書籍,好不容易記住作者的大名,待他的新作出版時便趕快買一本,然而,常常原本抱著極大期待的,卻一次次的失望了。
?
看《心靈地圖》的感覺卻截然不同。躺在床上翻著這本書時,睡意逐漸消失,取而代之的是對作者的好奇。「愛」是談得令人有點厭煩的字眼,而「紀律」則是天生引人反感的,然而在這本書中,一切卻有了重生的定義。
?
對作者而言,寫作的材料原本就是源自實務的臨床經驗。病人或個案所陳述的生命經驗,觸目驚心地引發了他對自己的思考,寫作也就成為另一種自我探索的紀錄。
身為一位擅長精神分析的精神科醫師,在學理訓練的出發點上,他很明顯受到佛洛伊德和榮格的影響。特別是有關自戀的理論,佛洛伊德首先提出了原初自戀和次發自戀,榮格進而將之視為自我完成的必要途徑,也就是除了一般人知道的「自戀人格違常」這類負面陳述以外,其實自戀也有另一種正面的意義呈現。
?
在派克醫師的筆下,這一切學理化為無形,取而代之的是極其平易的舉例和用詞。也因為對這個平易的要求,他毫不畏懼地重新用了一些已經有些俗氣的字詞。這時,「紀律」已經不再是團體對個人的要求,而是來自自我的要求,是自我進行著紀律,而非自我被要求守紀律;同樣的,「愛」也不再是對他人的付出,而是「擴充自我的意愿」,只不過前提是「滋養個人和他人心靈成長」罷了。這是作者極其高明的地方,他用平凡得甚至有點保守的字眼,來暢談他極其進步的觀念。
?
到了《心靈地圖2》這本書,他進而開始談宗教。
?
直到今日,雖然很多人已經不再像馬克思一般強烈排反宗教:但對于社會上各種宗教形式的盛行,不免還是有些擔憂,從書中可以看出,派克醫師也懷有這樣一份隱憂,他敢于拂逆當今盛行的新世紀運動,指出各種盲點和困境,就是典型的例子。
?
然而作者也不忌諱宗教,甚至用信仰來解決宗教的困境。對他而言,宗教是必要的;但他指的是個人信仰的追求,而非宗派團體的遵循。
?
當下的宗教團體往往在無形中扼殺了個人的意志。關于這點,如果用強烈的字眼,便是常見的「宗教法西斯」:如果用派克醫師的說法,就是「秘密教派」。作者不擔心教派的攻擊,甚至提出了它們的十大特征,認為只要符合三、四點就可以了,像對領袖魄力的偶像崇拜、地位崇高的權力核心、行政黑箱作業、隱瞞財務、鼓勵教徒倚賴、強化教徒一致性、特殊語言、武斷的教義、異端邪說或是自認掌握了上帝。他列出了這份標準,幾乎是從新時代運動到傳統的基督教或佛教,全都被擊中要害了。
?
另一方面,他卻是極力陳述個人心靈或個人信仰的重要性,雖是科學訓練出身的精神科醫師,他還是排斥了以科學自居的狹義心理學,從《心靈地圖》到《心靈地圖2》,最大的突破莫過于這種將宗教和心理學融為一體的努力,恐怕是和心理學的人格階段相關;他對個案信仰活動發展出的興趣,特別強調了類似艾瑞克森(Eric Erikson)「認同危機」一般的「信仰危機」。
?
宗教的特殊角色,一種極與自省的信仰,成為本書最大的特色。作者自己也承認,他的受洗是在《心靈地圖》完成之后,《心靈地圖2》是重新信仰以后寫就的。因為宗教和科學(心理學和精神醫學)的兼顧,讓他能看見更廣闊的視野。
?
對于不可知的世界,他永遠保持必要的敬畏,像現象學常說的「劃上括號」(bracketing),也就是「存而不論」;承認它的存在,但暫時不會急著說定它。因為這樣的敬畏,他開始談論密契主義和死亡,甚至認為性愛高潮和性靈經驗有著一定的相關性。
?
如果《心靈地圖》是一本有關自我心理調適和成長的書籍,那么《心靈地圖2》則是自我靈性的修行和解放。這其實是很不容易的一步,然而作者平易而輕松地做到了。
??????? 春節假期結束,也告別了忙碌的2006年,迎來一個還未知的2007。想起2006年初,我給自己定的一些目標,慚愧的是大多數沒有完成,有些還在進行中。但是2006,對我來說也算是個充實的一年,有了很多的第一次,對事情思考比以前深入了,不過也許到了2008回想,現在的思考也是膚淺的,我希望是如此,這樣表示我在進步。
?????? 過去的2006有太多的內容,我也不想去細數了,還是在這里說說2007的目標。
- 作為一個軟件開發人員,我還是一如既往地對新技術、新思想關注,并努力的應用到平時開發工作中去,讓發揮其價值。
- 這一年我會更加關注敏捷管理,對于敏捷的思想和做法,我一直在徘徊在門外,不是猶豫,而是還在找哪扇門,希望今年能有機會能夠在實踐中應用。
- Kent有一句名言,"程序員要取得成功,關鍵在于程序之外的東西"。雖然平時也有這所認識,但是不夠重視,比如溝通能力(特別是口頭溝通和書面正式文檔的編寫)、全面系統思考問題的能力、組織協調能力、策劃推動能力、自我管理和團隊管理能力、工作的規范性和質量意識,等等。這需要我們更用心的去思考、去摸索、去提升,就是要有一個全面的提高。
- 到年底,目標是能達到一個項目經理的水平,要以一個項目經理的要求來衡量自己。
- 工作為了生活!我很喜歡這句話,但是現實和喜歡存在著很大的差距,只能在平時忙碌的工作中努力協調這個矛盾。
- 2006接觸了一些健康方面的知識,人體使用手冊讓我初步了解了人體的奇妙,健康一生讓我認識到飲食的重要性。忙碌的工作往往會把身體搞垮,不規律的飲食,不正常的加班熬夜,我們要怎么來呵護我們的身體呢?是不是工作到不惑之年后就疾病纏身呢?我不想要這樣的生活,2007年我會把一些健康知識應用到實際中來,如果有效,我還會推薦給我的朋友們。這一點也是對第五點的補充。
??????? 春節在家里找到一本以前看過的書,與心靈的對話,還是高中的時候看過這本書,主要說的是人生多變,人生的目標是讓自己的靈性成長,講的非常好。當時對其中講的很有感觸,現在拿起來又讀,猶如第一次讀一樣,引領我對人生的思考,而且比以前讀更加的能理解其中的含義。2007我將細讀這本書,特別在我這個年齡段,現實的沖擊,生活的壓力,導致我們對人生的迷惑。
??????? 2007會帶來什么誰也不知道,也許這就是人生多變,我喜歡這個多變。
??????? 人生就是你計劃之外發生的事情。2007,唯一現在要做的就是保持一種樂觀積極的心態。
???
Quartz作為一個開源的作業調度框架,已經廣泛應用于j2ee中。因為項目需要一個任務管理模塊,所以選擇了Quartz這個強大的框架,并對其進行
了擴展以適應項目的要求。首先介紹一下我們的系統構架,采用webwork,spring,hibernate整合架構,我的任務是無縫的把Quartz
加入到系統,提供一個界面,提供一些操作,使最終用戶能夠自己定義在什么時間對什么東西做哪些事情,“哪些事情”是預先定義的,提供給客戶選擇,這是客戶
需求,系統地要求是能夠容易的擴展,對增加一個新的任務定義提供一些簡單的接口。這里不對Quartz作介紹了,想了解的人參考官方網站:http:
//www.opensymphony.com/quartz/,由于涉及的東西比較多,有些細節就帶過了,我就大致的介紹一下總體的設計。
??? 作業調度框架,主要要解決的問題是在某個時間對某些對象作某些動作。
???
對于某個時間,Quarta提供一個字符表達式來表示,這方面要做的是提供一個方便的界面,直觀的對其進行設置,不能讓最終客戶看那些對客戶沒意義的字符
串。這個工作需要解析那些字符,做起來還是有點意思的,也是比較麻煩的,有興趣的話可以自己去試試。
???
對于某些對象作和某些動作,Quartz都交給程序員自己去定義,它提供一個Job接口,對我們來說增加任務是比較簡單的一件事情.既然Quartz提供
這么簡單的接口,我為什么還要對其進行擴展呢?這就要來看"某些對象"了.在一般的系統來"某個動作"所操縱的對象是固定的,比如定期刪除日至,定期檢查
庫存等.由于系統地特殊性,我們"某個動作"對哪些對象是不確定的,"哪些對象"由我提供一個界面,由最終客戶去決定對一個或多個對象進行操作.
???
這樣就引入了一個范圍的概念,"某個動作"是作用在一定范圍內的,這個范圍就不僅僅是哪些對象了,也可能是時間范圍,比如刪除幾天前的日志信息.到這里對
任務的定義有所改變了,一個任務包括一些范圍也可以說是條件,這個條件不包括觸發點這個條件),一個動作.所以系統中定義了一個IRange接口,范圍的
表示都保存在一個XML字符串,XML字符串的結構和怎么解析都交給具體的子對象,這樣就給了子類的靈活性.
public interface IRange {
??? public Map saveToMap(String strMap);//保存范圍參數
??? public List getResult(Map map);//解析范圍參數,并返回操作對象線程列表
??? public List getViewInfo();取得頁面表示方式,結合了webwork
}
一個任務對應一個IRange的子類,IRange的子類對任務的各種參數范圍,動作進行了實現.接著還加入一個IRangeManager接口,
public interface IRangeManager {
??? public void saveDataMap(Long jobId, String strMap)throws SchedulerException;//保存范圍參數
??? public List getObjects(Map map);//取得對象列表,其中包括了對參數的解析
??? public List getViews(Map map);
}
??? 實現的功能是對范圍進行管理,包括對Quartz的操作,主要一些保存數據庫等的操作,這樣對于增加一個新的Range子類就可以不用知道Quartz了.
??? 這樣因為很多東西都是可配置的,增加了靈活性,對以后任務的添加定義了一些接口,考慮到了擴展性.在設計這個模塊的時候,總的思路是把那些不變的東西都封裝起來,把能變得東西都交給具體的任務了.
上面我只是大致講了一下,由于水平有限,可能講的不是清楚,比較亂,我沒有提供具體的例子,只是提供了一個思路,希望對大家有所幫助,或者你還有更好的設計,請與我聯系.
???
首先介紹一下我們的系統構架,采用webwork,spring,hibernate整合架構,現在引入Quartz框架,Quartz和
hibernate各自擁有的自己數據庫配置和連接池的配置,現在的任務是把兩者用同一套配置.
先談談Quartz,我用的版本是1.5.1,后面的版本我沒去看了,沒時間,接下來說的都以這個版本為準.Quartz雖然在提供一個
ConnectionProvider接口,提供給程序擴展,但是看它的StdSchedulerFactory實現類,要對它進行擴展還是一件比較麻煩
一件事情,所以我就直接修改了StdSchedulerFactory類,以達到的我的需求.
接下來的問題是既然要結合,那么讓Quartz來提供連接池配置呢還是有Hibernate提供.研究了兩者的連接池方面的源代碼,發現
Hibernate的連接池設計遠遠好于Quartz,Quartz目前只提供一個連接池提供類PoolingConnectionProvider,而
且使用的連接池是dbcp,這個連接池聽說問題多多,相反hibernate提供了更加靈活的配置,所以連接池由Hibernate提供.
??? 首先實現一個Quartz中ConnectionProvider子類HibernateConnectionProvider
public class HibernateConnectionProvider implements ConnectionProvider {
??? private Connection con = null;
??? protected static ThreadLocal hibernateHolder = new ThreadLocal();
??? public Connection getConnection() throws SQLException {
??? ??? con = null;
??? ??? SessionFactoryImpl sessionFactory = null;
??? ??? sessionFactory = (SessionFactoryImpl) Global.getSessionFacotry();
??? ??? con = sessionFactory.getConnectionProvider().getConnection();
??? return con;
}
public void shutdown() throws SQLException {
??? // FIXME Auto-generated method stub
}
}
,然后修改StdSchedulerFactory,在不破壞其本來的邏輯和可配置性下進行了相應的修改.修改的是private Scheduler
instantiate() throws SchedulerException方法,找到//Set up any
DataSources段進行修改,代碼如下:
String[] dsNames = cfg.getPropertyGroups(PROP_DATASOURCE_PREFIX);
??? ??? for (int i = 0; i < dsNames.length; i++) {
??? ??? ??? PropertiesParser pp = new PropertiesParser(cfg.getPropertyGroup(
??? ??? ???
??? ??? PROP_DATASOURCE_PREFIX + "." +
dsNames[i], true));
??? ??? ??? String dsDriver = pp
??? ??? ???
??? ???
.getStringProperty(PROP_DATASOURCE_DRIVER, null);
??? ??? ??? String dsURL = pp.getStringProperty(PROP_DATASOURCE_URL, null);
??? ??? ??? boolean dsAlwaysLookup = pp.getBooleanProperty(
??? ??? ???
??? ???
PROP_DATASOURCE_JNDI_ALWAYS_LOOKUP, false);
??? ??? ??? String dsUser = pp.getStringProperty(PROP_DATASOURCE_USER, "");
??? ??? ??? String dsPass = pp.getStringProperty(PROP_DATASOURCE_PASSWORD, "");
??? ??? ??? int dsCnt = pp.getIntProperty(PROP_DATASOURCE_MAX_CONNECTIONS, 3);
??? ??? ??? String providerClass = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_PROVIDER_CLASS,
null);
??? ??? ??? String dsJndi = pp
??? ??? ???
??? ???
.getStringProperty(PROP_DATASOURCE_JNDI_URL, null);
??? ??? ??? String dsJndiInitial = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_JNDI_INITIAL,
null);
??? ??? ??? String dsJndiProvider = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_JNDI_PROVDER,
null);
??? ??? ??? String dsJndiPrincipal = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_JNDI_PRINCIPAL,
null);
??? ??? ??? String dsJndiCredentials = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_JNDI_CREDENTIALS,
null);
??? ??? ??? String dsValidation = pp.getStringProperty(
??? ??? ???
??? ??? PROP_DATASOURCE_VALIDATION_QUERY,
null);
??? ??? ??? if (providerClass == null
??? ??? ??? ??? ??? || providerClass.equals("")
??? ??? ??? ??? ??? || providerClass
??? ??? ???
??? ??? ???
???
.equals("org.quartz.utils.PoolingConnectionProvider")) {
??? ??? ??? ??? if (dsDriver == null) {
??? ??? ???
??? ??? initException = new
SchedulerException(
??? ??? ???
??? ??? ???
??? "Driver not specified for DataSource: "
??? ??? ???
??? ??? ???
??? ??? ??? + dsNames[i]);
??? ??? ??? ??? ??? throw initException;
??? ??? ??? ??? }
??? ??? ??? ??? if (dsURL == null) {
??? ??? ???
??? ??? initException = new
SchedulerException(
??? ??? ???
??? ??? ???
??? "DB URL not specified for DataSource: "
??? ??? ???
??? ??? ???
??? ??? ??? + dsNames[i]);
??? ??? ??? ??? ??? throw initException;
??? ??? ??? ??? }
??? ??? ??? ??? try {
??? ??? ???
??? ??? PoolingConnectionProvider cp =
new PoolingConnectionProvider(
??? ??? ???
??? ??? ???
??? dsDriver, dsURL, dsUser, dsPass, dsCnt,
??? ??? ???
??? ??? ???
??? dsValidation);
??? ??? ???
??? ??? dbMgr =
DBConnectionManager.getInstance();
??? ??? ???
??? ???
dbMgr.addConnectionProvider(dsNames[i], cp);
??? ??? ??? ??? } catch (SQLException sqle) {
??? ??? ???
??? ??? initException = new
SchedulerException(
??? ??? ???
??? ??? ???
??? "Could not initialize DataSource: " + dsNames[i],
??? ??? ???
??? ??? ???
??? sqle);
??? ??? ??? ??? ??? throw initException;
??? ??? ??? ??? }
??? ??? ??? } else if (providerClass
??? ??? ???
??? ???
.equals("org.quartz.utils.JNDIConnectionProvider")) {
??? ??? ??? ??? Properties props = null;
??? ??? ??? ??? if (null != dsJndiInitial || null != dsJndiProvider
??? ??? ???
??? ??? ??? || null !=
dsJndiPrincipal || null != dsJndiCredentials) {
??? ??? ??? ??? ??? props = new Properties();
??? ??? ??? ??? ??? if (dsJndiInitial != null)
??? ??? ???
??? ??? ???
props.put(PROP_DATASOURCE_JNDI_INITIAL, dsJndiInitial);
??? ??? ??? ??? ??? if (dsJndiProvider != null)
??? ??? ???
??? ??? ???
props.put(PROP_DATASOURCE_JNDI_PROVDER, dsJndiProvider);
??? ??? ??? ??? ??? if (dsJndiPrincipal != null)
??? ??? ???
??? ??? ???
props.put(PROP_DATASOURCE_JNDI_PRINCIPAL,
??? ??? ???
??? ??? ???
??? ??? dsJndiPrincipal);
??? ??? ??? ??? ??? if (dsJndiCredentials != null)
??? ??? ???
??? ??? ???
props.put(PROP_DATASOURCE_JNDI_CREDENTIALS,
??? ??? ???
??? ??? ???
??? ??? dsJndiCredentials);
??? ??? ??? ??? }
??? ??? ???
??? JNDIConnectionProvider cp = new
JNDIConnectionProvider(dsJndi,
??? ??? ???
??? ??? ??? props,
dsAlwaysLookup);
??? ??? ??? ??? dbMgr = DBConnectionManager.getInstance();
??? ??? ??? ??? dbMgr.addConnectionProvider(dsNames[i], cp);
??? ??? ??? } else if (providerClass
??? ??? ???
??? ???
.equals("org.quartz.utils.HibernateConnectionProvider")) {
??? ??? ???
??? HibernateConnectionProvider cp = new
HibernateConnectionProvider();
??? ??? ??? ??? dbMgr = DBConnectionManager.getInstance();
??? ??? ??? ??? dbMgr.addConnectionProvider(dsNames[i], cp);
??? ??? ??? } else {
??? ??? ??? ??? initException = new SchedulerException(
??? ??? ???
??? ??? ???
"Provider_Class not Supported: " + providerClass);
??? ??? ??? ??? throw initException;
??? ??? ??? }
??? ??? }
??? 最后就是修改配置文件quartz.properties,加入
#org.quartz.dataSource.myDS.provider_class = org.quartz.utils.JNDIConnectionProvider
#org.quartz.dataSource.myDS.provider_class = org.quartz.utils.PoolingConnectionProvider
org.quartz.dataSource.myDS.provider_class = org.quartz.utils.HibernateConnectionProvider加#的供參考.
??? 經過測試,需要對hibernate連接池的一些參數進行微調,這樣就完成了Quartz與Hibernate在數據庫的連接方面的結合,如果有更好的解決方案,請聯系我.
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
常用鏈接
留言簿(6)
隨筆分類
隨筆檔案
文章檔案
相冊
我關注的文章
我聽的音樂
我瀏覽的網站
我的好友
我看的書
我看社會
搜索
最新評論

閱讀排行榜
評論排行榜
|
|