取福島核一燃料棒 預計後年展開需10年

摘錄自2019年12月2日公視報導

日本福島核一廠發生核能災變事故,即將屆滿九年。雖然說日本政府已經決定廢爐,但因為技術問題,時間表一改再改。專家會議在今(2日)做出第五次修正,預估從2021年展開,要花10年完成核燃料棒等殘骸的取出工作。至於正式廢爐,預估是2041到2051年間才能完成。

2011年3月11號受到東北大地震與海嘯影響、而發生的福島核電廠災變事故,六個反應爐當中,1號機到3號機發生爐心熔毀的狀況,但事故後連同當時也在運轉中的4號機,都在事故後立即停止運轉,並於隔年2012年的4月19號永久停機。至於事故當時正在檢修的5號與6號機,則是到2014年1月31號永久停機。

將近九年來,除了三不五時傳出放射性汙水外流,以及東京電力公司面對的各種賠償訴訟,日本政府也多次召開專家會議,研商福島核一廠廢爐的時間與程序。日本媒體的報導指出,廢爐過程中最大的困難,就是如何取出熔毀的核燃料殘骸。

福島核一廠廢爐委員會委員長宮野廣說:「廢爐過程中最需要注意的,就是放射性廢棄物飛散的問題。如何找出不發生輻射廢料飛散的工法,是首要解決的技術課題。」

另外,取出核燃料殘骸的前置作業,將由機器人先進入反應爐採集樣本。2號的專家會議決定,為了慎重起見,在派遣機器人之前,要先製作模擬現場的模型,讓操作人員更熟悉機器人在反應爐內的運作,因此,正式的作業將從2021年開始。這也是廢爐相關時間表第五次的修正。

整個核燃料棒移除的工作,預計在2031年告一段落。後續的廢爐相關作業,將視情況於2041年到2051年完成。也就是說,從福島核能災變到核一廠完成廢爐,花費的時間長達30到40年。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

儲電技術與成本 抑制印度煤電成長的關鍵 | 解讀《 2019年世界能源展望》報告2/3

環境資訊中心外電;姜唯 翻譯;林大利 審校;稿源:Carbon Brief 前言:國際能源署(IEA)11月13日發表2019年《世界能源展望》報告。810頁報告的特點在於「承諾政策情境」(Stated Policies Scenario, STEPS),反映政府已經說出口的政策的效果──風能和太陽能的激增將使再生能源滿足全球能源需求的大部分成長。但是煤炭的平穩發展,加上對石油和天然氣的需求不斷增加,全球排放量在到2040年的展望期內將繼續上升。 相對地,報告的「永續發展情境」(Sustainable Development Scenario, SDS)描繪出有50%機率將升溫限制在1.65°C內所需的條件,IEA表示這是「完全符合巴黎協定」的情況──SDS需要投資「大量重新分配」,從化石燃料轉向效率和再生能源、淘汰全球約一半的燃煤電廠,以及全球經濟的其他變化。

二氧化碳排放量

()在STEPS之下,全球來自能源的碳排放量將在2018年創紀錄後繼續上升,本世紀很可能升溫2.7°C以上。 下表中的黑色虛線表示此排放軌跡。

相反地,SDS(紅色粗線)之下碳排迅速下降,比2010年還下降17%,2040年下降48%,2050年下降68%。IEA說,如此可在2070年實現淨零排放,並且有50%的機會將升溫限制在1.65°C,或66%的機會停在1.8°C。

這條軌跡的積極度比大多數1.5°C途徑要低,升溫沒有或是僅一小段時間超標(下圖中的黃線)。 政府間氣候變遷專門委員會(IPCC)在其1.5°C特別報告中表示,1.5°C途徑需要在2030年將碳排降至2010年水平的45%,並在2050年達到淨零。

過去(實線)和未來各種不同情境下,來自能源和工業的全球二氧化碳排放量:IEA STEPS(黑色虛線)、IEA SDS(粗紅線)、IPCC升溫1.5℃內途徑,沒有或有限的升溫度超標(細黃線)、IPCC升溫超過1.5C途徑(藍色)以及IPCC升溫2C途徑(灰色)。低於零的值表示負排放,即來自能源和工業的二氧化碳增加量少於移除量,這裡主要是指有碳捕獲和儲存(BECCS)的生物能。資料來源:國際能源署《 2019年世界能源展望》和Carbon Brief對IPCC 1.5℃暖化特別報告的簡要分析。圖片由Carbon Brief用Highcharts繪製。

根據IEA資料,SDS「使全球氣溫上升控制在遠低於2°C……並力求控制在1.5°C以內,完全符合《巴黎協定》目標」。還提供了兩種表現可以超越SDS,同時升溫保持在1.5°C以下的選擇。

「力求」不一定是實現目標,而是朝著目標前進,或者是非常接近1.5°C-只要有額外的行動。

除了WEO中心觀點STEPS外,巴黎協定中所謂的「非常接近」也是飽受非政府組織、科學家、商業團體和其他組織批評的語言。他們今年四月寫信呼籲IEA模擬出有66%機率將升溫限制在1.5°C的情境。

這封信的其中一位作者、倫敦帝國理工學院格蘭瑟姆研究所氣候變遷和環境講師羅傑爾(Joeri Rogelj)博士說,SDS和1.5°C不一致,和《巴黎協定》也有些面向不同。

