Apache Derby 不仅是一个嵌入式的数据库,它也提供了一个功能强大的网络服务器模式,允许多个客户端通过网络连接到同一个数据库实例,这使得 Derby 能够在客户端-服务器架构中应用。

什么是 Derby 网络服务器?
Derby 网络服务器(通常称为 derbynet)是一个独立的 Java 进程,它的主要作用是监听网络端口,接收来自客户端应用程序的数据库连接请求,并将这些请求转发给后端的 Derby 数据库引擎进行处理。
它扮演了“中间人”或“门卫”的角色,保护着你的数据库,并允许远程客户端访问它。
工作原理
- 启动服务器: 你首先需要启动 Derby 网络服务器,它会在一个指定的端口上(默认为
1527)开始监听连接请求。 - 客户端连接: 远程的客户端应用程序(例如一个 Java 程序、一个 SQuirreL SQL 客户端等)使用 JDBC 驱动程序,通过网络地址(如
jdbc:derby://localhost:1527/database_name)来连接服务器。 - 请求处理: 网络服务器接收到连接请求后,会验证客户端的凭据(用户名和密码),验证通过后,它会建立一个到目标数据库的会话。
- SQL 执行: 客户端发送的 SQL 语句(如
SELECT,INSERT,UPDATE)会通过网络发送到服务器,服务器再将其传递给 Derby 引擎执行。 - 返回结果: 执行结果会沿着相反的路径返回给客户端。
如何启动 Derby 网络服务器?
启动网络服务器最常用的方式是使用 ij 工具(Derby 的命令行交互式工具)。
前提条件
确保你已经下载并解压了 Derby,并且设置了 DERBY_HOME 环境变量,同时将 $DERBY_HOME/bin 添加到你的 PATH 环境变量中。

启动命令
在命令行中,进入任意一个你想存放数据库的目录(my_databases),然后执行以下命令:
java -jar $DERBY_HOME/lib/derbyrun.jar server start
命令解释:
java -jar $DERBY_HOME/lib/derbyrun.jar: 使用derbyrun.jar这个可执行 JAR 文件,它包含了运行 Derby 所需的所有类和资源。server: 指定要运行server子命令,即启动网络服务器。start: 指定以“启动”模式运行,服务器会在后台运行,并返回命令提示符。
成功启动后,你会看到类似以下的输出:
Apache Derby Network Server - 10.16.1.0 - (1908273) started and ready to accept connections on port 1527
停止服务器: 你可以通过以下命令优雅地停止服务器:

java -jar $DERBY_HOME/lib/derbyrun.jar server shutdown
或者,如果你在启动时指定了 -p 参数来设置一个关闭端口,你也可以向该端口发送一个特定的数据包来关闭服务器。
如何连接到网络服务器?
客户端需要使用 Derby 的 JDBC 网络客户端驱动程序进行连接。
添加 JDBC 驱动到客户端项目
确保你的客户端项目(Java 应用、SQuirreL 等)的类路径中包含 Derby 的客户端驱动 JAR 文件:derbyclient.jar (位于 $DERBY_HOME/lib 目录下)。
JDBC 连接 URL 格式
连接 Derby 网络服务器的 URL 格式如下:
jdbc:derby://<host>:<port>/<database_name>[;<attributes>]
<host>: 服务器的主机名或 IP 地址,如果服务器在本地运行,通常使用localhost。<port>: 服务器监听的端口号,默认是1527。<database_name>: 你要连接的数据库名称,如果数据库不存在,Derby 可以根据配置创建它。[;<attributes>]: 可选属性,用于指定连接行为。
连接属性
常用的连接属性包括:
create=true: 如果数据库不存在,则创建它。user=<username>: 指定数据库用户名。password=<password>: 指定数据库密码。retrieveMessagesFromServerOnGetMessage=true: 从服务器获取详细的 SQL 错误消息,非常有助于调试。
示例:在 Java 代码中连接
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class DerbyNetworkClientExample {
public static void main(String[] args) {
// JDBC URL for connecting to a network server
String dbURL = "jdbc:derby://localhost:1527/sample;create=true;user=app;password=app";
// The driver is automatically loaded by DriverManager in modern Java
// For older Java versions, you might need: Class.forName("org.apache.derby.jdbc.ClientDriver");
try (Connection conn = DriverManager.getConnection(dbURL);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Hello from Derby Network Server!' AS GREETING")) {
if (conn != null) {
System.out.println("Connected to the database successfully!");
}
while (rs.next()) {
System.out.println(rs.getString("GREETING"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
示例:使用 SQuirreL SQL 客户端
- 下载并安装 SQuirreL SQL。
- 启动 SQuirreL,进入
Drivers标签页。 - 点击 号添加新驱动。
- Name:
Apache Derby (Network) - Example URL:
jdbc:derby://localhost:1527/database - Driver Class:
org.apache.derby.jdbc.ClientDriver - 点击
Add Class...按钮,然后选择你下载的derbyclient.jar文件。
- Name:
- 切换到
Aliases标签页,点击 号添加一个新的数据库连接别名。- Name:
My Derby DB - Driver: 选择你刚刚创建的
Apache Derby (Network)。 - URL:
jdbc:derby://localhost:1527/sample - User Name:
app - Password:
app - 点击
Test按钮,如果连接成功,就可以点击Connect了。
- Name:
安全性考虑
默认情况下,Derby 网络服务器没有启用用户认证,任何能够连接到端口的客户端都可以访问数据库,在生产环境中,这非常危险。
启用用户认证
你可以通过在启动服务器时指定一个属性文件来启用用户认证。
步骤:
- 创建一个属性文件,
db.properties:# User authentication properties app=derby admin=derby_admin_password - 使用
-p参数启动服务器,并指定该属性文件:java -jar $DERBY_HOME/lib/derbyrun.jar server start -p db.properties
- 客户端连接时就必须提供正确的用户名和密码了。
使用防火墙
将运行 Derby 服务器的机器的防火墙配置为只允许来自受信任 IP 地址的连接访问 1527 端口。
优点与缺点
优点
- 多用户并发访问: 与嵌入式模式不同,网络服务器可以同时处理来自多个客户端的请求。
- 客户端/服务器架构: 适合将数据库和应用程序部署在不同的机器上,提高了系统的灵活性和可扩展性。
- 跨平台: 只要客户端有 Java 运行环境和 JDBC 驱动,就可以从任何操作系统连接到服务器。
- 轻量级: 相对于 Oracle、MySQL 等大型数据库,Derby 非常小巧,启动快速,资源占用少。
缺点
- 性能开销: 网络通信(序列化、反序列化、网络延迟)会比嵌入式模式(进程内调用)带来额外的性能开销。
- 配置复杂性: 需要单独启动和管理服务器进程,比嵌入式模式多了一步配置。
- 安全性: 默认配置不安全,需要额外配置才能保证安全。
- 功能限制: 相比商业数据库,其高级功能和性能优化能力有限。
| 特性 | 描述 |
|---|---|
| 用途 | 实现客户端/服务器架构,允许多个远程客户端访问同一个 Derby 数据库。 |
| 启动方式 | 使用 java -jar derbyrun.jar server start 命令。 |
| 默认端口 |
