《轉(zhuǎn)》數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)及原理

對(duì)于一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)應(yīng)用,由于對(duì)于數(shù)據(jù)庫(kù)的訪問(wèn)不是很頻繁状婶。這時(shí)可以簡(jiǎn)單地在需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí)茅茂,就新創(chuàng)建一個(gè)連接,用完后就關(guān)閉它太抓,這樣做也不會(huì)帶來(lái)什么明顯的性能上的開(kāi)銷空闲。但是對(duì)于一個(gè)復(fù)雜的數(shù)據(jù)庫(kù)應(yīng)用,情況就完全不同了走敌。頻繁的建立碴倾、關(guān)閉連接,會(huì)極大的減低系統(tǒng)的性能掉丽,因?yàn)閷?duì)于連接的使用成了系統(tǒng)性能的瓶頸跌榔。

連接復(fù)用。通過(guò)建立一個(gè)數(shù)據(jù)庫(kù)連接池以及一套連接使用管理策略捶障,使得一個(gè)數(shù)據(jù)庫(kù)連接可以得到高效僧须、安全的復(fù)用,避免了數(shù)據(jù)庫(kù)連接頻繁建立项炼、關(guān)閉的開(kāi)銷担平。

對(duì)于共享資源,有一個(gè)很著名的設(shè)計(jì)模式:資源池锭部。該模式正是為了解決資源頻繁分配暂论、釋放所造成的問(wèn)題的。把該模式應(yīng)用到數(shù)據(jù)庫(kù)連接管理領(lǐng)域拌禾,就是建立一個(gè)數(shù)據(jù)庫(kù)連接池取胎,提供一套高效的連接分配、使用策略,最終目標(biāo)是實(shí)現(xiàn)連接的高效闻蛀、安全的復(fù)用匪傍。


數(shù)據(jù)庫(kù)連接池的基本原理是在內(nèi)部對(duì)象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫(kù)連接,并對(duì)外暴露數(shù)據(jù)庫(kù)連接獲取和返回方法觉痛。如:

外部使用者可通過(guò)getConnection 方法獲取連接役衡,使用完畢后再通過(guò)releaseConnection 方法將連接返回,注意此時(shí)連接并沒(méi)有關(guān)閉秧饮,而是由連接池管理器回收,并為下一次使用做好準(zhǔn)備泽篮。

?

?

數(shù)據(jù)庫(kù)連接池技術(shù)帶來(lái)的優(yōu)勢(shì)

1. 資源重用

由于數(shù)據(jù)庫(kù)連接得到重用盗尸,避免了頻繁創(chuàng)建、釋放連接引起的大量性能開(kāi)銷帽撑。在減少系統(tǒng)消耗的基礎(chǔ)上泼各,另一方面也增進(jìn)了系統(tǒng)運(yùn)行環(huán)境的平穩(wěn)性(減少內(nèi)存碎片以及數(shù)據(jù)庫(kù)臨時(shí)進(jìn)程/線程的數(shù)量)。

2. 更快的系統(tǒng)響應(yīng)速度

數(shù)據(jù)庫(kù)連接池在初始化過(guò)程中亏拉,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫(kù)連接置于池中備用扣蜻。此時(shí)連接的初始化工作均已完成。對(duì)于業(yè)務(wù)請(qǐng)求處理而言及塘,直接利用現(xiàn)有可用連接莽使,避免了數(shù)據(jù)庫(kù)連接初始化和釋放過(guò)程的時(shí)間開(kāi)銷,從而縮減了系統(tǒng)整體響應(yīng)時(shí)間笙僚。

3. 新的資源分配手段