羅傑爾是IPCC 1.5°C特別報告第二章的協調主要作者,也是IPCC即將發布的第六次評估報告中第一工作組的主要作者。

他告訴Carbon Brief,巴黎協定的「力求1.5°C」至少有兩種可能的解釋,一種是將峰值升溫限制在1.5°C,另一種是可以超過再降回。「把錯過目標納入計畫當中,不能合理解釋成完全符合《巴黎協定》,」羅傑爾說。

他還指出了協定的第4條,致力於在人為碳排放源與所有溫室氣體匯之間達到「平衡」。要實現這個目標可能需要淨負​碳排​,SDS沒有達成這一點的詳細途徑。

負碳排可以透過技術解決方案實現,如帶有碳捕集與封存的生物能源(BECCS),也可透過自然氣候解決方案達成,如綠化。

IEA表示,負排放確實是SDS之下達成1.5°C的一種方法,總共需要清除大約3000億噸的二氧化碳(GtCO2)才能彌補這個差距。然而IEA也承認,大規模部署負碳排設備的永續性和可交付性的確存在隱憂。

WEO說:

考慮到負排放技術的問題,構建一個超越SDS、2050年實現零碳排放,並有50%的機率將升溫限制在1.5°C,而無需依賴淨負碳排的情境是有可能的。

(這個情境已經有人做出,收錄在IPCC的1.5°C報告和上圖中。)

IEA表示,要超越SDS,全世界必須正面對抗那些最困難的領域,如航空、重工業和建築供熱,包括全面性的建築改造、工業過程新技術的開發和改造。

IEA表示,這「不只是擴大SDS中的變革而已」,而是要「面對非常困難且難以克服的挑戰」,有一些領域需要社會大眾的接受度和行為改變:

「這不是能源業內部就能做到的事,而是整個社會的任務……需要跨非常多領域進行大規模變革,這將直接影響幾乎每個人的生活。」

雖然有點挑戰性,但如果IEA能建構出1.5°C情境,政策規劃人員可以參考IEA模型來瞭解各種能源和氣候選擇。隨著各國政府根據《巴黎協定》重新考慮其氣候承諾,並在2020年推出新一輪的國家自主減排計畫,這個參考資料將顯得很重要。

煤炭的變化

報告內有去年版本至今的各種變動,反映相對於基準年的變化-2018年需求增加力道異常強勁-以及新增或修訂的政策。

IEA再次下調了STEPS下的煤炭需求前景,如下圖所示(紅線)。但是煤炭近期前景提高了,部分原因是中國重新依賴高污染產業來支撐增長緩慢。

全球煤炭需求歷史(黑線,百萬噸石油當量)和IEA前一版中心觀點情境的未來成長(藍色色塊)。今年的STEPS以紅色標示,SDS以黃色標示。資料來源:國際能源署《 2019年世界能源展望》和前一版報告。Carbon Brief使用Highcharts繪製。

照STEPS的計畫和政策,儘管近期需求有所增長,今年燃煤用量將會低於2014年的峰值,但仍遠高於SDS之下、暖化遠低於2°C途徑的水準(上圖黃線)。

STEPS之下,美國和歐盟等已開發經濟體煤炭用量快速下降,但印度需求增長是保持全球煤炭用量穩定的關鍵因素之一。

印度這波成長的部分原因是大量新火力發電廠興建中,到2040年將打造出232GW的容量,成長一倍,佔全球新增容量的1/3。

IEA表示,如果電池儲存成本的下降速度快於預期,印度的煤電容量成長將被「大幅削減」。 IEA表示,太陽能和廉價的儲存技術可以「重塑印度電力結構的演變」,並提供「非常引人注目的經濟和環境主張」。

印度的高壓電塔。照片來源: 。

值得注意的另一點是,印度目前燃煤容量只有85GW,IEA預計的新燃煤容量卻高達232GW,其中有1/4已經被凍結多年。

自2010年以來,由於廉價再生能源的競爭、公用事業公司財務困境和公眾的反對,有額外510GW的新煤電廠計畫被取消。

此外,印度政府一再高估了電力需求的增長,現有煤電容量的運行時間不到2/3。2019年至今的數據顯示,印度煤炭發電量可能正在下降。

印度政府最近宣布了一個相當積極的目標,太陽能、風能和生質能的容量要達到450GW,最快2030年達成。IEA的STEPS到2030年僅增加344GW。根據近期Carbon Brief的分析,如果能夠達到這個目標,那麼風能、太陽能和其他低碳能源可以在不增加新煤電的情況下,滿足日益增長的需求。(2/3,未完待續)

‘Profound shifts’ underway in energy system, says IEA World Energy Outlook (2/3) by Simon Evans

CO2 emissions

In the STEPS, global CO2 emissions from energy would continue to rise from the they reached in 2018, putting the world on track for upwards of 2.7C of warming this century. This emissions trajectory is shown with the dashed black line in the chart, below.

In contrast, CO2 declines quickly in the SDS (thick red line) to 17% below 2010 levels by 2030, 48% by 2040 and 68% by 2050. According to the IEA, this is “on course for net-zero emissions by 2070” and corresponds to a 50% likelihood of limiting warming to 1.65C, or a 66% chance of 1.8C.

