oracle.jdbc.driver.OracleDriver操作耗时:1毫秒java.sql.SQLException:自动提交功能设置为启用时无法提交atoracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java... oracle.jdbc.driver.OracleDriver
操作耗时:1毫秒
java.sql.SQLException: 自动提交功能设置为启用时无法提交
at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4443)
at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4490)
at day02.dao.BaseDAO.commit(BaseDAO.java:93)
at day02.dao.UserInfoDAO.save(UserInfoDAO.java:49)
at day02.dao.UserInfoDAO.main(UserInfoDAO.java:91)

这里是出问题的方法,麻烦大神看看什么问题?
public boolean save(List<UserInfo> userInfos){
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
PreparedStatement state =
conn.prepareStatement(INSERT);

long start = System.currentTimeMillis();
for (UserInfo userInfo:userInfos) {
state.setString(1, userInfo.getName());
state.setString(2, userInfo.getPassword());
state.setInt(3, userInfo.getAge());
state.setString(4, userInfo.getSex());
state.setString(5,userInfo.getEmail());
state.addBatch();
}
state.executeBatch();//批处理执行前缓存的所有sql
commit();
long end = System.currentTimeMillis();
System.out.println("操作耗时:"+(end-start)+"毫秒");
return true;//返回true,告知调用者保存成功
} catch (Exception e) {
e.printStackTrace();
//若执行过程出错,回滚事物
rollback();
} finally{
closeConnection(conn);
}
return false;
}
//主程序
public static void main(String[] args) {
UserInfoDAO dao = new UserInfoDAO();
dao.save(new ArrayList());
}
在线等啊。。
这个是调用的线程方法,就是改完conn.setAutoCommit(false);后报的错,为啥报这个错啊”java.sql.SQLException: 自动提交功能设置为启用时无法提交“
conn.setAutoCommit(false);你设置了这个,对应的执行完成之后就要对应加个conn.commit();这两个是要同时存在的,如果不加conn.setAutoCommit(false);就不用加conn.commit();
Connection conn = localConn.get();
if (conn != null) {
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
  这是我的commit(),没问题啊,显示说自动提交设为启用,我不是设的关闭false么?
commit();这里的commit提交的不是 conn = getConnection();conn.setAutoCommit(false);这里的conn,而只是执行了commit()这个方法里面的东西。
而commit()方法中Connection conn = localConn.get();这里的conn没有设置conn.setAutoCommit(false);这个啊,可是你下面又conn.commit();的,这里不能这么写的,你要么把conn.commit()去掉,要么在Connection conn = localConn.get();这后面加个设置自动提交关闭(conn.setAutoCommit(false);),并不是程序有一个地方设置了关闭自动提交,其它地方就不用了,只要用到conn.commit();那么对应的conn就必须要有conn.setAutoCommit(false);
大神,照你这么说是可以,不过有一个疑问
private static ThreadLocal localConn
= new ThreadLocal();
这个定义的同一个线程吗?找你这么说这里出现两个线程了是么?为啥会这样?Connection conn = localConn.get();
可以理解成你程序出现了两个数据库连接,因为在conn = getConnection();这里已经定义了一个conn了,Connection conn = localConn.get();这里你又重新定义了一个conn,这两个代表的不是同一个数据库连接,而是两个单独的。至于ThreadLocal这个类,只是一个线程局部变量,并不是一个Thread。你可以去找找资料连接一下ThreadLocal具体用法。
本回答被提问者采纳