7
回答
mybatis多行语句执行出错,已经排查3天了!! allowMultiQueries
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

 mybatis多行语句执行出错

  不能上传图片,排版有点不好.

架构:
     springmvc 4.0.0.9+mybatis-3.2.2  已经设置allowMultiQueries

执行4个sql语句出错:(数据都写死了)

    delete from sddm_api_description where api_id=47;
    delete from sddm_request_header where api_id=47;
    delete from sddm_response_header where api_id=47;
    delete from sddm_request   where api_id=47;
    delete from sddm_response where api_id=47;
    delete from sddm_parameter  where api_id= 47

这是用wireshark抓包的结果:(说明确实是数据库返回了语法错误)

Frame 309: 305 bytes on wire (2440 bits), 305 bytes captured (2440 bits) on interface 0
Ethernet II, Src: CiscoInc_16:fd:c1 (b0:aa:77:16:fd:c1), Dst: Apple_ed:5a:d7 (d0:a6:37:ed:5a:d7)
Internet Protocol Version 4, Src: 120.27.123.102, Dst: 10.0.93.251
Transmission Control Protocol, Src Port: 3306 (3306), Dst Port: 57942 (57942), Seq: 564, Ack: 1220, Len: 239
MySQL Protocol
    Packet Length: 235
    Packet Number: 1
    Error Code: 1064
    SQL state: 42000
    Error message [truncated]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'delete from sddm_request_header where api_id=47;\n    delete from sddm_respon


这是错误提示:
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;

这是连接sql:

jdbcurl=${jdbcurl}?characterEncoding=UTF-8&allowMultiQueries=true

     mybatis的配置是普通配置,没有配置特别的

       最终结果说明allowMultiQueries这个参数没有生效....


解决办法1(不可行): 拆分语句

      4条语句可以拆,但是这是整个结构的问题,我的其它sql语句也有同样的问题,必须解决的

求来一个大神


举报
布尔值
发帖于1年前 7回/1K+阅
共有7个答案 最后回答: 1年前

问题已经解决,分享下.根本原因有2个!

1,spring框架中连接池配置有问题!,导致每次请求都新建连接

提示为:
[DEBUG] 2016-11-01 17:49:16 :Initiating transaction commit
[DEBUG] 2016-11-01 17:49:16 :Committing JDBC transaction on Connection [jdbc:mysql://xxxxx/sddm<----!!参数不见了!!---->, UserName=xxxxxx, MySQL Connector Java]
[DEBUG] 2016-11-01 17:49:16 :Releasing JDBC Connection [jdbc:mysql://xxxxx:3306/sddm?characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&useSSL=false, UserName=xxxxxx, MySQL Connector Java] after transaction
[DEBUG] 2016-11-01 17:49:16 :Returning JDBC Connection to DataSource

2,原因2,pom中配置了变量和proprites中的变量名重名!
pom中的配置:

<jdbcurl>jdbc:mysql://127.0.0.1:3306/sddm</jdbcurl>
properties:
jdbcurl=${jdbcurl}?characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&useSSL=false

重要的事说2遍:

当打包成war, pom.xml中的变量和propertis中变量会fu盖--遇到过2次了!!!(这个问题很隐蔽,因为运行mvn run时不显示出来)

当打包成war, pom.xml中的变量和propertis中变量会fu盖--遇到过2次了!!!(这个问题很隐蔽,因为运行mvn run时不显示出来)

jdbcurl=${jdbcurl}?characterEncoding=UTF-8&allowMultiQueries=true

你这个配的对吗??????

是?allowMultiQueries=true而不是&allowMultiQueries=true,是问号,是问号,是问号不是&&&

不要意思,我刚误导楼主了,你的配置没错,没看见前面还有个?characterEncoding=UTF-8,不过我觉得刚楼上说的没错,delete前面怎么多了个\n,你再看看

引用来自“kaiqing”的评论

可能是sql语句中回车符号\n的问题
回车没有问题的,因为上条语句也是有回车的:
这是抓包的结果:有证据的
Frame 291: 801 bytes on wire (6408 bits), 801 bytes captured (6408 bits) on interface 0
Ethernet II, Src: Apple_ed:5a:d7 (d0:a6:37:ed:5a:d7), Dst: CiscoInc_16:fd:c1 (b0:aa:77:16:fd:c1)
Internet Protocol Version 4, Src: 10.0.93.251, Dst: 120.27.123.102
Transmission Control Protocol, Src Port: 57942 (57942), Dst Port: 3306 (3306), Seq: 128, Ack: 370, Len: 735
MySQL Protocol
    Packet Length: 731
    Packet Number: 0
    Request Command Query
        Command: Query (3)
        Statement [truncated]: update pro_api\n         SET page_id = 4,\n            \n            \n                history = '3',\n            \n            \n                `name` = 'A',\n            \n            \n                api_type =
是成功的
那我就不知道了,不过我看你mybatis版本还是3.2.2的,会不会跟这个有关啊,要不你试下3.2.8版本的或者最新版本
顶部