This trajectory is less ambitious than most pathways to 1.5C with no or limited overshoot (yellow lines, below). In its on 1.5C, the (IPCC) said this would need CO2 to fall 45% below 2010 levels by 2030 and to net-zero by 2050.

Global CO2 emissions from energy and industrial processes in the past (solid black line) and under a range of different scenarios for the future: IEA STEPS (dashed black); IEA SDS (thick red line); IPCC pathways limiting warming to 1.5C this century with no or limited temperature overshoot (thin yellow lines); pathways to 1.5C with high overshoot (blue); and IPCC 2C pathways (grey). Values below zero indicate negative emissions, where residual CO2 from energy and industry is more than offset by removals, here primarily bioenergy with carbon capture and storage (BECCS). Source: IEA and Carbon Brief analysis of the for the IPCC of warming. Chart by Carbon Brief using .

According to the IEA, the SDS charts “a path fully aligned with the by holding the rise in global temperatures to ‘well below 2C…and pursuing efforts to limit [it] to 1.5C’”. It also offers two options for going beyond the SDS to keep warming below 1.5C.

This form of words implies either that “pursue” means to head towards a goal, without necessarily reaching it, or that the SDS is aligned with 1.5C – so long as it is accompanied by additional action.

Along with the WEO’s central focus on the STEPS pathway, the statement on Paris “alignment” is at the heart of from a group of NGOs, scientists, business groups and others. In an , they called for the IEA to develop a scenario with a 66% chance of limiting warming to 1.5C.

One of the letter’s authors, , a lecturer in climate change and the environment at the , says the SDS is “inconsistent with 1.5C and several aspects of the Paris Agreement”.

Rogelj was a coordinating lead author on chapter two of the IPCC and is a for working group one on the IPCC’s forthcoming .

He tells Carbon Brief that there are at least two potential interpretations of the Paris ambition to “pursue efforts towards 1.5C”. One is that of limiting peak warming to 1.5C and the other is overshooting this level before returning below 1.5C, Rogelj says: “Planning to simply miss it is not a reasonable interpretation for a scenario that wants to be fully aligned with the Paris Agreement.”

He also points to of the deal, which commits to reaching a “balance” between human sources and sinks of all greenhouse gases. This goal is likely to require net-negative CO2, for which the SDS provides no detailed pathway.

Negative CO2 emissions could be provided via , such as (BECCS), or using “”, such as afforestation.

The IEA says that negative emissions do indeed offer one way that the SDS could become aligned to a 1.5C limit. A cumulative total of around 300bn tonnes of CO2 (GtCO2) would need to be removed to bridge this gap, it adds. There are over the sustainability and deliverability of such extensive deployment, however, and these are acknowledged by the IEA.

The WEO says:

“[I]t would be possible in the light of concern about [negative emissions technologies] to construct a scenario that goes further than the Sustainable Development Scenario and delivers a 50% chance of limiting warming to 1.5C without any reliance on net-negative emissions on the basis of a zero carbon world by 2050.”

[Other groups have developed a limited of that already do this, which are included in the IPCC’s and the figure above.]

To go beyond its SDS, the IEA says the world would need to tackle “hard to abate” sectors, such as aviation, heavy industry and heat for buildings. This would include near-universal building retrofits and the development and retrofitting of new technologies for industrial processes.

The IEA says this “would not amount to a simple extension” of the changes in the SDS, instead “pos[ing] challenges that would be very difficult and very expensive to surmount.” It adds that tackling some of these areas would require social acceptance and behavioural change:

“This is not something that is within the power of the energy sector alone to deliver. It would be a task for society as a whole…Change on a massive scale would be necessary across a very broad front, and would impinge directly on the lives of almost everyone.”

If the IEA were to develop a 1.5C scenario, despite the challenges it would present, then the agency’s modelling could be used by policymakers to inform their energy and climate choices. Such guidance would be pertinent as governments reconsider their climate pledges under the Paris Agreement, with a fresh round of “” due in 2020.

Coal changes

The outlook includes various changes since last year’s edition, reflecting shifts in the base year – there was growth in demand in 2018 – and new or amended policy.

As a result, the IEA has once again revised down its outlook for coal demand in the central STEPS pathway, as the chart below shows (red line). However, it has also raised its near-term outlook for coal, in part due to China’s renewed industries to prop up flagging growth.

Historical global coal demand (black line, millions of tonnes of oil equivalent) and the IEA’s previous central scenarios for future growth (shades of blue). This year’s STEPS is shown in red and the SDS is in yellow. Source: IEA and previous editions of the outlook. Chart by Carbon Brief using .

Despite the near-term increase in expected demand, this year’s outlook affirms that coal use would remain below the global peak reached in 2014, if stated plans and policies are met as per the STEPS. Nevertheless, this would leave coal demand significantly above the level in its SDS, where warming is limited to well-below 2C (yellow line, above).

According to the STEPS, rising is one of the key factors holding global coal use steady, despite rapid falls in developed economies, such as the US and EU.

Part of the reason for this increase in India is a large expected buildout of new coal-fired power stations, with 232GW of capacity built by 2040 in the STEPS, roughly doubling its and accounting for a third of global additions.

