为什么MyBatis有时找不到映射器,但大多数时候都能找到?

问题描述 投票:0回答:1

我在 Tomcat Web 应用程序中间歇性地收到 MyBatis 错误:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.cisco.salesconnect.screport.mapper.hubportfolio.Authorization.getAuthorizedHubSupervisorIds
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.cisco.salesconnect.screport.mapper.hubportfolio.Authorization.getAuthorizedHubSupervisorIds
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.5.2.jar:3.5.2]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) ~[mybatis-3.5.2.jar:3.5.2]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) ~[mybatis-3.5.2.jar:3.5.2]
    at com.cisco.salesconnect.screport.dao.SCHubAuthorizationServiceHandler.getAuthorizedHubSupervisorIds(SCHubAuthorizationServiceHandler.java:168) ~[classes/:?]
    at com.cisco.salesconnect.screport.dao.SCHubAuthorizationServiceHandler$7.run(SCHubAuthorizationServiceHandler.java:404) [classes/:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.cisco.salesconnect.screport.mapper.hubportfolio.Authorization.getAuthorizedHubSupervisorIds
    at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:964) ~[mybatis-3.5.2.jar:3.5.2]
    at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:755) ~[mybatis-3.5.2.jar:3.5.2]
    at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:748) ~[mybatis-3.5.2.jar:3.5.2]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:146) ~[mybatis-3.5.2.jar:3.5.2]
    ... 6 more

我可以在日志中收到错误一次,然后立即转到浏览器并单击“编辑”->“重新发送”,它就可以正常工作。 我能够通过在 Postman 中设置 Web 服务运行程序并将其设置为 10 次迭代来重现此问题。

我使用 Java 对象而不是 XML 文件获取配置。 我曾经在多线程 Web 请求中共享 SqlSession 对象,但现在不再共享它,因为它不是线程安全的。 我还尝试在多个请求之间共享 Configuration 对象,这样就不必为每个请求查找 XML 映射器文件而付出代价。

我还应该寻找哪些其他东西? 由于 IP 原因,我无法发布原始源代码,但一旦我知道人们在寻找什么,我就可以发布类似的内容。

java mybatis
1个回答
1
投票

Configuration
对象不是线程安全的。

您面临的问题可能是由于在配置它的线程中对

Configuration
对象所做的更改在其他线程中不可见,因为此类更改不是安全发布

因此,您要么需要使用每个线程的配置,要么确保安全地发布配置对象。

© www.soinside.com 2019 - 2024. All rights reserved.