Caused by: java.sql.SQLException: Can‘t call commit when autocommit=true 踩坑

在使用spark将hive中的数据导出到Mysql的时候遇到这个一个错误

Caused by: java.sql.SQLException: Can't call commit when autocommit=true
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:934)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
        at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1646)
        at com.alibaba.druid.pool.DruidPooledConnection.commit(DruidPooledConnection.java:756)
        at com.syswin.d_toon_user_info_new$$anonfun$main$1.apply(xxxx.scala:107)
        at com.syswin.d_toon_user_info_new$$anonfun$main$1.apply(xxxxx.scala:56)
        at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$29.apply(RDD.scala:928)
        at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$29.apply(RDD.scala:928)
        at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2071)
        at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2071)
        at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
        at org.apache.spark.scheduler.Task.run(Task.scala:109)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:344)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

这个错误的大概意思就是当自动属性值为true是无法call commit。
如果不在代码中指定,conn.setAutoCommit()的值默认为true,这就意味着当执行DDL操作时候都会自动提交到数据库,无法回滚事务;当指定conn.setAutoCommit()为false时,意味着只有程序调用connection.commit()的时候才会将先前执行的语句一起提交到数据库,这样就实现了数据库的事务。
两者的主要区别就是当参数为true时sql命令的提交由驱动程序负责,当参数为false时sql命令的提交由由应用程序负责,程序必须调用commit或者rollback方法。
所以解决这个问题的方法就是将自动提交改成手动提交即可,也就是令autocommit=false。

上一篇:Caused by: java.lang.IllegalArgumentException: error Type referred to is not an annotation type: xxx


下一篇:⭐算法入门⭐《二分枚举》简单05 —— LeetCode 744. 寻找比目标字母大的最小字母