
本文详解如何修复 SQLNonTransientConnectionException: The connection was refused because the database [...] was not found 错误,核心在于确认 Derby 数据库是否真实存在、路径是否正确、是否已启动网络服务,并提供完整的连接配置与排错步骤。
本文详解如何修复 `sqlnontransientconnectionexception: the connection was refused because the database [...] was not found` 错误,核心在于确认 derby 数据库是否真实存在、路径是否正确、是否已启动网络服务,并提供完整的连接配置与排错步骤。
该异常(java.sql.SQLNonTransientConnectionException: The connection was refused because the database AnimeFigurineCollection [wimmy on WIMMY] was not found)并非代码语法错误,而是 Derby 网络客户端(derbyclient.jar)成功连接到 Derby Network Server,但指定的数据库在服务器端并不存在 所致。
? 根本原因分析
- Derby 的
jdbc:derby://URL 使用的是 网络协议模式(Client/Server),要求:- Derby Network Server 已启动(默认监听
localhost:1527); - 数据库
AnimeFigurineCollection必须预先创建并位于服务器可访问的路径下(如~/derby/databases/AnimeFigurineCollection),而非仅在本地文件系统中存在; - URL 中的数据库名必须严格匹配实际创建的数据库名——注意:
[wimmy on WIMMY]是 Derby 嵌入式模式下 ij 工具显示的 连接别名,不是数据库名的一部分,也不应写入 JDBC URL。
- Derby Network Server 已启动(默认监听
您当前的 URL 存在两个关键问题:
String url = "jdbc:derby://localhost:1527/AnimeFigurineCollection [wimmy on WIMMY]"; // ❌ 错误1:空格和方括号是非法字符,URL 解析失败 // ❌ 错误2:"[wimmy on WIMMY]" 是 ij 的提示信息,非数据库名
✅ 正确解决方案
1. 启动 Derby Network Server(若未运行)
确保 Derby Network Server 已启动(可通过命令行或 IDE 插件):
# 进入 Derby bin 目录后执行 java -jar derbyrun.jar server start
✅ 默认端口为
1527;若修改过端口,请同步更新 URL。
2. 创建数据库(首次连接时自动创建)
Derby 在 create=true 参数下可自动创建数据库。推荐在连接 URL 中显式添加该参数,避免“数据库不存在”错误:
String url = "jdbc:derby://localhost:1527/AnimeFigurineCollection;create=true"; String username = "wimmy"; String password = "1231"; conn = DriverManager.getConnection(url, username, password);
⚠️ 注意:
create=true仅在数据库完全不存在时生效;若数据库存在但权限不足,仍会报错。
3. 修正 URL 格式(移除非法字符)
删除 URL 中所有空格、方括号及无关描述:
// ✅ 正确写法(简洁、标准、可解析) String url = "jdbc:derby://localhost:1527/AnimeFigurineCollection;create=true"; // ❌ 错误写法(含空格、符号、别名) // "jdbc:derby://localhost:1527/AnimeFigurineCollection [wimmy on WIMMY]"
4. 验证数据库是否真实存在(可选)
通过 Derby 自带的 ij 工具手动连接验证:
CONNECT 'jdbc:derby://localhost:1527/AnimeFigurineCollection'; -- 若提示 "ERROR 08004",说明数据库尚未创建 -- 加上 create=true 再试: CONNECT 'jdbc:derby://localhost:1527/AnimeFigurineCollection;create=true';
5. 补充健壮性建议
-
统一资源管理:避免在构造函数中直接调用
dbconn()和createStatement(),应延迟初始化或使用连接池; -
异常处理优化:捕获
SQLException后建议输出具体 SQLState(如"08004"),便于精准定位; -
驱动注册简化:Derby 10.7+ 支持自动加载,
Class.forName(...)可省略(但仍建议保留以兼容旧版本)。
? 完整修正后的 dbconn() 示例
public void dbconn() throws SQLException, ClassNotFoundException {
String url = "jdbc:derby://localhost:1527/AnimeFigurineCollection;create=true";
String username = "wimmy";
String password = "1231";
// Derby 10.7+ 可省略,但保留更稳妥
Class.forName("org.apache.derby.jdbc.ClientDriver");
conn = DriverManager.getConnection(url, username, password);
System.out.println("✅ Connected to Derby database: AnimeFigurineCollection");
}
? 总结
| 问题现象 | 根本原因 | 解决动作 |
|---|---|---|
Database [...] was not found |
URL 包含非法字符;数据库未在 Network Server 上创建 | 清理 URL、添加 ;create=true、确保 Server 已启动 |
移除 derbyclient.jar 后错误消失 |
项目误用嵌入式驱动(derby.jar)却配了网络 URL |
必须使用 derbyclient.jar + jdbc:derby://,二者配套 |
只要确保 Derby Network Server 运行中、URL 标准无误、并启用 create=true,该异常即可彻底解决。











