50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

在 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:152452
用户头像

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

关注

评论

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

TS中, Array.reduce提示没有与此调用匹配的重载?

林十二XII

浅谈HPC中的Lustre

天翼云开发者社区

Linux 架构 存储

PDCA循环——快速提升软件质量的必备工具

敏捷开发

Scrum 敏捷开发 精益管理 PDCA循环

安全可信 | 首批!天翼云边缘安全加速平台AccessOne通过信通院“软件自研创新能力”专项评估

天翼云开发者社区

云计算 云服务

走难而正确的路!AI时代,传统产业数字化建设必须更高、更快、更强

爱倒腾的程序员

涛思数据 时序数据库 ​TDengine

inBuilder今日分享丨RESTful API动态发布技术

inBuilder低代码平台

软件测试/测试开发丨Pytest结合数据驱动-Excel

测试人

程序员 软件测试 Excel 数据驱动 pytest

逾百位开发者到场,超 2 万人线上观看!龙蜥社区开发者服务 devFree MeetUp 精彩回顾来啦

OpenAnolis小助手

开源 Meetup 龙蜥社区 龙蜥大讲堂 开发者服务

如何有效管理爬虫流量?

天翼云开发者社区

网络安全 爬虫

2023年三个最佳的免费PostgreSQL GUI工具

wljslmz

6 月 优质更文活动

HMI和SCADA的定义 两者有什么不同

2D3D前端可视化开发

组态软件 工业自动化 SCADA 工业组态 HMI

一文读懂火山引擎A/B测试的实验类型(1)——编程实验

字节跳动数据平台

A/B 测试

模糊测试不“模糊”,高效发掘未知漏洞与 0day 攻击

极狐GitLab

DevOps 安全 DevSecOps 黑盒测试 模糊测试

软件测试/测试开发丨Pytest结合数据驱动-yaml

测试人

程序员 软件测试 yaml 数据驱动 pytest

重磅活动 | 腾讯云智能推出首期《人工智能集训营》

牵着蜗牛去散步

人工智能 腾讯云 腾讯 教育 AI集训营

生态伙伴 | 华秋硬创联合湾加速,共同加速企业发展

华秋电子

了解模型的元学习:Learning to Learn优化策略和Meta-Learner LSTM

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

华秋亮相汽车电子研讨会,展出智能座舱方案、高可靠PCB板

华秋电子

一文带你读懂稳压器(内含厂商 3PEAK 新品推荐!)

华秋电子

全球企业KVM贡献榜公布,腾讯云再添1项核心突破

说山水

毕业季618双节狂欢!来华为阅读享品质阅听,0元读好书

最新动态

英特尔发布全新量子芯片Tunnel Falls,硅自选量子比特有望更快实现量产

E科讯

可观测性最佳实践|怎样让运维和开发协同保障系统稳定性

观测云

可观测性 观测云 云原生可观测 可观测性用观测云

以指标驱动,企业数智化迈向新阶段

Kyligence

数字化转型 指标驱动

如何在 Linux 上使用 `find` 和 `locate` 进行文件搜索?

wljslmz

6 月 优质更文活动

视频编码耗时长、编码帧发送失败…DVPP视频编码问题典型案例分析

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

Python初学者友好丨详解参数传递类型

华为云开发者联盟

Python 人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

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