嵌入式數(shù)據(jù)庫(Java): Derby贿条,SQLite雹仿,H2

一、介紹

從軟件角度來說整以,數(shù)據(jù)庫分類為兩種:

  • 第一種:數(shù)據(jù)庫服務(wù)器(Database Server)
  • 第二種:嵌入式數(shù)據(jù)庫(Embedded Database)

像 Oracle胧辽、PostgreSQL、MySQL 和 SQL Server 等這些大家熟知的數(shù)據(jù)庫公黑,我們一般稱它為數(shù)據(jù)庫服務(wù)器票顾,當(dāng)然也不排除某些數(shù)據(jù)庫也提供嵌入式版本,例如 MySQL Embedded 就是一個嵌入式的數(shù)據(jù)庫帆调。

而像 SQLite、Berkeley DB豆同、Derby番刊、H2、HSQL DB 等數(shù)據(jù)庫影锈,一本內(nèi)嵌在應(yīng)用程序中芹务,與應(yīng)用程序一起運行,我們稱它為嵌入式數(shù)據(jù)庫鸭廷。

嵌入式數(shù)據(jù)庫跟數(shù)據(jù)庫服務(wù)器最大的區(qū)別在于它們運行的地址空間不同枣抱。通常,數(shù)據(jù)庫服務(wù)器獨立地運行一個守護(hù)進(jìn)程(daemon)辆床,而嵌入式數(shù)據(jù)庫與應(yīng)用程序運行在同一個進(jìn)程佳晶。

在實際開發(fā)中,平時接觸最多的應(yīng)該是數(shù)據(jù)庫服務(wù)器讼载,對嵌入式數(shù)據(jù)庫使用的比較少轿秧。

但是為何會出現(xiàn)嵌入式數(shù)據(jù)庫呢

在小型的應(yīng)用程序中咨堤,例如小型掌上游戲機(jī)菇篡,不適合部署高達(dá)幾百兆的數(shù)據(jù)庫服務(wù)器,同時也沒有聯(lián)網(wǎng)的必要一喘,一種輕量級的數(shù)據(jù)庫需求由此誕生驱还!

與常見的數(shù)據(jù)庫相比,嵌入式數(shù)據(jù)庫具有體積小、功能齊備议蟆、可移植性闷沥、健壯性等特點,例如我們所熟知的 SVN 版本控制軟件就使用到了 SQLite 作為內(nèi)置數(shù)據(jù)庫咪鲜,SQLite 的安裝包只有不到 350 KB狐赡,在微型機(jī)中也有著廣泛的應(yīng)用,例如安卓疟丙、IOS 等移動設(shè)備操作系統(tǒng)都內(nèi)置了 SQLite 數(shù)據(jù)庫颖侄!

鑒于嵌入式數(shù)據(jù)庫的種類比較多,有商業(yè)收費的享郊、也有開源免費的览祖!本文主要介紹開源免費版的,例如 Derby炊琉、SQLite展蒂、H2 等,下面我們就一起來實踐一下各個數(shù)據(jù)庫的配置和用法苔咪。

二锰悼、Derby

Derby 可以說是 100% 由 Java 編寫的一款數(shù)據(jù)庫,而且是開源免費的团赏,非常小巧箕般,核心部分derby.jar只有 2M!
很多人可能覺得 Derby 不是很熱門舔清,但 Derby 已經(jīng)開發(fā)了將近二十年丝里!
1996 年,一個叫做 Cloudscape, Inc 的新公司成立了体谒,公司的目標(biāo)是構(gòu)建一個用 Java 語言編寫的數(shù)據(jù)庫服務(wù)器杯聚。
公司的第一個發(fā)行版在一年之后推出,后來產(chǎn)品的名稱變成 Cloudscape抒痒。
1999 年幌绍,Cloudscape, Inc. 被大型數(shù)據(jù)庫廠商 Informix Software, Inc. 收購。
Informix Software 在 2001 年又被 IBM 收購故响,然后 IBM Cloudscape? 數(shù)據(jù)庫系統(tǒng)在許多 IBM 的產(chǎn)品中被用作內(nèi)嵌的數(shù)據(jù)庫引擎纷捞。
2004 年 4 月,IBM 把 Cloudscape 數(shù)據(jù)庫軟件贈送給 Apache 軟件基金會被去,從此 Apache Derby 項目誕生了主儡。
接著 SUN 也為 Derby 捐獻(xiàn)了一個團(tuán)隊。在JavaSE6.0中惨缆,SUN 將其命名為JavaDB糜值。

