在学习和使用Java数据库的过程中,很多人第一次接触的数据库就是javadb。它随JDK一起分发,安装完JDK后无需额外下载数据库软件即可直接使用,因此成为不少教材和入门教程的首选。但当你按照网上找到的教程去访问javadb的地址时,经常会遇到页面404或者下载链接失效的情况,于是产生了一个疑问:javadb是不是搬家了?这篇文章就来把这个问题彻底讲清楚。

javadb到底是什么,它与Apache Derby是什么关系
首先要明确一点,javadb并不是一个独立的数据库产品,它只是Apache Derby数据库在Sun公司时代的名称。当年Sun Microsystems将Derby引入JDK发行包时,为了强调它与Java的紧密关系,将其命名为Java DB。后来Oracle收购了Sun,从JDK 7和JDK 8开始,安装目录下仍然保留了一个名为db的文件夹,里面就是Derby的完整发行版。
所以当你在JDK安装目录下看到C:\Program Files\Java\jdk1.8.0_XX\db这样的路径时,这里面装的其实就是Derby。文件夹中通常包含bin、lib、demo等子目录,其中lib目录下的derby.jar、derbyclient.jar、derbynet.jar就是我们后续编程要用的核心依赖包。
需要注意,从JDK 9开始,Oracle不再随JDK捆绑Java DB,需要单独去Apache官网下载Derby。这就是很多老教程链接失效的根本原因之一:不是数据库搬家了,而是发行方式变了。
关于javadb地址的几个常见误解
第一个误解是认为javadb的官方网站永久关闭了。实际上Derby项目一直由Apache软件基金会维护,项目主页始终在apache.org域名下。旧教程中出现的sun.com相关链接失效,是因为Sun的域名体系在Oracle收购后整体迁移,并不代表项目死亡。
第二个误解是认为连接地址和下载地址是同一个东西。很多人混淆了数据库的下载地址与JDBC连接URL。下载地址指向官网,而连接URL是程序内部使用的字符串,例如嵌入式模式下的jdbc:derby:testdb;create=true,客户端模式下的jdbc:derby://localhost:1527/testdb。链接打不开与连接失败是两类完全不同的问题。
第三个误解是认为Derby默认端口是3306。这是MySQL的默认端口,Derby网络服务器的默认端口是1527。如果你的连接代码里端口写错了,无论下载地址多么正确,程序都会报连接拒绝异常。
实例演示:正确的下载配置与JDBC连接代码
下面演示一个完整的流程。首先从Apache Derby官网下载bin发行版,解压后设置环境变量DERBY_HOME指向解压目录,并把%DERBY_HOME%\bin加入PATH。然后在项目中引入lib目录下的derby.jar和derbyclient.jar。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DerbyDemo {
public static void main(String[] args) throws Exception {
// 加载驱动,Derby 10.x及以前的版本建议显式加载
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
// 嵌入式模式:数据库文件创建在当前目录下的testdb文件夹
String url = "jdbc:derby:testdb;create=true";
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement()) {
stmt.executeUpdate("CREATE TABLE users (id INT, name VARCHAR(50))");
stmt.executeUpdate("INSERT INTO users VALUES (1, 'zhangsan')");
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
System.out.println(rs.getInt("id") + " - " + rs.getString("name"));
}
}
// 嵌入式模式退出前建议关闭数据库
DriverManager.getConnection("jdbc:derby:;shutdown=true");
}
}
上面是嵌入式模式的写法,数据库直接运行在JVM内部,适合单机学习和桌面程序。如果你需要多客户端同时访问,就要使用网络模式,先在命令行执行startNetworkServer.bat(Windows)或startNetworkServer(Linux),然后把驱动类换成org.apache.derby.jdbc.ClientDriver,URL改为jdbc:derby://localhost:1527/testdb;create=true。
两种模式的取舍很简单:嵌入式省去部署、性能开销小,但只允许同一个JVM访问;网络模式支持并发,但多了一层网络通信成本。学习阶段用嵌入式,做小型多人应用再切换到网络模式即可。
常见问题排查与注意事项
第一类问题是驱动类找不到,报ClassNotFoundException。这基本都是classpath没有正确引入derby.jar导致的。使用IDE的话检查依赖配置,命令行编译的话要用-cp参数显式指定jar路径,不要想当然地以为设置了DERBY_HOME就够了。
第二类问题是端口被占用。启动网络服务器时报端口冲突,说明1527端口被其他进程占用了。可以用命令netstat -ano | findstr 1527查到占用进程的PID,再决定结束进程还是修改Derby的监听端口。
第三类问题是数据库路径包含中文或空格。Windows用户如果把数据库路径放在含中文字符的目录下,Derby可能无法正确创建或访问数据库文件。建议把工作目录设置在纯英文路径下,例如D:\derbydata,避免这类诡异问题。
最后提醒一点,嵌入式模式下数据库文件会被JVM锁定,程序没正常退出时文件锁不会释放,再次连接可能报另一个实例已连接的错误。遇到这种情况先检查是否有残留的java进程,或者删除数据库目录下的db.lck文件后再重试。掌握这些细节后,无论javadb的地址怎么变化,你都能快速定位问题所在。