The IEA says India’s coal capacity growth could be cut “sharply”, if declines in the cost of battery storage are faster than expected. Solar and cheap storage could “reshape the evolution of India’s power mix”, the IEA says, offering a “very compelling economic and environmental proposition”.

It is also worth comparing the 232GW of new coal capacity expected by the IEA, with India’s current pipeline of , of which a quarter has been frozen in construction for years.

Another 510GW of new coal has been cancelled since 2010 due to competition from cheaper renewables, financial distress at utility firms and public opposition.

In addition, the Indian government has electricity demand growth, meaning existing coal capacity is running less than two-thirds of the time. Moreover, data for 2019 to date suggests India’s electricity .

The Indian government recently a highly ambitious target for solar, wind and biomass capacity to reach 450GW, potentially as soon as 2030, when the IEA STEPS outlook sees just 344GW having been added. If this target is met, then wind, solar and other low-carbon sources could largely meet rising demand without new coal, according to recent .

※ 全文及圖片詳見:()

作者

如果有一件事是重要的,如果能為孩子實現一個願望,那就是人類與大自然和諧共存。

於特有生物研究保育中心服務,小鳥和棲地是主要的研究對象。是龜毛的讀者,認為龜毛是探索世界的美德。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

※別再煩惱如何寫文案,掌握八大原則!

今年較工業化前高1.1度 2010年代將成最熱10年

摘錄自2019年12月3日中央通訊社報導

聯合國世界氣象組織(WMO)今天(3日)發表年度評估報告指出,氣候變遷已超出人類適應能力,今年(2019年)以來全球氣溫較工業革命前均溫高出攝氏1.1度,即將成為史上最熱10年。

世界氣象組織說,2019年可能成為歷來最熱的前3年。燃燒化石燃料、建造基礎設施、種植作物及運送產品等造成的人為排放,將讓今年打破大氣中二氧化碳濃度紀錄,地球勢必會進一步升溫。

海洋負責吸收溫室氣體新增的9成熱量,讓全球海水溫度也達歷史新高,如今海水也比150年前酸25%,威脅數以十億計民眾賴以維生的重要海洋生態系統。在格陵蘭過去12個月融冰3290億公噸助長下,全球平均海平面高度於去年10月達到歷來新高。

隨著過去40年的每10年都比前10年還熱,氣候變遷不只是未來世代要面臨的問題,因為人類無節制的慾望與不計代價的消費,已讓數以百萬計民眾身受其害。報告中說,今年上半年有超過1000萬人在自己國家內流離失所,其中700萬人直接受到諸如風暴、洪水及乾旱等極端氣候影響。世界氣象組織說,因極端氣候新增的無家可歸人口,到今年底可能增至2200萬人。

世界氣象組織秘書長塔拉斯(Petteri Taalas)表示:「2019年再度發生天氣及氣候相關風險重創事件。百年一遇的熱浪及水災變得愈來愈常發生。」

在只比工業革命前均溫高出攝氏1.1度的今年,歐洲、澳洲與日本已相繼出現致命熱浪,還有超級風暴重創非洲東南部,加州和澳洲也有失控野火肆虐。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

承諾氣候行動 裴洛西率國會代表團反對川普:美國還在

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

※別再煩惱如何寫文案,掌握八大原則!

01-MyBatis啟動流程分析

目錄

MyBatis簡單介紹

MyBatis是一個持久層框架,使用簡單,學習成本較低。可以執行自己手寫的SQL語句,比較靈活。但是MyBatis的自動化程度不高,移植性也不高,有時從一個數據庫遷移到另外一個數據庫的時候需要自己修改配置。

一個Mybatis最簡單的使用列子如下:

public class UserDaoTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp() throws Exception{
        ClassPathResource resource = new ClassPathResource("mybatis-config.xml");
        InputStream inputStream = resource.getInputStream();
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void selectUserTest(){
        String id = "{0003CCCA-AEA9-4A1E-A3CC-06D884BA3906}";
        SqlSession sqlSession = sqlSessionFactory.openSession();
        CbondissuerMapper cbondissuerMapper = sqlSession.getMapper(CbondissuerMapper.class);
        Cbondissuer cbondissuer = cbondissuerMapper.selectByPrimaryKey(id);
        System.out.println(cbondissuer);
        sqlSession.close();
    }

}
  • 從配置文件(通常是XML文件)得到SessionFactory;
  • 從SessionFactory得到SQLSession;
  • 通過SqlSession進行CRUD和事務的操作;
  • 執行完相關操作之後關閉Session。

啟動流程分析

本博客只涉及創建SessionFactory,以及從SessionFactory獲取SqlSession的流程。具體執行Sql的流程會在其他博客中分析。

ClassPathResource resource = new ClassPathResource("mybatis-config.xml");
InputStream inputStream = resource.getInputStream();
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

通過上面代碼發現,創建SqlSessionFactory的代碼在SqlSessionFactoryBuilder中,進去一探究竟:

//整個過程就是將配置文件解析成Configration對象,然後創建SqlSessionFactory的過程
//Configuration是SqlSessionFactory的一個內部屬性
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }
    
  public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

下面我們看下解析配置文件過程中的一些細節。