2.1丰捷、項目引入

因為 Derby 是用 java 編寫的,所以集成的時候比較容易寂汇,直接通過mavenpom.xml中依賴庫文件病往,即可進(jìn)行開發(fā)!

<!--derby數(shù)據(jù)庫-->
<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.14.1.0</version>
    <scope>runtime</scope>
</dependency>

2.2骄瓣、環(huán)境配置

和所有的數(shù)據(jù)庫連接一樣停巷,基本都是配置驅(qū)動類、連接地址榕栏、賬號畔勤、密碼等信息。

String DRIVER_CLASS = "org.apache.derby.jdbc.EmbeddedDriver";
String JDBC_URL = "jdbc:derby:derbyDB;create=true";
String USER = "root";
String PASSWORD = "root";

說明:

  • org.apache.derby.jdbc.EmbeddedDriver表示使用derby嵌入式數(shù)據(jù)庫模式扒磁。
  • JDBC_URL中的derbyDB表示創(chuàng)建一個名為derbyDB的臨時數(shù)據(jù)庫庆揪,如果沒有會自動創(chuàng)建。
  • USER妨托、PASSWORD主要用于客戶端登錄使用缸榛。

2.3、單元測試應(yīng)用

下面兰伤,我們使用JDBC編寫一個測試類内颗,來測試一下derby是否可以正常使用。

public class DerbyTest {

    /**
     * 以嵌入式(本地)連接方式連接數(shù)據(jù)庫
     */
    private static final String JDBC_URL = "jdbc:derby:derbyDB;create=true";
    private static final String DRIVER_CLASS = "org.apache.derby.jdbc.EmbeddedDriver";
    private static final String USER = "root";
    private static final String PASSWORD = "root";

    public static void main(String[] args) throws Exception {
        //與數(shù)據(jù)庫建立連接
        Class.forName(DRIVER_CLASS);
        Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
        Statement statement = conn.createStatement();

        //刪除表
        statement.execute("DROP TABLE USER_INF");
        //創(chuàng)建表
        statement.execute("CREATE TABLE USER_INF(id VARCHAR(50) PRIMARY KEY, name VARCHAR(50) NOT NULL, sex VARCHAR(50) NOT NULL)");

        //插入數(shù)據(jù)
        statement.executeUpdate("INSERT INTO USER_INF VALUES('1', '程咬金', '男') ");
        statement.executeUpdate("INSERT INTO USER_INF VALUES('2', '孫尚香', '女') ");
        statement.executeUpdate("INSERT INTO USER_INF VALUES('3', '猴子', '男') ");

        //查詢數(shù)據(jù)
        ResultSet resultSet = statement.executeQuery("select * from USER_INF");
        while (resultSet.next()) {
            System.out.println(resultSet.getInt("id") + ", " + resultSet.getString("name") + ", " + resultSet.getString("sex"));
        }
        //關(guān)閉連接
        statement.close();
        conn.close();
    }
}

輸出結(jié)果:

1, 程咬金, 男
2, 孫尚香, 女
3, 猴子, 男

當(dāng)程序運行完之后敦腔,會在當(dāng)前項目根目錄生成一個derbyDB文件夾起暮,里面會存放一些持久化的數(shù)據(jù),當(dāng)下次再連接derbyDB數(shù)據(jù)庫名稱時会烙,可以查詢出之前插入的歷史數(shù)據(jù),這個特性可以防止數(shù)據(jù)丟失筒捺!