對(duì)于多應(yīng)用共享同一數(shù)據(jù)庫(kù)的系統(tǒng)而言芳肌,可在應(yīng)用層通過(guò)數(shù)據(jù)庫(kù)連接的配置,實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池技術(shù)肋层,幾年錢也許還是個(gè)新鮮話題亿笤,對(duì)于目前的業(yè)務(wù)系統(tǒng)而言,如果設(shè)計(jì)中還沒(méi)有考慮到連接池的應(yīng)用栋猖,那么…….快在設(shè)計(jì)文檔中加上這部分的內(nèi)容吧净薛。某一應(yīng)用最大可用數(shù)據(jù)庫(kù)連接數(shù)的限制,避免某一應(yīng)用獨(dú)占所有數(shù)據(jù)庫(kù)資源蒲拉。

4. 統(tǒng)一的連接管理肃拜,避免數(shù)據(jù)庫(kù)連接泄漏

在較為完備的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的連接占用超時(shí)設(shè)定雌团,強(qiáng)制收回被占用連接爆班。從而避免了常規(guī)數(shù)據(jù)庫(kù)連接操作中可能出現(xiàn)的資源泄漏。一個(gè)最小化的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn):

?

?

1.前言
數(shù)據(jù)庫(kù)應(yīng)用辱姨,在許多軟件系統(tǒng)中經(jīng)常用到柿菩,是開(kāi)發(fā)中大型系統(tǒng)不可缺少的輔助。但如果對(duì)數(shù)據(jù)庫(kù)資源沒(méi)有很好地管理(如:沒(méi)有及時(shí)回收數(shù)據(jù)庫(kù)的游標(biāo)(ResultSet)雨涛、Statement枢舶、連接 (Connection)等資源)懦胞,往往會(huì)直接導(dǎo)致系統(tǒng)的穩(wěn)定。這類不穩(wěn)定因素凉泄,不單單由數(shù)據(jù)庫(kù)或者系統(tǒng)本身一方引起躏尉,只有系統(tǒng)正式使用后,隨著流量后众、用戶的增加胀糜,才會(huì)逐步顯露。
在基于Java開(kāi)發(fā)的系統(tǒng)中蒂誉,JDBC是程序員和數(shù)據(jù)庫(kù)打交道的主要途徑教藻,提供了完備的數(shù)據(jù)庫(kù)操作方法接口。但考慮到規(guī)范的適用性右锨,JDBC只提供了最直接的數(shù)據(jù)庫(kù)操作規(guī)范括堤,對(duì)數(shù)據(jù)庫(kù)資源管理,如:對(duì)物理連接的管理及緩沖绍移,期望第三方應(yīng)用服務(wù)器(Application Server)的提供悄窃。
本文,以JDBC規(guī)范為基礎(chǔ)蹂窖,介紹相關(guān)的數(shù)據(jù)庫(kù)連接池機(jī)制轧抗,并就如果以簡(jiǎn)單的方式,實(shí)現(xiàn)有效地管理數(shù)據(jù)庫(kù)資源介紹相關(guān)實(shí)現(xiàn)技術(shù)瞬测。

?

?

?

2.連接池技術(shù)背景
2.1 JDBC
JDBC是一個(gè)規(guī)范鸦致,遵循JDBC接口規(guī)范,各個(gè)數(shù)據(jù)庫(kù)廠家各自實(shí)現(xiàn)自己的驅(qū)動(dòng)程序(Driver)涣楷,如下圖所示:

?

?

應(yīng)用在獲取數(shù)據(jù)庫(kù)連接時(shí)分唾,需要以URL的方式指定是那種類型的Driver,在獲得特定的連接后狮斗,可按照固定的接口操作不同類型的數(shù)據(jù)庫(kù)绽乔,如: 分別獲取Statement、執(zhí)行SQL獲得ResultSet等碳褒,如下面的例子 :

?

import java.sql.*;

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection dbConn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:oracle","username","password");
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery("select * from demo_table");

?

…some data source operation in here

?

rs.close();
st.close();
dbConn.close();

?

