我在 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 原因,我无法发布原始源代码,但一旦我知道人们在寻找什么,我就可以发布类似的内容。
Configuration
对象不是线程安全的。
您面临的问题可能是由于在配置它的线程中对
Configuration
对象所做的更改在其他线程中不可见,因为此类更改不是安全发布。
因此,您要么需要使用每个线程的配置,要么确保安全地发布配置对象。