值得注意的是:derby 對很多 mysql 的關(guān)鍵字并不支持柏腻,同時 derby 不支持插入空值。
在之后的版本中系吭,derby 還可以作為一個數(shù)據(jù)庫服務(wù)器五嫂,通過jar啟動單獨部署在一臺服務(wù)器上,在連接地址上加上 IP 和端口號肯尺,例如jdbc://derby://localhost:1527/derbyDB沃缘。
如果想使用可視化客戶端工具來訪問和管理derby,可以使用SQuirreL SQL Client客戶端则吟,下載地址http://www.squirrelsql.org/#installation槐臀。
在目前絕大多數(shù)的關(guān)于嵌入式數(shù)據(jù)庫應(yīng)用中,derby 的出場次數(shù)還是較少氓仲。

三水慨、SQLite

SQLite 是 D.RichardHipp 用一個小型的C庫開發(fā)的一種強(qiáng)有力的嵌入式關(guān)系數(shù)據(jù)庫得糜,雖然功能較 Berkeley DB(商業(yè)數(shù)據(jù)庫)稍顯遜色,但它簡單易學(xué)晰洒、速度較快朝抖,同時提供了豐富的數(shù)據(jù)庫接口,提供了對 SQL92 的大多數(shù)支持:支持多表和索引谍珊、事務(wù)治宣、視圖、觸發(fā)和一系列的用戶接口及驅(qū)動砌滞。

SQLite 不僅支持 Windows/Linux/Unix 等等主流的操作系統(tǒng)侮邀,同時能夠跟很多程序語言相結(jié)合,比如 Tcl布持、C#豌拙、PHP、Java等题暖,還有ODBC接口按傅,比起 Mysql、PostgreSQL 這兩款開源的世界著名數(shù)據(jù)庫管理系統(tǒng)來講胧卤,它的處理速度比他們都快唯绍,全部源碼大致3萬行C代碼,文件大約 350KB枝誊,支持?jǐn)?shù)據(jù)庫大小至 2TB况芒!

幾乎常年占居嵌入式數(shù)據(jù)庫的第一位!

3.1叶撒、SQLite安裝

3.1.1绝骚、windows安裝
  • 1.訪問 SQLite 下載頁面https://www.sqlite.org/download.html
  • 2.下載sqlite-tools-win32-*.zipsqlite-dll-win32-*.zip壓縮文件祠够。
  • 3.創(chuàng)建文件夾C:\sqlite压汪,并在此文件夾下解壓上面兩個壓縮文件,將得到 sqlite3.def古瓤、sqlite3.dllsqlite3.exe文件止剖。
  • 4.添加C:\sqlitePATH環(huán)境變量。

最后在命令提示符下落君,輸入sqlite3命令穿香,顯示如下結(jié)果表示安裝成功!

C:\>sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
3.1.2绎速、linux安裝

目前皮获,幾乎所有版本的 Linux 操作系統(tǒng)都附帶 SQLite。所以纹冤,只需要在命令行輸入輸入sqlite3魔市,即可檢查出機(jī)器上是否已經(jīng)安裝了 SQLite主届!

$ sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

如果沒有看到上面的結(jié)果,安裝也很簡單待德!

  • 1.訪問 SQLite 下載頁面https://www.sqlite.org/download.html君丁。
  • 2.下載sqlite-autoconf-*.tar.gz并上傳到 linux 服務(wù)器。
  • 3.執(zhí)行安裝操作

例如将宪,安裝步驟示例:

$ tar xvzf sqlite-autoconf-3071502.tar.gz
$ cd sqlite-autoconf-3071502
$ ./configure --prefix=/usr/local
$ make
$ make install
3.1.3绘闷、mac安裝

mac安裝操作與linux類似。

3.2较坛、項目引入

