2017-07-26 203 views
1

我正在调查SQLServerBulkCopy类,以便将大容量插入到数据库中。目前,我正在使用JDBC,当我尝试执行一个错误的插入时,我可以捕获一个BatchUpdateException来找出导致问题的行。SQLServerBulkCopy错误处理

SQLServerBulkCopy如何处理错误行,我可以做类似的事吗?

+0

你见过[this](https://docs.microsoft.com/en-us/sql/connect/jdbc/using-bulk-copy-with-the-jdbc-driver#BKMK_TransactionBulk)吗? “执行非事务批量复制操作”部分对默认行为有很好的描述。 –

+0

谢谢你。然而,我仍然不清楚,在非交易操作中,如果我有10k行,它是在做10K插入语句并在每一行之后提交?如同,我是否会受到巨大的业绩影响?另外,他们通过查询数据库来检查添加了多少行 - 这些数据在java中不可用? – Steve

回答

1

“如何SQLServerBulkCopy处理错误行”

如果.writeToServer遇到一个错误,它抛出是从服务器返回的例外,例如,

com.microsoft.sqlserver.jdbc。 SQLServerException:违反PRIMARY KEY约束'PK __#tmp______3213E83F719D9EEE'。不能在对象'dbo。#tmp'中插入重复键。重复的键值是(1)。

 
“如果我有10K行是做10K INSERT语句和每一个后犯?”

不,它发送一条INSERT BULK语句,然后根据SQLServerBulkCopyOptions#setBatchSize将批量的行传送到服务器。默认的批量大小为零(0),这意味着它可以有效地一次性传输所有10K行。对于大于0的批量,它将流式传输许多行,然后重复INSERT BULK进程,直到所有行都被复制。

如果遇到一个错误,the documentation表示:

在该第一示例中,大容量复制操作是非事务处理。复制到错误点的所有批次都已提交;包含重复密钥的批处理将回滚,并且在处理其他任何批处理之前停止批量复制操作。

 
“是在java中不可用[实际复制的行数]?”

它似乎没有。 .writeToServer返回void,并且似乎没有提供该信息的SQLServerBulkCopy对象的属性。

+0

谢谢,这是一个无赖,但并不完全意外。看起来我们将不得不在性能和日志记录之间进行选择。感谢您的确认! – Steve