写点什么

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

  • 2007-12-31
  • 本文字数:1337 字

    阅读完需:约 4 分钟

分布式事务(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();
}
}

2007-12-31 21:152246
用户头像

发布了 61 篇内容, 共 12.8 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

基于 Flink CDC 打造企业级实时数据集成方案

阿里云大数据AI技术

开源

FFA 2023 「核心技术」专场: Flink 核心技术动向深度解读

Apache Flink

大数据 flink 实时计算

一文看懂JavaScript 如何实现继承

伤感汤姆布利柏

前端 低代码 Java’ java 技术提升

DaVinci Resolve Studio 18 达芬奇影视后期处理工具 支持M1

加油,小妞!

视频编辑 DaVinci Resolve Studio

静态代理IP是什么?一文看懂静态代理IP

Geek_bf375d

什么是原生IP?原生IP与住宅IP有何区别?

Geek_bf375d

ProPresenter 7 for Mac(多屏演示软件)

展初云

Mac 演示文稿制作软件 ProPresenter

软件测试 | Neo4j图数据库在人工智能应用中的实战技术与应用

测吧(北京)科技有限公司

测试

实力见证!ONES 荣获南方周末「年度科创力产品」大奖

万事ONES

获奖 研发管理软件

杉岩数据:基于鲲鹏DevKit高效开发产线质检数据智能存储管理平台,破解数据管理难题

彭飞

Beyond Compare 4 for Mac 文件同步对比工具 支持M1

加油,小妞!

Beyond Compare Beyond Compare 4

软件测试 | 金融平台封控模型实战技术:人工智能在金融风控中的应用

测吧(北京)科技有限公司

测试

悄悄上线:CSS @starting-style 新规则

伤感汤姆布利柏

CSS 前端

Redis桌面管理工具 Redis Desktop Manager最新中文版

胖墩儿不胖y

redis Mac软件

人工智能知识图谱设计技术点解析

测吧(北京)科技有限公司

测试

教你如何使用PyTorch解决多分类问题

华为云开发者联盟

人工智能 华为云 华为云开发者联盟

Moho Pro 14 for Mac(2D动画制作软件)

展初云

Mac 动画制作软件 Moho

DEVONthink 3 for Mac(文档管理软件)

展初云

Mac 文档管理软件 DEVONthink

1688 API接口测试指南

Noah

智达方通EPM,解决企业经营分析和管理难题

智达方通

企业风险管理 经营分析 经营管理

如何选择最佳独立服务器提供商?加速你的在线业务成功之路

一只扑棱蛾子

独立服务器

git 撤销某一次 commit 提交

秃头小帅oi

git 前端 低代码

大模型创业“风投”正劲,AGI Foundathon 大模型创业松活动精彩看点

飞桨PaddlePaddle

大模型 AGI 创业松

DeFi开发:DeFi中的去中心化保险世界

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

谷歌Freshness新鲜度算法:如何利用它提升网站排名?

九凌网络

如何最大化客户生命周期价值?APMDR 模型在袋鼠云的落地实践

袋鼠云数栈

大数据 数字化转型 用户生命周期 用户运营 智能标签

字节跳动AB实验经验分享:企业如何构建数据驱动的实验文化?

字节跳动数据平台

大数据 A/B 测试 对比实验

NineData:为大型房产集团数据库统一纳管,推动业务高效运行

NineData

数据库 运营 房地产 权限管理 NineData

在TransactionScope中优先使用Oracle的.NET驱动_.NET_王翔_InfoQ精选文章