如何避免Mybatis为每个'SqlSessionTemplate'重新加载配置?

How can I avoid Mybatis reloading configuration for every `SqlSessionTemplate`?

提问人:rooot 提问时间:11/1/2023 更新时间:11/1/2023 访问量:41

问:

最近我注意到我的项目需要相当长的时间来初始化与 Mybatis 相关的 bean 和类。我的数据库有几十个分片,并且有一个包装器将查询路由到分片。经过一番研究,我发现在包装器内部,每个分片都有一个单独的分片,每次创建和初始化时,它都会加载 Mybatis 配置和映射器。每次加载只需不到一秒钟,但总和为几十秒。SqlSessionTemplate

由于除了数据源之外,所有会话模板都完全相同,因此我不希望每次初始化会话模板时都进行加载。因此,我将 Mybatis 配置注册为 bean 并将其注入到每个 bean 中,如下所示:SqlSessionFactoryBean

SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setConfiguration(configuration);

但是所有 sql 会话最终都共享相同的数据源,因为数据源存储在 中,其单例 Bean 在所有 s 之间共享。ConfigurationSqlSessionFactoryBean

我搜索了一种在不重新加载所有配置的情况下克隆对象的方法,但找不到任何配置。Configuration

如果你知道如何在不每次都重新加载 Mybatis 配置和映射器的情况下实例化几个 s,无论是重用还是,请告诉我。SqlSessionTemplateConfigurationSqlSessionFactoryBean

版本: Spring 4.3, Mybatis 3.4, Mybatis-spring 1.3

春天 Mybatis Spring-Mybatis

评论

1赞 ave 11/1/2023
您是否考虑过使用 AbstractRoutingDataSource?也可以使用 MyBatis 拦截器切换目录/模式
0赞 rooot 11/7/2023
@ave非常感谢。AbstractRoutingDataSource 显然是实现分片的更好方法。我会试一试。

答: 暂无答案