天天看點

java.lang.IllegalArgumentException: Mapped Statements collection already contains value for

mybatis并發:

今天使用mybatis(使用mybatis jar包:mybatis-3.0.4.jar,mybatis-spring-1.0.0.jar)時發現一個并發問題引起的異常,應用場景:頁面向服務端發送了三個請求,同時請求一個方法,結果抛出異常:

java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.bayss.parameter.dao.ParameterDAO.getBusicodeById at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:576) at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:551) at org.apache.ibatis.session.Configuration.addMappedStatement(Configuration.java:376) at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:215) at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:64) at org.apache.ibatis.session.Configuration.parseStatementNodes(Configuration.java:513) at org.apache.ibatis.session.Configuration.buildStatementsForNamespace(Configuration.java:502) at org.apache.ibatis.session.Configuration.buildStatementsFromId(Configuration.java:467) at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:391) at org.apache.ibatis.binding.MapperMethod.setupCommandType(MapperMethod.java:160) at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:37) .......

經過一翻折騰,終于搞定了改問題,問題原因:mybatis-3.0.4.jar,mybatis-spring-1.0.0.jar這兩個jar包問題,是mybatis的一個buger,在此版本下并發就會出現上面的異常。

解決辦法:使用新版本jar包替換現有項目中的mybatis-3.0.4.jar,mybatis-spring-1.0.0.jar包,在spring的配置檔案中添加新的命名空間和schema。

修改步驟:1.替換為mybatis新jar包:mybatis-3.1.1.jar,mybatis-spring-1.1.0.jar。  2.在spring的配置檔案中添加新的命名空間和schema: 命名空間:xmlns:util="http://www.springframework.org/schema/util" schemaLocation最後加入:http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"  3.配置資料庫連接配接:    <1>将連原來的<context:property-placeholder location="classpath:/config/jdbc.properties"/> 改為:<util:properties id="dataSourceProps" location="classpath:/config/jdbc.properties"/>;    <2>将所有<property name="driverClass" value="${datasource.driverClassName}" />改為 <property name="driverClass" value=" #{dataSourceProps['datasource.driverClassName ']}" />方式取值 修改完成後重新開機服務,再次并發通路,問題被解決。