代码之家  ›  专栏  ›  技术社区  ›  Shiraz Bhaiji

针对DB2表的性能事务范围

  •  1
  • Shiraz Bhaiji  · 技术社区  · 13 年前

    我们正在努力找出性能问题的原因。

    我们有一个表,其中只有一行包含主键和计数器。在事务中,我们读取计数器的值,将值增加一并保存新值。

    读取和更新是使用实体框架完成的,我们使用可序列化的事务范围,我们需要确保计数器值只读取一次。

    大多数情况下,这需要0.1秒,有时需要超过1秒。关于为什么会发生这种情况,我们一直找不到任何模式。

    其他人在使用事务范围时是否经历过可变性能?删除使用事务范围并直接在连接上设置事务会有帮助吗?

    2 回复  |  直到 13 年前
        1
  •  3
  •   bhamby    12 年前

    我记得很久以前就对这个问题发表过评论,但最近我所在商店的一些开发人员已经开始使用TransactionScope,并且也遇到了性能问题。在尝试 search for some information ,这在谷歌搜索结果中出现得相当高。

    我们遇到的问题是,显然将命令(INSERT等)与 BeginChain 使用时不起作用 TransactionScope (至少在我们正在运行的客户端v9.7.4.4连接到DB2z/OS v10的版本上)。

    我想我会为我们遇到的问题留下一个变通办法(在TransactionScope下运行大量[1k+]的INSERT时性能较慢,但在删除作用域并允许链接时运行良好)。我真的不确定它是否会直接帮助最初的问题,但如果您查看IBM.Data.DB2.dll类,则可以选择一些选项,这些选项允许您使用DB2DataAdapter和底层DataTable更新行。

    以下是VB.NET中的一些示例代码:

    Private Sub InsertByBulk(tableName As String, insertCollection As List(Of Object))
        Dim curTimestamp = Date.Now
    
        Using scope = New TransactionScope
            'Something that opens a connection to DB2, may vary
            Using conn = GetDB2Connection()
                'Dumb query to get DataTable from the ResultSet
                Dim sql = String.Format("SELECT * FROM {0} WHERE 1=0", tableName)
    
                Using adapter = New DB2DataAdapter(sql, conn)
                    Using table As New DataTable
                        adapter.FillSchema(table, SchemaType.Source)
    
                        For Each item In insertCollection
                            Dim row = table.NewRow()
                            row("ID") = item.Id
                            row("CHAR_FIELD") = item.CharField
                            row("QUANTITY") = item.Quantity
                            row("UPDATE_TIMESTAMP") = curTimestamp
                            table.Rows.Add(row)
                        Next
    
                        Using bc = New DB2BulkCopy(conn)
                            bc.DestinationTableName = tableName
                            bc.WriteToServer(table)
                        End Using 'BulkCopy
                    End Using 'DataTable
                End Using 'DataAdapter
            End Using 'Connection
            scope.Complete()
        End Using
    End Sub
    
        2
  •  1
  •   Shiraz Bhaiji    13 年前

    我们现在已经解决了这个问题。

    问题的根源在于DB2提供程序不支持事务提升。这导致事务作用域对所有事务都使用MSDTC分布式事务。

    我们用数据库连接上设置的事务替换了事务范围的使用。

    然后,包含问题中代码的复合服务从3秒减少到0.3秒。

    推荐文章