sqlite 也可以直接通過mavenpom.xml中依賴庫文件印蔗,即可進(jìn)行開發(fā)!

<!--sqlite-->
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.7.2</version>
</dependency>

3.3丑勤、環(huán)境配置

String DRIVER_CLASS = "org.sqlite.JDBC";
String JDBC_URL = "jdbc:sqlite:sqliteDB.db";
String USER = "root";
String PASSWORD = "root";

說明:

  • org.sqlite.JDBC表示使用sqlite嵌入式數(shù)據(jù)庫模式华嘹。
  • JDBC_URL中的sqliteDB表示創(chuàng)建一個名為sqliteDB的臨時數(shù)據(jù)庫,如果沒有會自動創(chuàng)建法竞。
  • USER耙厚、PASSWORD主要用于客戶端登錄使用。

3.4岔霸、單元測試應(yīng)用

下面薛躬,來測試一下sqlite是否可以正常使用。

public class SQLiteTest {

    /**
     * 以嵌入式(本地)連接方式連接數(shù)據(jù)庫
     */
    private static final String JDBC_URL = "jdbc:sqlite:sqliteDB.db";
    private static final String DRIVER_CLASS = "org.sqlite.JDBC";
    private static final String USER = "root";
    private static final String PASSWORD = "root";

    public static void main(String[] args) throws Exception {
        //與數(shù)據(jù)庫建立連接
        Class.forName(DRIVER_CLASS);
        Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
        Statement statement = conn.createStatement();

        //刪除表
        statement.execute("DROP TABLE IF EXISTS USER_INF");
        //創(chuàng)建表
        statement.execute("CREATE TABLE USER_INF(id VARCHAR(50) PRIMARY KEY, name VARCHAR(50) NOT NULL, sex VARCHAR(50) NOT NULL)");

        //插入數(shù)據(jù)
        statement.executeUpdate("INSERT INTO USER_INF VALUES('1', '程咬金', '男') ");
        statement.executeUpdate("INSERT INTO USER_INF VALUES('2', '孫尚香', '女') ");
        statement.executeUpdate("INSERT INTO USER_INF VALUES('3', '猴子', '男') ");

        //查詢數(shù)據(jù)
        ResultSet resultSet = statement.executeQuery("select * from USER_INF");
        while (resultSet.next()) {
            System.out.println(resultSet.getInt("id") + ", " + resultSet.getString("name") + ", " + resultSet.getString("sex"));
        }
        //關(guān)閉連接
        statement.close();
        conn.close();
    }
}

輸出結(jié)果:

1, 程咬金, 男
2, 孫尚香, 女
3, 猴子, 男

當(dāng)程序運行完之后呆细,也會在當(dāng)前項目的根目錄下生成上文自定義的一個名為sqliteDB的文件型宝。

每次操作名為sqliteDB的數(shù)據(jù)庫時候,數(shù)據(jù)會持久化到sqliteDB文件中絮爷,從而防止數(shù)據(jù)丟失趴酣。

如果想使用可視化客戶端工具來訪問和管理sqliteDB,可以使用navicat來連接坑夯,選擇生成的sqliteDB文件岖寞,輸入相應(yīng)的賬號、密碼得滤,便可進(jìn)行管理維護(hù)氮兵!

四、H2

h2 是一款純java編寫的另一款嵌入式數(shù)據(jù)庫,它本身只是一個類庫雕旨,即只有一個 jar 文件,可以直接嵌入到應(yīng)用項目中侦另,同時還提供了非常友好的基于 web 的數(shù)據(jù)庫管理界面凝危。
網(wǎng)上有很多開發(fā)者拿它與 derby 做對比,稱它與 mysql 數(shù)據(jù)庫兼容性強(qiáng)阔涉,口碑較好缆娃。
具體是否真的如此捷绒,在后文我們會進(jìn)行相應(yīng)的性能測試,下面一起來看看在開發(fā)中如何使用贯要。

