Database “什么是?”;启用自动提交时无法提交”;误差平均值?

Database “什么是?”;启用自动提交时无法提交”;误差平均值?,database,postgresql,Database,Postgresql,在我的程序中,池中有几个线程,每个线程都试图写入数据库。创建的线程数是动态的。当创建的线程数只有一个时,所有线程都可以正常工作。但是,当有多线程执行时,我得到一个错误: org.apache.ddlutils.DatabaseOperationException:org.postgresql.util.PSQLException:启用自动提交时无法提交。 我猜,也许因为每个线程都并行执行,所以两个线程试图同时写入,并给出了这个错误 你认为是这样吗?如果不是,是什么导致了这个错误 否则,如果我说的

在我的程序中,池中有几个线程,每个线程都试图写入数据库。创建的线程数是动态的。当创建的线程数只有一个时,所有线程都可以正常工作。但是,当有多线程执行时,我得到一个错误:

org.apache.ddlutils.DatabaseOperationException:org.postgresql.util.PSQLException:启用自动提交时无法提交。

我猜,也许因为每个线程都并行执行,所以两个线程试图同时写入,并给出了这个错误

你认为是这样吗?如果不是,是什么导致了这个错误


否则,如果我说的是问题所在,我能做些什么来解决它呢?

在jdbc代码中,您应该在获取连接后立即关闭自动提交。大概是这样的:

DataSource datasource = getDatasource(); // fetch your datasource somehow
Connection c = null;
try{
  c = datasource.getConnection();
  c.setAutoCommit(false);

这行得通。。但你能解释一下为什么这样做,以及这样做是否有任何不利之处吗?!当然自动提交是一种数据库连接设置,每当执行DML语句(UPDATE、INSERT或DELETE)时,自动开始并提交数据库事务。这简化了某些编程任务,并减少了简单db操作所需的样板文件。但是,如果您正在运行多个依赖语句,并且希望确保它们都成功(即,如果其中任何语句失败或引发异常,则所有语句都不会生效),则需要关闭自动提交功能,并手动开始/提交事务,这也更有效。好的,因此这仅适用于事务。。。不是正常更新吗?在我的线程中,我不会在最后调用
commit()
。如果不调用
commit
,则所做的任何更改都不会持久化到数据库中。完成更改后,应调用
commit()