Apache Derby
Apache Derby是Apache軟件基金會所研發的開放原始碼資料庫管理系統;由於Derby是一個純Java程式,因此只需要作業系統支援Java虛擬機,Derby便可執行。
原作者 | Cloudscape Inc (Later IBM) |
---|---|
開發者 | Apache軟件基金會 |
目前版本 |
|
原始碼庫 | |
程式語言 | Java |
作業系統 | 跨平臺 |
類型 | 關聯式資料庫管理系統 |
特許條款 | Apache特許條款 2.0 |
網站 | db |
特性
Derby是特別地為Java環境進行優化,Derby本身不僅是一個純Java程式,而且Derby在執行用戶的SQL程式時,能夠把SQL編譯成Java bytecode並以系統的Java虛擬機執行。由於SQL程式轉成的Java bytecode能被JIT動態翻譯,因此Derby可能比傳統的資料庫管理系統更佳的效能。
其他特性包括:
商業的版本
安裝
下載解壓後,只需要組態好相關的環境變數:
- 建立DERBY_HOME,值例:D:\db-derby-10.10.2.0-bin
- 在Path加入:%DERBY_HOME%\bin
- 在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資料庫:
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class EmbeddedDerbyTester {
public static void main(String[] args) {
String driver = "org.apache.derby.jdbc.EmbeddedDriver";//在derby.jar里面
String dbName="EmbeddedDB";
String dbURL = "jdbc:derby:"+dbName+";create=true";//create=true表示当数据库不存在时就创建它
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(dbURL);//启动/连接嵌入式数据库
Statement st = conn.createStatement();
st.execute("create table foo (FOOID INT NOT NULL,FOONAME VARCHAR(30) NOT NULL)");//创建foo表
st.executeUpdate("insert into foo(FOOID,FOONAME) values (1,'chinajash')");//插入一条数据
ResultSet rs = st.executeQuery("select * from foo");//读取刚插入的数据
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
System.out.println("id="+id+";name="+name);
}
} catch(Exception e){
e.printStackTrace();
}
}
}
啟動Derby網絡伺服器的Java程式:
package test;
import java.io.PrintWriter;
import java.sql.DriverManager;
import org.apache.derby.drda.NetworkServerControl;
public class NetworkServerDerbyTester {
public static void main(String[] args) {
String driver = "org.apache.derby.jdbc.ClientDriver";//在derbyclient.jar里面
String dbName="NetworkDB";
String connectionURL = "jdbc:derby://localhost:1527/" + dbName + ";create=true";
try {
/*
启动Derby网络服务器,默认端口是1527,也可以通过运行
<Derby_Home>/frameworks/NetworkServer/bin/startNetworkServer.bat
来启动Derby网络服务器;如果是Unix,用startNetworkServer
*/
NetworkServerControl derbyServer = new NetworkServerControl();//NetworkServerControl类在derbynet.jar里面
PrintWriter pw = new PrintWriter(System.out);//用系统输出作为Derby数据库的输出
derbyServer.start(pw);//启动Derby服务器
Class.forName(driver);
DriverManager.getConnection(connectionURL);
//do something here..........
derbyServer.shutdown();//关闭Derby服务器
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Schema實現
Apache Derby資料庫(即Java DB)的任何connection的當前schema,預設是對應於該用戶名的一個schema。如果無用戶名被提供,那麼當前用戶名與當前schema預設是APP。
但即使當前schema被設置為用戶名,這個schema仍然可能不存在。一個schema只能被建立:通過CREATE SCHEMA陳述式顯式建立或者建立一個對象(例如表等)來隱式建立。
APP schema總是存在,不需要建立。
如果你的程式試圖訪問當前schema但該schema下沒有建立任何對象,就會遇到「schema not exists」錯誤。[3]
註釋
- ^ https://db.apache.org/derby/#News; 檢索日期: 2024年5月22日.
- ^ Compressing Apache Derby w/ Pack200. 昇陽. [2008-06-08]. (原始內容存檔於2007-10-21).
- ^ Apache Derby数据库(即Java DB) Frequently Asked Questions 5.3. Why do I get the error 'schema does not exist'?. [2018-08-03]. (原始內容存檔於2020-08-25).
參見
- Berkeley DB Java Edition - 另一純Java資料庫管理系統。
外部連結
- (英文) Derby官方網站(頁面存檔備份,存於互聯網檔案館)
- (英文) Cloudscape官方網站
- (英文) Java DB官方網站 (頁面存檔備份,存於互聯網檔案館)
- (簡體中文) Apache Derby 專案資源 (IBM) (頁面存檔備份,存於互聯網檔案館)