Tomcat运行JDBC连接DerbyDB时报KUNDE表不存在错误如何解决
问题排查与解决办法
报错核心为Derby数据库找不到KUNDE表,但你在NetBeans中可正常查询,可按以下优先级逐一排查解决:
1. 表名大小写敏感问题(出现概率最高)
Derby有默认的大小写规则:
- 建表时如果没有给表名加双引号,Derby会自动将表名转为大写存储,查询时不加双引号也会自动转大写匹配
- 建表时如果给表名加了双引号,会保留输入的大小写,查询时也必须加双引号才能匹配成功
你当前代码中SQL写的是SELECT * FROM Kunde,如果建表时特意保留了Kunde的大小写格式,直接查询会被Derby自动转为大写KUNDE匹配,自然找不到表。
修复方案:
将SQL语句中的表名用转义双引号包裹,保留原大小写:
String sql ="SELECT * FROM \"Kunde\"";
如果确认建表时没有加双引号,表实际存储为全大写格式,也可以直接写全大写表名:
String sql ="SELECT * FROM KUNDE";
2. 数据库连接指向不一致问题
你在NetBeans中连接的Derby实例,和Tomcat运行时JSP连接的实例可能不是同一个:
- 核对代码中的连接地址
jdbc:derby://localhost:1527/Shop是否和NetBeans里的数据库连接地址完全一致 - 确认Derby服务启动的端口确实是1527,没有被其他服务占用
- 确认你使用的
deradmin账号在Shop数据库下有访问目标表的权限
3. Schema不匹配问题
Derby中的表默认归属到和用户名同名的大写Schema下,也就是DERADMIN,如果你的Kunde表是创建在其他自定义Schema下,查询时需要指定Schema:
// 替换为实际的Schema名,大小写规则和上述表名规则一致 String sql ="SELECT * FROM 你的Schema名.\"Kunde\"";
附加代码优化建议
你当前的代码存在资源泄漏风险,且有冗余代码:
- 已经调用
Class.forName加载了驱动,不需要再重复调用DriverManager.registerDriver注册驱动,该段冗余代码可直接删除 - 资源关闭顺序错误,且未放在finally块中,异常时会出现资源不释放的问题,建议调整为如下逻辑:
} catch (Exception e) { e.printStackTrace(); // 新增finally块关闭资源 } finally { if(resultSet != null) try { resultSet.close(); } catch(SQLException ignore) {} if(statement != null) try { statement.close(); } catch(SQLException ignore) {} if(connection != null) try { connection.close(); } catch(SQLException ignore) {} }
内容的提问来源于stack exchange,提问作者DerDave
相关产品推荐
相关产品推荐

