Apache_Derby

**Apache Derby** 是 Apache 軟體基金會所研發的開放原始碼資料庫管理系統；由於 Derby 是一個純 Java 程式，因此只需要作業系統支援 Java 虛擬機，Derby 便可執行。

## 特性

Derby 是特別地為 Java 環境進行優化，Derby 本身不僅是一個純 Java 程式，而且 Derby 在執行使用者的 SQL 程式時，能夠把 SQL 編譯成 Java bytecode 並以系統的 Java 虛擬機執行。由於 SQL 程式轉成的 Java bytecode 能被 JIT 動態翻譯，因此 Derby 可能比傳統的資料庫管理系統更佳的效能。

其他特性包括：

* 支援主從架構或 嵌入環境
* 多執行緒
* ACID
* Java 資料庫連接（JDBC）
* 低系統需求：約佔 2 MB 的硬碟空間，壓縮後更只是 600KB

## 商業的版本

* Cloudscape － IBM 的 Derby 版本。
* Java DB － 昇陽電腦自 Java 6 把 Derby 包括於 JDK。

## 安裝

下載解壓後，只需要組態好相關的環境變數：

1. 建立 DERBY\_HOME，值例：D:\db-derby-10.10.2.0-bin
2. 在 Path 加入：% DERBY\_HOME%\bin
3. 在 CLASSPATH 加入：% DERBY\_HOME%\lib\derby.jar;% DERBY\_HOME%\lib\derbyclient.jar;% DERBY\_HOME%\lib\derbytools.jar;% DERBY\_HOME%\lib\derbynet.jar
* derby.jar 是引擎庫。對嵌入式是必須的；對客戶 / 伺服器模式，伺服器端必須此庫
* derbytools.jar 是 Derby 工具庫，如 ij, dblook, import/export
* derbyoptionaltools.jar
* derbynet.jar 通過網路伺服器連接 Derby（非嵌入方式）
* derbyclient.jar: 網路客戶端啟動程式
* derbyrun.jar: 執行 jar 檔案用於簡便地啟動 Derby 工具或伺服器。需要與其他 jar 檔案在同一目錄下
  * java -jar %DERBY\_HOME%\lib\derbyrun.jar ij [-p propertiesfile] [sql\_script]
  * java -jar %DERBY\_HOME%\lib\derbyrun.jar sysinfo [-cp ...] [-cp help]
  * java -jar %DERBY\_HOME%\lib\derbyrun.jar dblook [arg]\* (or no arguments for usage)
  * java -jar %DERBY\_HOME%\lib\derbyrun.jar server [arg]\* (or no arguments for usage)

## 使用

sysinfo 或 java org.apache.derby.tools.sysinfo 檢視安裝資訊版本

啟動 derby 的網路伺服器，預設監聽 127.0.0.1 的 1527 埠，可以修改監聽的 IP 和 PORT

```
   java org.apache.derby.drda.NetworkServerControl start -p 1388  #指定端口
```

或者

```
   startNetworkServer -h myhost -p 1388   #指定ip和端口
```

或者

```
java -jar derby/lib/derbyrun.jar server start
```

dblook 工具是一個 Data Definition Language (DDL) 生成工具，可以解除安裝（dump）所有或部分使用者指定的 DDL 到一個檔案或控制台。

啟動 JDBC 客戶端工具 ij，可以執行 SQL 指令碼或者互動式查詢：

```
 ij或java org.apache.derby.tools.ij 或 java -jar derby/lib/derbyrun.jar ij -p ij.properties
```

ij 命令列參數：

```
 ij -Dij.connection.mynetconnection=jdbc:derby://myserver:1527/mydb -Dij.user=me -Dij.password=nocansay
```

也可以建立一個名為 ij.properties，用於預設連接資料庫：

```
 ij.driver=org.apache.derby.jdbc.ClientDriver
 ij.protocol=jdbc:derby://localhost:1527/
 ij.database=COREJAVA;create=true
```

或者先設定環境變數：

```
 set DERBY_OPTS=-Dij.protocol=jdbc:derby://localhost/ （頁面存檔備份，存於網際網路檔案館）
```

在 ij 客戶端工具內部，不區分大小寫，每條命令都應以分號結尾。

連接資料庫並在必要時建立資料庫：

```
   connect 'jdbc:derby:mydb;create=true;user=test;password=test';   //创建/连接嵌入式数据库,
                                                                    //如果只写数据库名则会在当前目录下创建数据库目录
            //也可以指定其他位置进行创建"jdbc:derby:d:/a/b/userDB;create=true;user=test;password=test"
   connect 'jdbc:derby://host:1527/dbname;create=true';    //创建/链接网络数据库
```

檢視 ij 的命令：

```
   help;
```

執行 sql 檔案：

```
   run 'D:/derby/demo/ToursDB_schema.sql'  [RunResultOutput.txt]；
```

斷開資料庫連接（並停止內嵌模式資料庫）

```
   disconnect;
```

登出客戶端：

```
   exit ;
```

關閉資料庫伺服器：

```
java -jar derby/lib/derbyrun.jar server shutdown
```

命令列當前目錄中 derby.log 紀錄檔檔案，derby 在其中記錄的資料庫啟動、關閉的資訊。

Java 程式存取 Derby 資料庫：

啟動 Derby 網路伺服器的 Java 程式：

## Schema 實現

Apache Derby 資料庫（即 Java DB）的任何 connection 的當前 schema，預設是對應於該使用者名稱的一個 schema。如果無使用者名稱被提供，那麼當前使用者名稱與當前 schema 預設是 APP。

但即使當前 schema 被設定為使用者名稱，這個 schema 仍然可能不存在。一個 schema 只能被建立：通過 CREATE SCHEMA 語句顯式建立或者建立一個物件（例如表等）來隱式建立。

APP schema 總是存在，不需要建立。

如果你的程式試圖存取當前 schema 但該 schema 下沒有建立任何物件，就會遇到「schema not exists」錯誤。

## 註釋

## 參見

* Berkeley DB Java Edition - 另一純 Java 資料庫管理系統。

## 外部連結

* （英文） Derby 官方網站（頁面存檔備份，存於網際網路檔案館）
* （英文） Cloudscape 官方網站
* （英文） Java DB 官方網站 （頁面存檔備份，存於網際網路檔案館）
* （簡體中文） Apache Derby 專案資源 (IBM) （頁面存檔備份，存於網際網路檔案館）