JDBC无法匹配正确MySQL数据库,程序仍连接已更名旧表的问题咨询
这种情况我碰到过好几次,明明改了表名、代码里也没痕迹,但程序就是死咬着旧表名不放,大概率是这些地方藏着坑:
可能的原因及排查步骤
ORM框架映射配置没更新
如果你用了Hibernate、MyBatis这类ORM工具,先去检查实体类的注解或者映射文件:- 比如Hibernate的
@Table(name = "employee")注解,是不是还没改成teacherexample? - MyBatis的XML映射文件里,
<select>、<insert>标签的table属性或者SQL语句里是不是还写着employee?
很多时候代码里没直接写表名,但框架会根据映射自动生成SQL,这时候旧的映射配置就是罪魁祸首。
- 比如Hibernate的
缓存在搞鬼
别忽略各种缓存的影响:- 检查ORM框架的二级缓存,比如Hibernate的二级缓存有没有把旧的表结构或查询语句缓存起来,清掉缓存再试试。
- 数据库连接池的缓存,比如Druid、C3P0这些,重启一下应用或者重置连接池,避免复用了之前缓存的连接和SQL。
- 低版本MySQL的查询缓存(MySQL 8.0已经移除了),如果你的版本还支持,执行
RESET QUERY CACHE清掉试试。
配置文件或初始化脚本藏着旧表名
去翻一翻项目的配置文件(比如application.properties、application.yml),有没有地方配置了表名参数,比如system.employee.table=employee这种,没改成新表名。
另外,项目启动时执行的初始化SQL脚本(比如data.sql、schema.sql),是不是还存在创建employee表或者操作它的语句?动态SQL里的旧表名
如果代码里有用字符串拼接生成SQL的情况,比如:String tableName = "employee"; // 这里没更新 String sql = "INSERT INTO " + tableName + " (xxx) VALUES (xxx)";或者从配置中心、数据库配置表中读取表名的逻辑,读取到的还是旧值,这时候要检查这些动态生成的地方。
数据库端的触发器/存储过程
登录数据库,检查有没有关联的触发器或者存储过程,比如在teacherexample表上的触发器,里面引用了employee表;或者某个存储过程在被调用时会操作旧表。可以用下面的SQL查询触发器:SHOW TRIGGERS LIKE '%employee%';查询存储过程:
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%employee%';
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

