时隔16年JeffBarr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

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

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

关注

评论

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

YashanDB数据库隔离级别设置及应用场景

数据库砖家

哈尔滨二级等保:为中小企业网络安全筑牢坚实防线

等保测评

外资企业购买堡垒机必要性简单分析

行云管家

网络安全 数据安全 堡垒机

谁是中国第一台光子CT的创造者,水落石出

先锋IT

YashanDB数据库高可用配置及演练实务

数据库砖家

YashanDB数据库高性能设计及优化实战分享

数据库砖家

YashanDB数据库高性能数据查询引擎详解

数据库砖家

从入门到实战:一文掌握微服务监控系统 Prometheus + Grafana

左诗右码

自动化智能体体系介绍

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

通义万相即将开源一款「语音转视频」模型;微软开源长篇幅、多角色 TTS 模型 VibeVoice丨日报

声网

使用Amazon Verified Permissions快速为Express应用API添加安全防护

qife122

25年贵州等保测评机构名单(已整理)

行云管家

等保 等保测评 等保合规

YashanDB数据库更新及维护的最佳实践

数据库砖家

数据流向何方?一文掌握 Apache SeaTunnel Sink 连接器全生态 (2024版)

白鲸开源

大数据 开源 数据同步 数据集成 Apache SeaTunnel

仓颉之反射和注解的神秘力量

华为云开发者联盟

注解 反射 仓颉 华为开发者空间

YashanDB数据库功能介绍及应用场景分析

数据库砖家

哈尔滨等保测评:为城市数字化转型筑牢安全屏障

等保测评

大数据时代的新闻数据分析:舆情研判与决策支撑

沃观Wovision

数据分析 新闻 沃观Wovision

YashanDB数据库高效备份恢复操作详解

数据库砖家

YashanDB数据库高效索引设计及维护技巧

数据库砖家

YashanDB数据库高性能存储引擎设计

数据库砖家

GreatSQL优化技巧:手动实现谓词下推

GreatSQL

YashanDB数据库高性能数据写入优化实践解析

数据库砖家

YashanDB数据库故障恢复流程详解与实操指南

数据库砖家

星环科技ArgoDB:以“硬件-生态-合规”三轴驱动,构建国产化替代的产业引擎

星环科技

AI应用进化论(上):Fabarta个人专属智能体如何找准场景与功能

Fabarta

人工智能 智能体 AI助手

黑龙江等保测评:筑牢网络安全防线的基石

等保测评

精准测试平台

测试人

Apache SeaTunnel闪耀2025中国数据库技术大会,荣获「年度优秀技术团队奖」

白鲸开源

数据库 大数据 数据同步 数据集成 Apache SeaTunnel

学Go必看的进阶面试题「刷起来」

王中阳Go

Go 面试题

ManageEngine卓豪-衡量事件响应影响指标-MTTR

ServiceDesk_Plus

ManageEngine卓豪

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