先給出一個配置文件的列子:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--SqlSessionFactoryBuilder中配置的配置文件的優先級最高;config.properties配置文件的優先級次之;properties標籤中的配置優先級最低 -->
    <properties resource="org/mybatis/example/config.properties">
      <property name="username" value="dev_user"/>
      <property name="password" value="F2Fa3!33TYyg"/>
    </properties>

    <!--一些重要的全局配置-->
    <settings>
    <setting name="cacheEnabled" value="true"/>
    <!--<setting name="lazyLoadingEnabled" value="true"/>-->
    <!--<setting name="multipleResultSetsEnabled" value="true"/>-->
    <!--<setting name="useColumnLabel" value="true"/>-->
    <!--<setting name="useGeneratedKeys" value="false"/>-->
    <!--<setting name="autoMappingBehavior" value="PARTIAL"/>-->
    <!--<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>-->
    <!--<setting name="defaultExecutorType" value="SIMPLE"/>-->
    <!--<setting name="defaultStatementTimeout" value="25"/>-->
    <!--<setting name="defaultFetchSize" value="100"/>-->
    <!--<setting name="safeRowBoundsEnabled" value="false"/>-->
    <!--<setting name="mapUnderscoreToCamelCase" value="false"/>-->
    <!--<setting name="localCacheScope" value="STATEMENT"/>-->
    <!--<setting name="jdbcTypeForNull" value="OTHER"/>-->
    <!--<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>-->
    <!--<setting name="logImpl" value="STDOUT_LOGGING" />-->
    </settings>

    <typeAliases>

    </typeAliases>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--默認值為 false,當該參數設置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結果-->
            <!--如果某些查詢數據量非常大,不應該允許查出所有數據-->
            <property name="pageSizeZero" value="true"/>
        </plugin>
    </plugins>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://10.59.97.10:3308/windty"/>
                <property name="username" value="windty_opr"/>
                <property name="password" value="windty!234"/>
            </dataSource>
        </environment>
    </environments>

    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql" />
        <property name="Oracle" value="oracle" />
    </databaseIdProvider>

    <mappers>
        <!--這邊可以使用package和resource兩種方式加載mapper-->
        <!--<package name="包名"/>-->
        <!--<mapper resource="./mappers/SysUserMapper.xml"/>-->
        <mapper resource="./mappers/CbondissuerMapper.xml"/>
    </mappers>

</configuration>

下面是解析配置文件的核心方法:

private void parseConfiguration(XNode root) {
    try {
      //issue #117 read properties first
      //解析properties標籤,並set到Configration對象中
      //在properties配置屬性后,在Mybatis的配置文件中就可以使用${key}的形式使用了。
      propertiesElement(root.evalNode("properties"));
      
      //解析setting標籤的配置
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      //添加vfs的自定義實現,這個功能不怎麼用
      loadCustomVfs(settings);
        
      //配置類的別名,配置后就可以用別名來替代全限定名
      //mybatis默認設置了很多別名,參考附錄部分
      typeAliasesElement(root.evalNode("typeAliases"));
        
      //解析攔截器和攔截器的屬性,set到Configration的interceptorChain中
      //MyBatis 允許你在已映射語句執行過程中的某一點進行攔截調用。默認情況下,MyBatis 允許使用插件來攔截的方法調用包括:
      //Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
        //ParameterHandler (getParameterObject, setParameters)
        //ResultSetHandler (handleResultSets, handleOutputParameters)
        //StatementHandler (prepare, parameterize, batch, update, query)
      pluginElement(root.evalNode("plugins"));
      
      //Mybatis創建對象是會使用objectFactory來創建對象,一般情況下不會自己配置這個objectFactory,使用系統默認的objectFactory就好了
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
       
      //設置在setting標籤中配置的配置
      settingsElement(settings);
   
      //解析環境信息,包括事物管理器和數據源,SqlSessionFactoryBuilder在解析時需要指定環境id,如果不指定的話,會選擇默認的環境;
      //最後將這些信息set到Configration的Environment屬性裏面
      environmentsElement(root.evalNode("environments"));
        
      //
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
        
      //無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型。解析typeHandler。
      typeHandlerElement(root.evalNode("typeHandlers"));
      //解析Mapper
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
}

上面解析流程結束後會生成一個Configration對象,包含所有配置信息,然後會創建一個SqlSessionFactory對象,這個對象包含了Configration對象。

下面是openSession的過程:

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      //獲取執行器,這邊獲得的執行器已經代理攔截器的功能(見下面代碼)
      final Executor executor = configuration.newExecutor(tx, execType);
      //根據獲取的執行器創建SqlSession
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }
//interceptorChain生成代理類,具體參見Plugin這個類的方法
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
    executorType = executorType == null ? defaultExecutorType : executorType;
    executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
    Executor executor;
    if (ExecutorType.BATCH == executorType) {
      executor = new BatchExecutor(this, transaction);
    } else if (ExecutorType.REUSE == executorType) {
      executor = new ReuseExecutor(this, transaction);
    } else {
      executor = new SimpleExecutor(this, transaction);
    }
    if (cacheEnabled) {
      executor = new CachingExecutor(executor);
    }
    executor = (Executor) interceptorChain.pluginAll(executor);
    return executor;
  }

到此為止,我們已經獲得了SqlSession,拿到SqlSession就可以執行各種CRUD方法了。

簡單總結

