数据库JDBC使用多核与隔离级别开销

时间:2011-06-14 12:39:45

标签: database multithreading performance jdbc isolation-level

喂,

我想使用JDBC将数据存入多核系统的数据库中。我正在考虑在我的应用程序中生成多个线程,以平行插入数据。

如果应用程序有多个线程,我将不得不将隔离级别提高到Repeatable Read,这应该将MVCC数据库映射到Snapshot isolation

如果我使用一个线程,我不需要隔离级别。据我所知,大多数Snapshot isolation数据库分析可能存在冲突的所有事务的写集,然后回滚除了一个真正的冲突事务之外的所有事务。更具体地说,我在谈论Oracle,InnoDB和PostgreSQL。

1。)写集的分析是否昂贵?

2.。)为了获得更高的总吞吐量,多线程插入是一个好主意吗?真正的冲突几乎是不可能的,因为应用层为线程提供无冲突的东西。但数据库应该是一个安全网。

2 个答案:

答案 0 :(得分:1)

我认为这里的限制因素是磁盘IO,而不是转移到Repeatable Read的开销。

即使是单个线程也可以最大化数据库服务器上的磁盘,尤其是插入/更新时需要的DB日志记录量。你确定不是这样吗?

此外,在任何多用户系统中,您可能希望以可重复读取隔离的方式运行(Postgres仅支持此并且可序列化)。因此,我不认为这会增加任何“开销”,而不是我通常会看到的。

答案 1 :(得分:1)

Oracle不支持Repeatable Read。它仅支持Read Committed和Serializable。我可能会弄错,但为Repeatable Read for Oracle设置隔离级别可能会导致隔离级别为Serializable的事务。简而言之,您可以依赖数据库支持您所需的隔离级别。

我不能代表InnoDB和PostgreSQL,但如果它们不支持所需的隔离级别,则同样适用。数据库可以自动将隔离级别升级到更高级别,以满足所需的隔离特性。如果您的应用程序所需的隔离级别必须是可重复读取,那么您应该重新考虑这种方法。

您正确推断的问题是,如果检测到冲突,乐观锁定可能会导致事务回滚。 Oracle通过报告ORA-08177 SQL错误来实现此目的。由于当两个线程将访问相同的数据范围时会报告此错误,因此如果线程针对涉及不同数据范围的数据集,则可以避免此错误。在跨线程划分工作时,您必须确保这种情况。