• 在TransactionScope中优先使用Oracle的.NET驱动


    • 摘要:分布式事务(DTx:Distributed Transaction)一直是大型应用所需的必要特性。.NET Framework 2.0开始默认提供ORACLE的ADO.NET驱动,虽然也支持通过TransactionScope隐式启动DTx,但却采用应用宿主进程外的 dllhost.exe作为独立的DTx协调器(DTC)。
    • 标签:TransactionScope  Oracle  .NET  驱动

    分布式事务(DTx:Distributed Transaction)一直是大型应用所需的必要特性,由于需要同时协调不同的数据源(例如:数据库、队列、甚至注册表和新一代操作系统的I/O),因 此启动DTx的代价相对较大,而且很多中间件服务器的DTx协调器与应用位于不同的进程中,因此对于频繁提交的OLTP操作而言性能影响较大。

    .NET Framework 2.0开始默认提供ORACLE的ADO.NET驱动,虽然也支持通过TransactionScope隐式启动DTx,但却采用应用宿主进程外的 dllhost.exe作为独立的DTx协调器(DTC)。ORACLE在自己的ADO.NET驱动中对该问题进行了显著优化,不仅对反复打开的连接提供 了默认的连接池引用重定向,而且把DTx的协调工作置于.NET CLR与应用宿主内部,对于大型应用而言可以有效的减少因跨多进程协调引发的性能损失。

    下面的示例代码采用ORACLE的ADO.NET驱动(using Oracle.DataAccess.Client)运行,从COM+的统计看并不会引起DTC调用,而如果换成微软的ORACLE ADO.NET驱动(using System.Data.OracleClient),就需要启动昂贵的DTC服务。

    private const string ConnectionString = "Data Source = localhost:1521/XE;

    User ID = scott; Password = tiger";
    private const string SqlConnectionString = "Data Source = (local);

    Initial Catalog = Northwind; Integrated Security = SSPI";
    [TestMethod]
    public void TestOracleDriver()
    {
         using (TransactionScope scope = new TransactionScope())
         {
            Oracle.DataAccess.Client.OracleConnection connection =

    new Oracle.DataAccess.Client.OracleConnection(ConnectionString);
            connection.Open();
            Oracle.DataAccess.Client.OracleCommand command = connection.CreateCommand();
            command.CommandText = "UPDATE DEPT SET DNAME = DNAME";
            command.CommandType = CommandType.Text;
            command.ExecuteNonQuery();
            // 为了模拟一个分布式数据的操作,下面还增加了一段SqlConnection的DML操作。
            SqlConnection sqlC = new SqlConnection(SqlConnectionString);
            sqlC.Open();
            SqlCommand sComm = sqlC.CreateCommand();
            sComm.CommandText = "UPDATE Products SET ProductName = ProductName";
            sComm.CommandType = CommandType.Text;
            sComm.ExecuteNonQuery();
            scope.Complete();
        }
    }

    [TestMethod]
    public void TestMicrosoftDriver()
    {
        using (TransactionScope scope = new TransactionScope())
        {
            System.Data.OracleClient.OracleConnection connection =

    new System.Data.OracleClient.OracleConnection(ConnectionString);
            connection.Open();
            System.Data.OracleClient.OracleCommand command = connection.CreateCommand();
            command.CommandText = "UPDATE DEPT SET DNAME = DNAME";
            command.CommandType = CommandType.Text;
            command.ExecuteNonQuery();
            // 为了模拟一个分布式数据的操作,下面还增加了一段SqlConnection的DML操作。
            SqlConnection sqlC = new SqlConnection(SqlConnectionString);
            sqlC.Open();
            SqlCommand sComm = sqlC.CreateCommand();
            sComm.CommandText = "UPDATE Products SET ProductName = ProductName";
            sComm.CommandType = CommandType.Text;
            sComm.ExecuteNonQuery();
            scope.Complete();
        }
    }

  • 相关阅读:
    Android Studio 字体和字号调整
    【IDEA】项目中引入Spring MVC
    【Double】double精度问题和int、long除不尽取舍问题
    【进制转换】原码反码和补码的理解以及进制转换
    【工具】SwitchHost的使用
    【工具】谷歌浏览器使用技巧
    【Git和GitHub】学习笔记
    【IE兼容性】代码中多语言样式+IE不兼容解决
    【Trello】使用指南
    【实操】进制转换:除基倒取余法
  • 原文地址:https://www.cnblogs.com/l1pe1/p/2024908.html
Copyright © 2020-2023  润新知