4.1暖侨、項目引入

既然 h2 是純java編寫,可以直接通過mavenpom.xml中依賴庫文件崇渗,即可進(jìn)行開發(fā)字逗!

<!--h2數(shù)據(jù)庫-->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
    <scope>runtime</scope>
</dependency>

4.2、環(huán)境配置

String DRIVER_CLASS = "org.h2.Driver";
String JDBC_URL = "jdbc:h2:mem:h2DB";
String USER = "root";
String PASSWORD = "root";

說明:

  • org.h2.Driver表示使用h2嵌入式數(shù)據(jù)庫模式宅广。
  • JDBC_URL中的h2DB表示創(chuàng)建一個名為h2DB的臨時數(shù)據(jù)庫葫掉。
  • USERPASSWORD主要用于客戶端登錄使用跟狱。

4.3俭厚、單元測試應(yīng)用

下面,來測試一下h2是否可以正常使用驶臊。

public class H2Test {

    /**
     * 以嵌入式(本地)連接方式連接H2數(shù)據(jù)庫
     */
    private static final String JDBC_URL = "jdbc:h2:mem:h2DB";
    private static final String DRIVER_CLASS = "org.h2.Driver";
    private static final String USER = "root";
    private static final String PASSWORD = "root";

    public static void main(String[] args) throws Exception {
        //與數(shù)據(jù)庫建立連接
        Class.forName(DRIVER_CLASS);
        Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
        Statement statement = conn.createStatement();

        //刪除表
        statement.execute("DROP TABLE IF EXISTS USER_INF");
        //創(chuàng)建表
        statement.execute("CREATE TABLE USER_INF(id VARCHAR(50) PRIMARY KEY, name VARCHAR(50) NOT NULL, sex VARCHAR(50) NOT NULL)");

        //插入數(shù)據(jù)
        statement.executeUpdate("INSERT INTO USER_INF VALUES('1', '程咬金', '男') ");
        statement.executeUpdate("INSERT INTO USER_INF VALUES('2', '孫尚香', '女') ");
        statement.executeUpdate("INSERT INTO USER_INF VALUES('3', '猴子', '男') ");

        //查詢數(shù)據(jù)
        ResultSet resultSet = statement.executeQuery("select * from USER_INF");
        while (resultSet.next()) {
            System.out.println(resultSet.getInt("id") + ", " + resultSet.getString("name") + ", " + resultSet.getString("sex"));
        }
        //關(guān)閉連接
        statement.close();
        conn.close();
    }
}

輸出結(jié)果:

1, 程咬金, 男
2, 孫尚香, 女
3, 猴子, 男

h2 作為嵌入式數(shù)據(jù)庫應(yīng)用可以選擇兩種類型的url挪挤,第一種是內(nèi)存模式運行,這種模式將數(shù)據(jù)臨時放到內(nèi)存中资铡,程序結(jié)束后數(shù)據(jù)表和數(shù)據(jù)立即被銷毀电禀,就不存在了;第二種是使用本地文件方式笤休,將數(shù)據(jù)持久化到文件中尖飞,當(dāng)再次連接數(shù)據(jù)庫時,可以獲取歷史數(shù)據(jù)店雅。

#第一種政基,內(nèi)存模式運行
jdbc:h2:mem:testDB

#第二種,使用本地文件方式
jdbc:h2:file:./target/testDB

h2 還可以作為數(shù)據(jù)庫服務(wù)器使用闹啦,單獨部署在服務(wù)器上沮明,應(yīng)用程序通過遠(yuǎn)程連接進(jìn)行操作,連接方式如下:

#連接語法
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>

#范例:
jdbc:h2:tcp://localhost:8080/~/test

如果想使用可視化客戶端工具來訪問和管理h2窍奋,可以通過它自帶的 web 頁面進(jìn)行管理荐健。
下面我們以springboot項目為例,通過配置使用h2自帶的管理頁面來維護(hù)琳袄。

