写点什么

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

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

关注

评论

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

YashanDB数据库动态扩缩容功能详解及应用

数据库砖家

搜索百科(5):Easysearch — 自主可控的国产分布式搜索引擎

极限实验室

搜索引擎 elasticsearch 国产替代 easysearch 搜索百科

企业内部通讯工具,这个软件功能简要看一下!

BeeWorks

即时通讯 IM 私有化部署

YashanDB数据库的性能优化与维护指南

数据库砖家

YashanDB数据库的自动化运维工具及其使用方法

数据库砖家

QMS选型的本质与AI质检的终极赋能​

万界星空科技

QMS 质量管理QMS系统 AI质检 AI工业质检 万界星空科技QMS

5 倍性能优于开源版,火山 Milvus 集成 DiskANN+RaBitQ

火山引擎开发者社区

火山引擎

YashanDB行业应用

数据库砖家

YashanDB数据库对接物联网平台的关键技术分析

数据库砖家

YashanDB数据库的异步事务处理机制详解

数据库砖家

YashanDB数据库对异构数据源的集成能力研究

数据库砖家

Kubernetes 场景下的 StarRocks 灾备体系:Cluster Snapshot 实践解析

StarRocks

Kubernetes StarRocks 存算一体架构 数据的备份 Cluster Snapshot

YashanDB数据库的行业标准与合规性要求

数据库砖家

《汽车行业Data+AI数智化转型白皮书》重磅发布!驱动车企智造升级

袋鼠云数栈

解决方案 白皮书 汽车行业 Data+AI 袋鼠云

YashanDB数据库的用户权限管理与安全措施

数据库砖家

一文读懂字符与编码

非专业程序员Ping

swift iOS Document Apple Developer ios 开发

从设备到云:绿电直连系统分层模型(感知-边缘-平台-应用)

西格电力

新能源产业 绿色能源转型 零碳园区 能源可再生 绿电直连

当企业IM成为泄密通道:你的聊天群安全吗?

BeeWorks

即时通讯 IM 私有化部署

YashanDB数据库的未来技术发展与创新方向

数据库砖家

凌晨三点,你的眼睛还撑得住吗?——聊聊程序员「夜战」的真实成本!

bug菌

开发工具

vivo 前端三剑客发展历程及原理揭秘

vivo互联网技术

前端 工具 抓包 远程调试 录制

YashanDB数据库的主流技术架构及应用分析

数据库砖家

YashanDB数据库对接大数据平台的技术要点与实践经验

数据库砖家

具身智能破壁者Dexmal原力灵机,靠Dexbotic开启加速时代

脑极体

AI

利用 CloudWatch AIOps 实现智能化根因分析与故障排查

亚马逊云科技 (Amazon Web Services)

哈尔滨三级等保:安全属性、适用场景及与二级等保差异

等保测评

在钢结构上安装LED屏技巧

Dylan

广告 广告业 LED LED display LED屏幕

哈尔滨二级等保:办理核心流程与日常运维

等保测评

轻帆云ITSM重塑零售连锁 IT 服务,驱动门店智能高效运营

云智慧AIOps社区

ITSM软件 ITSM解决方案 工单管理系统 工单管理软件 IT工单管理

火山方舟原生支持自持密钥 HYOK|密钥管理最佳实践

火山引擎开发者社区

方舟 火山方舟

优化 YashanDB 数据库的用户体验

数据库砖家

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