AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

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

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

关注

评论

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

基于亚马逊云科技无服务器服务快速搭建电商平台——性能篇

亚马逊云科技 (Amazon Web Services)

云原生

不只致富,更要守富

少油少糖八分饱

财富自由 搞钱 致富 守富

ARTS 打卡第 18 天

自由

ARTS 打卡计划

ARTS 打卡02

AI帅辉

ARTS 打卡计划

纯前端,不要后端,开发一个项目

图颜有信

前端

文心一言 VS 讯飞星火 VS chatgpt (82)-- 算法导论8.1 1题

福大大架构师每日一题

福大大架构师每日一题

R语言之缺失值处理

timerring

R语言

ARTS 打卡 第一周,ARTS我来啦!

闫同学

ARTS 打卡计划

Zebec在Nautilus Chain 开启质押,ZBC 将极致通缩

鳄鱼视界

音量控制:Sound Control for Mac激活最新资源

胖墩儿不胖y

Mac软件推荐 音量控制软件 音量控制

C++友元函数和友元类

芯动大师

ARTS打卡第二周

穿过生命散发芬芳

ARTS 打卡计划

ARTS打卡第二周

请务必优秀

Presto 设计与实现(九):SQL 词法分析

冰心的小屋

数据湖 词法分析器 presto 设计与实现

ARTS 打卡第 2 周

Johnson

AI arts

如何学习

石小天

学习 学习方法 如何学习 技术学习

Kafka为什么这么快?

越长大越悲伤

Java kafka

关于RocketMQ的高可用

M

原创 RocketMQ 高可用

2023 ARTS 02

MiracleWong

ARTS 打卡计划

ARTS 0825 打卡

冰封的鸢尾花

ARTS 打卡计划

ARTS 打卡第 2周

Geek_wu

ARTS 打卡计划

ARTS 打卡第 2 周

atom

工赋开发者社区 | 以智能制造为主攻方向,扎实推进新型工业化

工赋开发者社区

工赋开发者社区 | 工业智能化背景下制造业大数据的应用

工赋开发者社区

探索 React 初体验:从零开始构建你的第一个应用

麦田的守望者

探索以太坊:智能合约、代币发行与去中心化应用

麦田的守望者

Presto 设计与实现(十):SQL 语法分析

冰心的小屋

数据湖 语法分析器 presto 设计与实现

ARTS打卡第二周

犇犇

ARTS 打卡计划

ARTS第二周

壹贰叁

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