在完成數(shù)據(jù)操作后折砸,還一定要關(guān)閉所有涉及到的數(shù)據(jù)庫(kù)資源。這雖然對(duì)應(yīng)用程序的邏輯沒(méi)有任何影響沙峻,但是關(guān)鍵的操作睦授。上面是個(gè)簡(jiǎn)單的例子,如果攙和眾多的if-else摔寨、exception去枷,資源的管理也難免百密一疏。如同C中的內(nèi)存泄漏問(wèn)題,Java系統(tǒng)也同樣會(huì)面臨崩潰的惡運(yùn)删顶。所以數(shù)據(jù)庫(kù)資源的管理依賴于應(yīng)用系統(tǒng)本身竖螃,是不安全、不穩(wěn)定的一種隱患逗余。

?

?

?

2.2 JDBC連接池
在標(biāo)準(zhǔn)JDBC對(duì)應(yīng)用的接口中特咆,并沒(méi)有提供資源的管理方法。所以录粱,缺省的資源管理由應(yīng)用自己負(fù)責(zé)腻格。雖然在JDBC規(guī)范中,多次提及資源的關(guān)閉/回收及其他的合理運(yùn)用啥繁。但最穩(wěn)妥的方式菜职,還是為應(yīng)用提供有效的管理手段。所以输虱,JDBC為第三方應(yīng)用服務(wù)器(Application Server)提供了一個(gè)由數(shù)據(jù)庫(kù)廠家實(shí)現(xiàn)的管理標(biāo)準(zhǔn)接口:連接緩沖(connection pooling)些楣。引入了連接池( Connection Pool )的概念 脂凶,也就是以緩沖池的機(jī)制管理數(shù)據(jù)庫(kù)的資源宪睹。

?

JDBC最常用的資源有三類:
— Connection: 數(shù)據(jù)庫(kù)連接。
— Statement: 會(huì)話聲明蚕钦。
— ResultSet: 結(jié)果集游標(biāo)亭病。

?

分別存在以下的關(guān)系 :

?

?

這是一種“爺—父—子”的關(guān)系,對(duì)Connection的管理嘶居,就是對(duì)數(shù)據(jù)庫(kù)資源的管理罪帖。舉個(gè)例子: 如果想確定某個(gè)數(shù)據(jù)庫(kù)連接(Connection)是否超時(shí),則需要確定其(所有的)子Statement是否超時(shí)邮屁,同樣整袁,需要確定所有相關(guān)的 ResultSet是否超時(shí);在關(guān)閉Connection前佑吝,需要關(guān)閉所有相關(guān)的Statement和ResultSet坐昙。
因此,連接池(Connection Pool)所起到的作用芋忿,不僅僅簡(jiǎn)單地管理Connection炸客,還涉及到 Statement和ResultSet。

?

?

?

