Spring Boot微服务共享H2数据库时触发器失效,求排查配置问题
H2数据库触发器未生效的问题排查与解决
触发器类的类加载路径错误
H2数据库实例运行在第一个微服务进程中,触发器的Java类MyTrigger需要被H2的类加载器识别到。你现在把这个类放在第二个服务里,H2所在的第一个服务根本找不到它,自然无法执行触发器逻辑。
解决办法:把MyTrigger类移到第一个服务的类路径下,或者将该类抽成公共模块,让第一个服务依赖这个模块。data.sql的执行存在问题
第二个服务启动时执行data.sql创建触发器,需要确认两点:- 执行
CREATE TRIGGER语句时,myTable已经存在——要么在第一个服务中提前初始化表结构,要么在data.sql开头添加CREATE TABLE IF NOT EXISTS myTable (...)的语句; - 查看第二个服务的日志,确认
CREATE TRIGGER语句是否成功执行,有没有表不存在、类找不到之类的报错信息。
- 执行
触发器调用的语法细节需核对
你的触发器创建语句格式看似没问题,但要确保全限定类名完全正确(包括包名)。H2调用Java触发器必须用CALL "全限定类名"的格式,若类路径不对,这条语句可能会静默失败,或者在日志中留下类找不到的错误。Schema不匹配的问题
如果myTable是在非默认的Schema(比如不是PUBLIC)下创建的,创建触发器时需要指定Schema,示例如下:CREATE TRIGGER IF NOT EXISTS ING_TRIGGER AFTER INSERT ON schema_name.myTable FOR EACH ROW CALL "com.example.Calculator.trigger.MyTrigger";
内容的提问来源于stack exchange,提问作者Farfetch'd
相关产品推荐
相关产品推荐