對於MyBatis啟動的流程(獲取SqlSession的過程)這邊簡單總結下:

  • SqlSessionFactoryBuilder解析配置文件,包括屬性配置、別名配置、攔截器配置、環境(數據源和事務管理器)、Mapper配置等;解析完這些配置後會生成一個Configration對象,這個對象中包含了MyBatis需要的所有配置,然後會用這個Configration對象創建一個SqlSessionFactory對象,這個對象中包含了Configration對象;
  • 拿到SqlSessionFactory對象后,會調用SqlSessionFactory的openSesison方法,這個方法會創建一個Sql執行器(Executor),這個Sql執行器會代理你配置的攔截器方法
  • 獲得上面的Sql執行器后,會創建一個SqlSession(默認使用DefaultSqlSession),這個SqlSession中也包含了Configration對象,所以通過SqlSession也能拿到全局配置;
  • 獲得SqlSession對象后就能執行各種CRUD方法了。

SQL的具體執行流程見後續博客。

一些重要類總結:

  • SqlSessionFactory
  • SqlSessionFactoryBuilder
  • SqlSession(默認使用DefaultSqlSession)
  • Plugin、InterceptorChain的pluginAll方法

附錄

MyBatis內置別名轉換

//TypeAliasRegistry
registerAlias("string", String.class);

registerAlias("byte", Byte.class);
registerAlias("long", Long.class);
registerAlias("short", Short.class);
registerAlias("int", Integer.class);
registerAlias("integer", Integer.class);
registerAlias("double", Double.class);
registerAlias("float", Float.class);
registerAlias("boolean", Boolean.class);

registerAlias("byte[]", Byte[].class);
registerAlias("long[]", Long[].class);
registerAlias("short[]", Short[].class);
registerAlias("int[]", Integer[].class);
registerAlias("integer[]", Integer[].class);
registerAlias("double[]", Double[].class);
registerAlias("float[]", Float[].class);
registerAlias("boolean[]", Boolean[].class);

registerAlias("_byte", byte.class);
registerAlias("_long", long.class);
registerAlias("_short", short.class);
registerAlias("_int", int.class);
registerAlias("_integer", int.class);
registerAlias("_double", double.class);
registerAlias("_float", float.class);
registerAlias("_boolean", boolean.class);

registerAlias("_byte[]", byte[].class);
registerAlias("_long[]", long[].class);
registerAlias("_short[]", short[].class);
registerAlias("_int[]", int[].class);
registerAlias("_integer[]", int[].class);
registerAlias("_double[]", double[].class);
registerAlias("_float[]", float[].class);
registerAlias("_boolean[]", boolean[].class);

registerAlias("date", Date.class);
registerAlias("decimal", BigDecimal.class);
registerAlias("bigdecimal", BigDecimal.class);
registerAlias("biginteger", BigInteger.class);
registerAlias("object", Object.class);

registerAlias("date[]", Date[].class);
registerAlias("decimal[]", BigDecimal[].class);
registerAlias("bigdecimal[]", BigDecimal[].class);
registerAlias("biginteger[]", BigInteger[].class);
registerAlias("object[]", Object[].class);

registerAlias("map", Map.class);
registerAlias("hashmap", HashMap.class);
registerAlias("list", List.class);
registerAlias("arraylist", ArrayList.class);
registerAlias("collection", Collection.class);
registerAlias("iterator", Iterator.class);

registerAlias("ResultSet", ResultSet.class);

參考

https://blog.csdn.net/luanlouis/article/details/40422941

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

理解PostgreSQL的模式、表、空間、用戶間的關係

在平時的工作中,我們經常接觸到數據庫表用戶以及角色的使用,由於經常使用默認的數據庫表空間模式(Schema),所以我們往往忽略了數據庫表空間和模式的概念以及作用。

接下來,先介紹一下模式和表空間的定義以及作用。

什麼是Schema?

一個數據庫包含一個或多個已命名的模式,模式又包含表。模式還可以包含其它對象, 包括數據類型函數操作符等。同一個對象名可以在不同的模式里使用而不會導致衝突; 比如,herschemamyschema都可以包含一個名為mytable的表。 和數據庫不同,模式不是嚴格分離的:只要有權限,一個用戶可以訪問他所連接的數據庫中的任意模式中的對象。

我們需要模式的原因有好多:

  • 允許多個用戶使用一個數據庫而不會幹擾其它用戶。
  • 把數據庫對象組織成邏輯組,讓它們更便於管理。
  • 第三方的應用可以放在不同的模式中,這樣它們就不會和其它對象的名字衝突。

模式類似於操作系統層次的目錄,只不過模式不能嵌套。

什麼是表空間?

表空間是實際的數據存儲的地方。一個數據庫schema可能存在於多個表空間,相似地,一個表空間也可以為多個schema服務。

通過使用表空間,管理員可以控制磁盤的布局。表空間的最常用的作用是優化性能,例如,一個最常用的索引可以建立在非常快的硬盤上,而不太常用的表可以建立在便宜的硬盤上,比如用來存儲用於進行歸檔文件的表。

PostgreSQL表空間、數據庫、模式、表、用戶、角色之間的關係

角色與用戶的關係

PostgreSQL中,存在兩個容易混淆的概念:角色/用戶。之所以說這兩個概念容易混淆,是因為對於PostgreSQL來說,這是完全相同的兩個對象。唯一的區別是在創建的時候:

1.我用下面的psql創建了角色custom:

CREATE ROLE custom PASSWORD 'custom';

接着我使用新創建的角色custom登錄,PostgreSQL給出拒絕信息:

FATAL:role 'custom' is not permitted to log in.

說明該角色沒有登錄權限,系統拒絕其登錄

2.我又使用下面的psql創建了用戶guest:

CREATE USER guest PASSWORD 'guest';

接着我使用guest登錄,登錄成功

難道這兩者有區別嗎?查看文檔,又這麼一段說明:CREATE USER is the same as CREATE ROLE except that it implies LOGIN. —-CREATE USER除了默認具有LOGIN權限之外,其他與CREATE ROLE是完全相同的。

為了驗證這句話,修改custom的權限,增加LOGIN權限:

ALTER ROLE custom LOGIN;

再次用custom登錄,成功!那麼事情就明了了:

CREATE ROLE custom PASSWORD ‘custom’ LOGIN 等同於 CREATE USER custom PASSWORD ‘custom’.

這就是ROLE/USER的區別。

數據庫與模式的關係

模式(schema)是對數據庫(database)邏輯分割。

在數據庫創建的同時,就已經默認為數據庫創建了一個模式–public,這也是該數據庫的默認模式。所有為此數據庫創建的對象(表、函數、試圖、索引、序列等)都是創建在這個模式中的:

1.創建一個數據庫mars

CREATE DATABASE mars;

2.用custom角色登錄到mars數據庫,查看數據庫中的所有模式:\dn

显示結果只有public一個模式。

3.創建一張測試表

CREATE TABLE test(id integer not null);

4.查看當前數據庫的列表:\d;

显示結果是表test屬於模式public.也就是test表被默認創建在了public模式中。

5.創建一個新模式custom,對應於登錄用戶custom

CREATE SCHEMA custom;

ALTER SCHEMA custom OWNER TO custom;

6.再次創建一張test表,這次這張表要指明模式

CREATE TABLE custom.test (id integer not null);

7.查看當前數據庫的列表: \d

显示結果是表test屬於模式custom.也就是這個test表被創建在了custom模式中。

得出結論是:數據庫是被模式(schema)來切分的,一個數據庫至少有一個模式,所有數據庫內部的對象(object)是被創建於模式的。用戶登錄到系統,連接到一個數據庫后,是通過該數據庫的search_path來尋找schema的搜索順序,可以通過命令SHOW search_path;具體的順序,也可以通過SET search_path TO 'schema_name'來修改順序。

官方建議是這樣的:在管理員創建一個具體數據庫后,應該為所有可以連接到該數據庫的用戶分別創建一個與用戶名相同的模式,然後,將search_path設置為$user,即默認的模式是與用戶名相同的模式。

表空間與數據庫的關係

數據庫創建語句:

CREATE DATABASE dbname;

默認的數據庫所有者是當前創建數據庫的角色,默認的表空間是系統的默認表空間pg_default

為什麼是這樣的呢?

因為在PostgreSQL中,數據的創建是通過克隆數據庫模板來實現的,這與SQL SERVER是同樣的機制。由於CREATE DATABASE dbname並沒有指明數據庫模板,所以系統將默認克隆template1數據庫,得到新的數據庫dbname。(By default, the new database will be created by cloning the standard system database template1)

template1數據庫的默認表空間是pg_default,這個表空間是在數據庫初始化時創建的,所以所有template1中的對象將被同步克隆到新的數據庫中。

相對完整的語法應該是這樣的:

CREATE DATABASE dbname TEMPLATE template1 TABLESPACE tablespacename;
ALTER DATABASE dbname OWNER TO custom;

1.連接到template1數據庫,創建一個表作為標記:

CREATE TABLE test(id integer not null);

向表中插入數據

INSERT INTO test VALUES (1);

2.創建一個表空間:

CREATE TABLESPACE tsmars OWNER custom LOCATION '/tmp/data/tsmars';

在此之前應該確保目錄/tmp/data/tsmars存在,並且目錄為空。

3.創建一個數據庫,指明該數據庫的表空間是剛剛創建的tsmars

CREATE DATABASE dbmars TEMPLATE template1 OWNERE custom TABLESPACE tsmars;
ALTER DATABASE dbmars OWNER TO custom;

4.查看系統中所有數據庫的信息:\l+

可以發現,dbmars數據庫的表空間是tsmars,擁有者是custom;

仔細分析后,不難得出結論:

在PostgreSQL中,表空間是一個目錄,裏面存儲的是它所包含的數據庫的各種物理文件

總結

表空間是一個存儲區域,在一個表空間中可以存儲多個數據庫,儘管PostgreSQL不建議這麼做,但我們這麼做完全可行。一個數據庫並不知直接存儲表結構等對象的,而是在數據庫中邏輯創建了至少一個模式,在模式中創建了表等對象,將不同的模式指派該不同的角色,可以實現權限分離,又可以通過授權,實現模式間對象的共享,並且還有一個特點就是:public模式可以存儲大家都需要訪問的對象。

表空間用於定義數據庫對象在物理存儲設備上的位置,不特定於某個單獨的數據庫。數據庫是數據庫對象的物理集合,而schema則是數據庫內部用於組織管理數據庫對象的邏輯集合,schema名字空間之下則是各種應用程序會接觸到的對象,比如表、索引、數據類型、函數、操作符等。