2.3 連接池(ConnectionPool)與資源管理
ConnectionPool以緩沖池的機(jī)制戈钢,在一定數(shù)量上限范圍內(nèi)痹仙,控制管理Connection,Statement和ResultSet殉了。任何數(shù)據(jù)庫(kù)的資源是有限的开仰,如果被耗盡,則無(wú)法獲得更多的數(shù)據(jù)服務(wù)。
在大多數(shù)情況下抖所,資源的耗盡不是由于應(yīng)用的正常負(fù)載過(guò)高梨州,而是程序原因。
在實(shí)際工作中田轧,數(shù)據(jù)資源往往是瓶頸資源暴匠,不同的應(yīng)用都會(huì)訪問(wèn)同一數(shù)據(jù)源。其中某個(gè)應(yīng)用耗盡了數(shù)據(jù)庫(kù)資源后傻粘,意味其他的應(yīng)用也無(wú)法正常運(yùn)行每窖。因此,ConnectionPool的第一個(gè)任務(wù)是限制:每個(gè)應(yīng)用或系統(tǒng)可以擁有的最大資源弦悉。也就是確定連接池的大小(PoolSize)窒典。
ConnectionPool的第二個(gè)任務(wù):在連接池的大小(PoolSize)范圍內(nèi),最大限度地使用資源稽莉,縮短數(shù)據(jù)庫(kù)訪問(wèn)的使用周期瀑志。許多數(shù)據(jù)庫(kù)中,連接(Connection)并不是資源的最小單元污秆,控制Statement資源比Connection更重要劈猪。以O(shè)racle為例:
每申請(qǐng)一個(gè)連接(Connection)會(huì)在物理網(wǎng)絡(luò)(如 TCP/IP網(wǎng)絡(luò))上建立一個(gè)用于通訊的連接,在此連接上還可以申請(qǐng)一定數(shù)量的Statement良拼。同一連接可提供的活躍Statement數(shù)量可以達(dá)到幾百战得。在節(jié)約網(wǎng)絡(luò)資源的同時(shí),縮短了每次會(huì)話周期(物理連接的建立是個(gè)費(fèi)時(shí)的操作)庸推。但在一般的應(yīng)用中常侦,多數(shù)按照2.1范例操作,這樣有10個(gè)程序調(diào)用贬媒,則會(huì)產(chǎn)生10次物理連接聋亡,每個(gè)Statement單獨(dú)占用一個(gè)物理連接,這是極大的資源浪費(fèi)际乘。 ConnectionPool可以解決這個(gè)問(wèn)題坡倔,讓幾十、幾百個(gè)Statement只占用同一個(gè)物理連接蚓庭,發(fā)揮數(shù)據(jù)庫(kù)原有的優(yōu)點(diǎn)致讥。
通過(guò)ConnectionPool對(duì)資源的有效管理,應(yīng)用可以獲得的Statement總數(shù)到達(dá) :

(并發(fā)物理連接數(shù))×(每個(gè)連接可提供的Statement數(shù)量)

例如某種數(shù)據(jù)庫(kù)可同時(shí)建立的物理連接數(shù)為 200個(gè)器赞,每個(gè)連接可同時(shí)提供250個(gè)Statement垢袱,那么ConnectionPool最終為應(yīng)用提供的并發(fā)Statement總數(shù)為: 200 × 250 = 50,000個(gè)。這是個(gè)并發(fā)數(shù)字港柜,很少有系統(tǒng)會(huì)突破這個(gè)量級(jí)请契。所以在本節(jié)的開(kāi)始咳榜,指出資源的耗盡與應(yīng)用程序直接管理有關(guān)。
對(duì)資源的優(yōu)化管理爽锥,很大程度上依靠數(shù)據(jù)庫(kù)自身的JDBC Driver是否具備涌韩。有些數(shù)據(jù)庫(kù)的JDBC Driver并不支持Connection與Statement之間的邏輯連接功能,如SQLServer氯夷,我們只能等待她自身的更新版本了臣樱。
對(duì)資源的申請(qǐng)、釋放腮考、回收雇毫、共享和同步,這些管理是復(fù)雜精密的踩蔚。所以棚放,ConnectionPool另一個(gè)功能就是,封裝這些操作馅闽,為應(yīng)用提供簡(jiǎn)單的飘蚯,甚至是不改變應(yīng)用風(fēng)格的調(diào)用接口。

?

?

?

3.簡(jiǎn)單JDBC連接池的實(shí)現(xiàn)
根據(jù)第二章中原理機(jī)制福也,Snap-ConnectionPool(一種簡(jiǎn)單快速的連接池工具局骤,可在www.snapbug.net下載)按照部分的JDBC規(guī)范,實(shí)現(xiàn)了連接池所具備的對(duì)數(shù)據(jù)庫(kù)資源有效管理功能拟杉。
3.1 體系描述
在JDBC規(guī)范中庄涡,應(yīng)用通過(guò)驅(qū)動(dòng)接口(Driver Interface)直接方法數(shù)據(jù)庫(kù)的資源量承。為了有效搬设、合理地管理資源,在應(yīng)用與JDBC Driver之間撕捍,增加了連接池: Snap-ConnectionPool拿穴。并且通過(guò)面向?qū)ο蟮臋C(jī)制,使連接池的大部分操作是透明的忧风。參見(jiàn)下圖默色,Snap-ConnectionPool的體系:

