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();
        }
    }

  • 相关阅读:
    append 注意事项
    列表与字符串转换
    删除列表元素
    段寄存器
    通用寄存器
    最强大的王爽汇编语言学习环境使用教程
    JavaScript获取输入框内容
    ubuntu16.04中将python3设置为默认
    Django之cookie和session
    postman 安装桌面版
  • 原文地址:https://www.cnblogs.com/l1pe1/p/2024908.html
Copyright © 2011-2022 走看看