角色(用戶)則是數據庫服務器(集群)全局範圍內的權限控制系統,用於各種集群範圍內所有的對象權限管理。因此角色不特定於某個單獨的數據庫,但角色如果需要登錄數據庫管理系統則必須連接到一個數據庫上。角色可以擁有各種數據庫對象。

關注公眾號:JAVA九點半課堂,這裡有一批優秀的技術大牛,為你提供方向,提供資源!加入我們,一起探討技術,共同進步!回復“資料”獲取 2T 行業最新資料!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

※別再煩惱如何寫文案,掌握八大原則!

馬拉威保護區采采蠅暴增 民憂非洲昏睡病再起

摘錄自2019年12月7日公共電視報導

馬拉威國家公園520隻大象,最近剛遷到新的野生動物保護區,希望能促進繁衍,但沒想到經常與大象共生的采采蠅,數量也大為增加,由於采采蠅會傳染寄生蟲,釀成致命的非洲昏睡病,附近民眾非常擔憂。

采采蠅不論公母都會吸血,被牠叮咬的話,就可能感染非洲錐蟲症,症狀跟瘧疾非常類似,很容易被誤診,釀成致命危險。「非洲錐蟲症」又稱為非洲昏睡病,主要出現在非洲撒哈拉以南的36個國家,初期症狀是發燒、頭痛,如果侵入腦部引起腦膜炎,可能導致神智不清,癲癇、昏睡不醒而死。非洲昏睡病在1890年代曾經造成數十萬人死亡,重創區域畜牧業跟農業,世界衛生組織直到2008年才控制住這種疾病。

動保NGO團體African Parks經營經理羅伯特說,「這有點諷刺,因為這是成功(大象遷移)的負面效應,動物數量增加所造成的後果之一,就是采采蠅的數量也增加了。」

為了防止非洲昏睡病擴散,動保團體跟馬拉威政府合作,在大象保護區內設置了600個陷阱與標靶,用采采蠅喜歡的藍色布料誘捕消滅牠們。此外也將增加醫療專業人手,並加強訓練,提高早期確診率,減少死亡病例。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

不放心東奧食安 南韓擬自運食材、偵測核食

摘錄自2019年12月5日公共電視報導

明年東京奧運,南韓奧會考量到食品安全,計畫購買輻射偵測器,針對代表團在奧運期間可能吃到的食物偵測,也打算運送自家食材前往日本。讓選手不必擔心吃到2011年福島核災可能遭污染的在地食品。

南韓執政共同民主黨議員申東坤說:「我們將從南韓盡可能帶很多食材過去,也因可能過境會面臨困難,例如肉品跟魚。我們會用各種形式帶食物,即使我們獲得在地韓國餐廳支援,我們還是會檢測輻射採取補充措施,供應安全的食品。」       

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

※別再煩惱如何寫文案,掌握八大原則!

非洲南部嚴重旱災 世界最大瀑布幾乎消失

摘錄自2019年12月7日中央社報導

位於非洲南部尚比西河(Zambezi River)中游, 坐落於尚比亞與辛巴威的交界處,高108公尺、寬1708公尺,被認為是世界上最大的瀑布,是該區域最大旅遊景點,數十年來吸引了數百萬旅客造訪辛巴威及尚比亞一睹奇景。

然而,路透社與英國「每日郵報」報導,維多利亞瀑布(Victoria Falls),非洲南部在嚴重旱災衝擊下,水位降至25年來最低,這場世紀最嚴重旱災,造成維多利亞瀑布減緩為細流,加劇氣候變遷可能破壞瀑布的憂慮。通常於乾季瀑布水流會減少,但官員表示,今年水位下降程度前所未見。

Shocking before and after photos show Victoria Falls almost completely dried up

— Daily Mail Online (@MailOnline)

The Victoria Falls, which draws millions of holidaymakers to Zimbabwe and Zambia, has shrunk to a trickle, fuelling fears that climate change could kill one of the region’s biggest tourist attractions

— Reuters (@Reuters)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

烏干達暴雨不斷災情嚴重 已300死、數百萬人流離失所

摘錄自2019年12月9日自由時報烏干達報導

烏干達數周的降雨造成嚴重的水災,根據紅十字會8日表示,已發現17名屍體,死亡人口持續增加,目前仍有許多人失蹤。這也是上周暴雨,烏干達地區最新公告的死者數據。

綜合外媒報導,自10月起,東非各國遭到暴雨的侵襲,包括烏干達、肯亞等國。根據聯合國資料,過去兩個月中,洪水和山區滑坡摧毀了東非大部分地區,造成近300人死亡,數百萬人流離失所。

東非國家正在經歷第二個雨季,該雨季已在大部分地區達到頂峰。烏干達國家氣象局預測,整個12月將繼續出現強降雨。暴雨在烏干達低窪地區造成了破壞性的洪災,並在山區造成了滑坡。破壞性的災害襲擊了烏干達各地的種植園和農作物。

根據飢荒預警系統網絡(Famine Early Warning Systems Network)的數據,在過去的兩個月中,大雨使東非部分地區遭受嚴重破壞,非洲之角的降雨量比平均水平高出300%(10月至11月中旬)。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?