?

?

圖中所示,通過(guò)實(shí)現(xiàn)JDBC的部分資源對(duì)象接口( Connection, Statement, ResultSet )狮腿,在 Snap-ConnectionPool內(nèi)部分別產(chǎn)生三種邏輯資源對(duì)象: PooledConnection, PooledStatement和 PooledResultSet腿宰。它們也是連接池主要的管理操作對(duì)象,并且繼承了JDBC中相應(yīng)的從屬關(guān)系缘厢。這樣的體系有以下幾個(gè)特點(diǎn):
— 透明性吃度。在不改變應(yīng)用原有的使用JDBC驅(qū)動(dòng)接口的前提下,提供資源管理的服務(wù)贴硫。應(yīng)用系統(tǒng)椿每,如同原有的 JDBC伊者,使用連接池提供的邏輯對(duì)象資源。簡(jiǎn)化了應(yīng)用程序的連接池改造间护。
— 資源封裝亦渗。復(fù)雜的資源管理被封裝在 Snap-ConnectionPool內(nèi)部,不需要應(yīng)用系統(tǒng)過(guò)多的干涉汁尺。管理操作的可靠性法精、安全性由連接池保證。應(yīng)用的干涉(如:主動(dòng)關(guān)閉資源)痴突,只起到優(yōu)化系統(tǒng)性能的作用亿虽,遺漏操作不會(huì)帶來(lái)負(fù)面影響。
— 資源合理應(yīng)用苞也。按照J(rèn)DBC中資源的從屬關(guān)系洛勉,Snap-ConnectionPool不僅對(duì)Connection進(jìn)行緩沖處理,對(duì)Statement也有相應(yīng)的機(jī)制處理如迟。在2.3已描述收毫,合理運(yùn)用Connection和Statement之間的關(guān)系,可以更大限度地使用資源殷勘。所以此再,Snap- ConnectionPool封裝了Connection資源,通過(guò)內(nèi)部管理PooledConnection玲销,為應(yīng)用系統(tǒng)提供更多的Statement 資源输拇。
— 資源連鎖管理。Snap-ConnectionPool包含的三種邏輯對(duì)象贤斜,繼承了JDBC中相應(yīng)對(duì)象之間的從屬關(guān)系策吠。在內(nèi)部管理中,也依照從屬關(guān)系進(jìn)行連鎖管理瘩绒。例如:判斷一個(gè)Connection是否超時(shí)猴抹,需要根據(jù)所包含的Statement是否活躍;判斷Statement也要根據(jù) ResultSet的活躍程度锁荔。

?

?

?

3.2 連接池集中管理ConnectionManager
ConnectionPool是Snap-ConnectionPool的連接池對(duì)象蟀给。在Snap-ConnectionPool內(nèi)部,可以指定多個(gè)不同的連接池(ConnectionPool)為應(yīng)用服務(wù)阳堕。ConnectionManager管理所有的連接池跋理,每個(gè)連接池以不同的名稱區(qū)別。通過(guò)配置文件適應(yīng)不同的數(shù)據(jù)庫(kù)種類恬总。如下圖所示:

?

?

  通過(guò)ConnectionManager前普,可以同時(shí)管理多個(gè)不同的連接池,提供通一的管理界面越驻。在應(yīng)用系統(tǒng)中通過(guò) ConnectionManager和相關(guān)的配置文件汁政,可以將凌亂散落在各自應(yīng)用程序中的數(shù)據(jù)庫(kù)配置信息(包括:數(shù)據(jù)庫(kù)名道偷、用戶、密碼等信息)记劈,集中在一個(gè)文件中勺鸦。便于系統(tǒng)的維護(hù)工作。