新建一個WebConfig類江场,配置h2的 web 控制臺,如下:

@Configuration
public class WebConfig {

    /**
     * 添加h2控制臺的映射地址
     * @return
     */
    @Bean
    ServletRegistrationBean h2servletRegistration(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new WebServlet());
        registrationBean.addUrlMappings("/h2-console/*");
        return registrationBean;
    }
}

啟動springboot項目窖逗,打開瀏覽器址否,輸入http://127.0.0.1:8080/h2-console訪問管理頁面!

填寫連接地址碎紊、賬號佑附、密碼之后樊诺,進(jìn)行連接!

可以在工作臺音同,編寫 sql 語句進(jìn)行查詢词爬,同時對查詢結(jié)果還可以進(jìn)行編輯操作。

五瘟斜、性能測試

上文中我們介紹了三者數(shù)據(jù)庫的使用缸夹,下面,我們以循環(huán)插入1000螺句、10000虽惭、100000次操作,分別來測試三個數(shù)據(jù)庫的性能蛇尚,看看他們的表現(xiàn)如何芽唇?

從結(jié)果上看:

  • derby 與 sqlite 性能方面相差不大,但是隨著插入數(shù)量越多取劫,derby 比 sqlite 稍遜一些匆笤。
  • 三者相比,h2 性能最好谱邪,無論是將數(shù)據(jù)寫入內(nèi)存炮捧,還是寫入到數(shù)據(jù)庫,性能都是最好的惦银。

六咆课、總結(jié)

  • derby 作為嵌入式數(shù)據(jù)庫,在性能和易用性都不錯扯俱,數(shù)據(jù)庫是以一個目錄存儲的书蚪,但只能用于Java程序中。
  • sqlite 因為支持多種語言迅栅,也提供了對 SQL92 的大多數(shù)支持殊校,執(zhí)行效率也不錯,作為嵌入式數(shù)據(jù)庫應(yīng)用最廣读存,但如果想查詢數(shù)據(jù)只能本地連接不能遠(yuǎn)程連接为流。
  • h2 作為嵌入式數(shù)據(jù)庫的新秀,主要優(yōu)勢:超輕量級让簿,可以支持內(nèi)存模式敬察,高效高速,能支持基本的全文搜索拜英,同時與 mysql 數(shù)據(jù)庫兼容性最強(qiáng)静汤,一般使用場景最多的就是在開發(fā)環(huán)境上進(jìn)行回歸測試使用琅催。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末居凶,一起剝皮案震驚了整個濱河市虫给,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侠碧,老刑警劉巖抹估,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異弄兜,居然都是意外死亡药蜻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門替饿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來语泽,“玉大人,你說我怎么就攤上這事视卢□饴眩” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵据过,是天一觀的道長惋砂。 經(jīng)常有香客問我,道長绳锅,這世上最難降的妖魔是什么西饵? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鳞芙,結(jié)果婚禮上眷柔,老公的妹妹穿的比我還像新娘。我一直安慰自己积蜻,他們只是感情好闯割,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竿拆,像睡著了一般宙拉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丙笋,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天谢澈,我揣著相機(jī)與錄音,去河邊找鬼御板。 笑死锥忿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怠肋。 我是一名探鬼主播敬鬓,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钉答?” 一聲冷哼從身側(cè)響起础芍,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎数尿,沒想到半個月后仑性,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡右蹦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年诊杆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片何陆。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡晨汹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贷盲,到底是詐尸還是另有隱情宰缤,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布晃洒,位于F島的核電站慨灭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏球及。R本人自食惡果不足惜氧骤,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吃引。 院中可真熱鬧筹陵,春花似錦、人聲如沸镊尺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庐氮。三九已至语稠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弄砍,已是汗流浹背仙畦。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留音婶,地道東北人慨畸。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像衣式,于是被迫代替她去往敵國和親寸士。 傳聞我的和親對象是個殘疾皇子檐什,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345