zoukankan      html  css  js  c++  java
  • 在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();
        }
    }

  • 相关阅读:
    IO模式和IO多路复用详解
    消息队列RabbitMQ、缓存数据库Redis
    rest framework认证组件和django自带csrf组件区别详解
    django进阶之缓存
    关于CSRF攻击详解
    Linux学习常用命令大全
    .NET 开源工作流: Slickflow流程引擎基础介绍(四) -- 多数据库支持实现
    .NET 开源工作流: Slickflow流程引擎基础介绍(三) -- 基于HTML5/Bootstrap的Web流程设计器
    .NET 开源工作流: Slickflow流程引擎基础介绍(二) -- 引擎组件和业务系统的集成
    .NET开源敏捷开发框架: SlickOne介绍(一) -- 基于Dapper, Mvc和WebAPI 的快速开发框架
  • 原文地址:https://www.cnblogs.com/l1pe1/p/2024908.html
Copyright © 2011-2022 走看看