?

  3.3 連接池使用范例

?

  對(duì)2.1的標(biāo)準(zhǔn)JDBC的使用范例目木,改為使用連接池换途,結(jié)果如下:

?

import java.sql.*;
import net.snapbug.util.dbtool.*;

..ConnectionPool dbConn = ConnectionManager
.getConnectionPool("testOracle" );
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery(
“select * from demo_table” );

some data source operation
in herers.close();st.close();

?

  在例子中,Snap-ConnectionPool封裝了應(yīng)用對(duì)Connection的管理刽射。只要改變JDBC獲取Connection的方法军拟,為獲取連接池(ConnectionPool)(粗體部分),其他的數(shù)據(jù)操作都可以不做修改誓禁。按照這樣的方式懈息,Snap- ConnectionPool可幫助應(yīng)用有效地管理數(shù)據(jù)庫(kù)資源。如果應(yīng)用忽視了最后資源的釋放: rs.close() 和 st.close()摹恰,連接池會(huì)通過(guò)超時(shí)(time-out)機(jī)制辫继,自動(dòng)回收。

?

  4.小結(jié)

?

  無(wú)論是Snap-ConnectionPool還是其他的數(shù)據(jù)庫(kù)連接池俗慈,都應(yīng)當(dāng)具備一下基本功能:

?

  -對(duì)源數(shù)據(jù)庫(kù)資源的保護(hù)

?

  -充分利用發(fā)揮數(shù)據(jù)庫(kù)的有效資源

?

  -簡(jiǎn)化應(yīng)用的數(shù)據(jù)庫(kù)接口姑宽,封閉資源管理。

?

  -對(duì)應(yīng)用遺留資源的自動(dòng)回收和整理闺阱,提高資源的再次利用率炮车。

?

  在這個(gè)前提下,應(yīng)用程序才能投入更多的精力于各自的業(yè)務(wù)邏輯中酣溃。數(shù)據(jù)庫(kù)資源也不再成為系統(tǒng)的瓶頸瘦穆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市救拉,隨后出現(xiàn)的幾起案子难审,更是在濱河造成了極大的恐慌瘫拣,老刑警劉巖亿絮,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異麸拄,居然都是意外死亡派昧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門拢切,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒂萎,“玉大人,你說(shuō)我怎么就攤上這事淮椰∥宕龋” “怎么了纳寂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泻拦。 經(jīng)常有香客問(wèn)我毙芜,道長(zhǎng),這世上最難降的妖魔是什么争拐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任腋粥,我火速辦了婚禮,結(jié)果婚禮上架曹,老公的妹妹穿的比我還像新娘隘冲。我一直安慰自己,他們只是感情好绑雄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布展辞。 她就那樣靜靜地躺著,像睡著了一般万牺。 火紅的嫁衣襯著肌膚如雪纵竖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天杏愤,我揣著相機(jī)與錄音靡砌,去河邊找鬼。 笑死珊楼,一個(gè)胖子當(dāng)著我的面吹牛通殃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厕宗,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼画舌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了已慢?” 一聲冷哼從身側(cè)響起曲聂,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锻全,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倒庵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖穷绵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情特愿,我是刑警寧澤仲墨,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布勾缭,位于F島的核電站,受9級(jí)特大地震影響目养,放射性物質(zhì)發(fā)生泄漏漫拭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一混稽、第九天 我趴在偏房一處隱蔽的房頂上張望采驻。 院中可真熱鬧,春花似錦匈勋、人聲如沸礼旅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痘系。三九已至,卻和暖如春饿自,著一層夾襖步出監(jiān)牢的瞬間汰翠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工昭雌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留复唤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓烛卧,卻偏偏與公主長(zhǎng)得像佛纫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子总放,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容