写点什么

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

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

关注

评论

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

NFTScan | 09.16~09.23 NFT 市场热点汇总

NFT Research

NFT\ NFTScan

Web3 星探 a16z 新加速器启动,盘点入围的「未来之星」

TechubNews

DApp开发入门指南:从概念到实践!DApp开发流程+DApp 经济模型

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

2024开放原子开源生态大会 | 双轮驱动,开源生态建设从“幼苗”成长为“大树”

极客天地

资深ETL工程师经验分享:ETL项目的5大挑战与策略

RestCloud

数据处理 ETL 数据集成 集成工具

抖音商品SKU数据接口深度解析:解锁Dy.item_sku的电商新纪元

代码忍者

API 测试 pinduoduo API

高并发设计之细粒度锁 : 5种细粒度锁的设计技巧图解(高并发篇)

肖哥弹架构

Java 乐观锁 悲观锁 高并发

堡垒机啥意思?怎么简单理解?

行云管家

网络安全 堡垒机

VMware Tanzu Kubernetes Grid 2.5.2 发布下载,新增功能概览

sysin

Kubernetes 云原生 vmware Tanzu

机构加仓生态良好 比特币牛市延续有戏

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 代币开发

快速生成应用:AI大模型与低代码平台如何无缝结合提升效率?

天津汇柏科技有限公司

低代码 AI 人工智能

无代码/低代码平台集成能力深度分析

NocoBase

低代码 无代码 集成能力

信创里程碑:TapData 与海量数据达成产品兼容互认证,共同助力基础设施国产化建设

tapdata

数据库

Cisco Jabber 15.0 发布下载 - 面向企业的多合一通信工具

sysin

Cisco 通信 思科 即时消息

DBeaverEE:专业级数据库管理工具,让数据管理更高效

Rose

研究揭秘生成式AI惊人耗水量!训练1个模型相当于165人1年总用水量!武汉大学首个人形机器人“天问”|AI日报

可信AI进展

基于微信小程序的竞赛答题小程序开发笔记(一)

CC同学

MongoDB 双活集群在运营商的实践

tapdata

数据库

丽江等级保护测评机构有几家?在哪里?

行云管家

等保 丽江 等保测评

Cellebrite UFED 4PC 7.70 下载 - Android 和 iOS 移动设备取证软件

sysin

ios android UFED 移动取证 手机取证

macOS Sonoma 14.7 (23H124) Boot ISO 原版可引导镜像下载

sysin

macos ISO Sonoma

使用 fabric.js 开发移动端 H5 图片编辑器细节

秦少卫

Fabric.js 图片编辑器 开源图片编辑器 开源vue图片编辑器 vue图片编辑器

Nginx配置最全详解(万字图文总结)

江南一点雨

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