Spring+Mybatis访问报错 java.lang.Mapped Statements collection already contains value

hjing0628 2013-04-25 01:10:06
环境为Spring3+mybatis,采用mapping方式实现dao,xml对应。

情况是这样的,项目启动后页面$(document).ready会ajax访问后台同一个controller中的三个映射url完成页面三个表单的初始化工作。但是第一次访问总会有一至二个方法报错,报错内容为:
java.lang.IllegalArgumentException: Mapped Statements collection already contains value for xxx.xxx.dao.method
导致页面1,2处渲染出错。

网上查了以下原因,有说:mybatis并发错误,前台多个请求并发请求mapper
原因大概是请求时mybaits解析sql并执行导致的并发错误。
mybaits初始化时加上以下这句可以解决。让Mybatis初始化时就编译sql语句,
sqlSesssionTemplate.getConfiguration().buildAllStatement。

而我用的mapping方式,不知道在哪里设置k可以达到sqlSesssionTemplate.getConfiguration().buildAllStatement的效果

需要帮助,请大家协助~

配置文件应该都是对的,启动后第一次访问不成功,第二次就可以了。
...全文
18563 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
joveqiao 2015-12-11
  • 打赏
  • 举报
回复
我来回复下: 原因是因为对应的Mapper接口和其他接口名 有包含关系,(名称是子串关系) 而且这两个mapper.xml 里面有重复的 id !!!! joviqiao@qq.com
luanxuefanren 2013-08-15
  • 打赏
  • 举报
回复
问题解决了吗,现在我也遇到这个问题,我在找初始化的入口,目前只有改jar源码了,我在SqlSessionFactoryBean.java的buildSqlSessionFactory加上去。先用着试试吧。
wyhui1987 2013-07-02
  • 打赏
  • 举报
回复
引用 12 楼 zhaokai1241380221 的回复:
问题解决了,错误是因为<select refid="test"></select>这里所指向的test只能由sql标签包围
什么意思没看懂
zhaokai1241380221 2013-04-27
  • 打赏
  • 举报
回复
没有弄错,我刚遇到这个问题,确实是这样解决的!真心的~~
hjing0628 2013-04-25
  • 打赏
  • 举报
回复
引用 12 楼 zhaokai1241380221 的回复:
问题解决了,错误是因为<select refid="test"></select>这里所指向的test只能由sql标签包围
您好,是弄错帖子了吧。
zhaokai1241380221 2013-04-25
  • 打赏
  • 举报
回复
问题解决了,错误是因为<select refid="test"></select>这里所指向的test只能由sql标签包围
forgetsam 2013-04-25
  • 打赏
  • 举报
回复
1 在方法加@Arg或者@Param注解,设定statement的使用方式 2 把方法分散到3个不同接口里。
  • 打赏
  • 举报
回复
那就改为同步的呗
hjing0628 2013-04-25
  • 打赏
  • 举报
回复
引用 8 楼 fangmingshijie 的回复:
那就应该是Statements没有关闭,又使用造成的
感谢回复! 昨天搜索到老外的帖子也是这种情况,但是没出方案: http://mybatis-user.963551.n3.nabble.com/Exception-while-first-calling-after-deploying-application-td2185049.html
  • 打赏
  • 举报
回复
那就应该是Statements没有关闭,又使用造成的
hjing0628 2013-04-25
  • 打赏
  • 举报
回复
引用 6 楼 fangmingshijie 的回复:
#{ud_id,jdbcType=VARCHAR},#{ud_name,jdbcType=VARCHAR},#{ud_address,jdbcType=VARCHAR}这句什么意思?没看明白? values (#ud_id:VARCHAR#, #ud_name:VARCHAR#,#ud_address:VARCHAR#);//这样的到时见过
都可以,去掉VARCHAR注释也行。 另外: 1 页面$(document).ready后ajax请求后台的三个方法改为async:false同步方式就不会报错。 2 第一次报错后,再异步方式执行方才的ajax请求也不会报错。 就是第一次请求,总有1-2个查询失败,报java.lang.IllegalArgumentException: Mapped Statements collection already contains
  • 打赏
  • 举报
回复
#{ud_id,jdbcType=VARCHAR},#{ud_name,jdbcType=VARCHAR},#{ud_address,jdbcType=VARCHAR}这句什么意思?没看明白? values (#ud_id:VARCHAR#, #ud_name:VARCHAR#,#ud_address:VARCHAR#);//这样的到时见过
hjing0628 2013-04-25
  • 打赏
  • 举报
回复
dao为interface,没有sql,例如: @Repository public interface ProduceDAO { void insertProcUdInfo(ProcRecordPO vo) throws DataAccessException; void insertProcWorkInfo(ProcRecordPO vo) throws DataAccessException;} xml为sql文件:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xxxx.persistence.dao.ProduceDAO"> <insert id="insertProcUdInfo" parameterType="procRecordPO"> INSERT INTO t_proc_xxxx ( UD_ID,UD_NAME,UD_ADDRESS ) VALUES ( #{ud_id,jdbcType=VARCHAR},#{ud_name,jdbcType=VARCHAR},#{ud_address,jdbcType=VARCHAR} ) </insert> ...
hjing0628 2013-04-25
  • 打赏
  • 举报
回复
dao为interface,没有sql:
hjing0628 2013-04-25
  • 打赏
  • 举报
回复
dao为interface,没有sql:
lvzg_005 2013-04-25
  • 打赏
  • 举报
回复
你是不是在dao方法上注解了sql语句,并且在配置文件中又提供了一条sql呢
  • 打赏
  • 举报
回复
看看你的配置文件

81,117

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