写点什么

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

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

关注

评论

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

使用 XDP 和 IPVS 实现 QUIC 负载均衡

EMQ映云科技

负载均衡 QUIC协议

AI 大模型本地化部署的调试

北京木奇移动技术有限公司

AI大模型 本地化部署 软件外包公司

VMware ESXi 8.0U2d macOS Unlocker & OEM BIOS 标准版和厂商定制版

sysin

esxi

VMware ESXi 7.0U3s macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版

sysin

esxi

YashanDB字符集配置

YashanDB

数据库 yashandb

大模型本地化部署的应用场景

北京木奇移动技术有限公司

AI大模型 本地化部署 软件外包公司

洗鞋小程序(源码+文档+讲解+演示)

深圳亥时科技

YashanDB实例启停

YashanDB

数据库 yashandb

【每日学点HarmonyOS Next知识】状态栏控制、片段按钮点击回调、绘制组件、取消按钮与输入框对齐、父调子组件方法

轻口味

HarmonyOS HarmonyOS NEXT

从文件到块: 提高 Hugging Face 存储效率

伤感汤姆布利柏

淘宝图片搜索商品列表API接口全攻略

tbapi

淘宝API 淘宝拍立淘接口 淘宝图片搜索API

降价46%,Hologres Serverless Computing 快速入门

阿里云大数据AI技术

大数据 Serverless hologres 实时湖仓

DeepSeek过时了?全网刷屏的Manus到底是什么?这样写申请秒过审核

卷福同学

软著申请 ChatGPT Manus

人工智能丨Web自动化智能体核心元素解析

测试人

人工智能 软件测试 测试开发 测试平台

YashanDB归档管理

YashanDB

数据库 yashandb

AI大模型本地化部署的运行监测

北京木奇移动技术有限公司

AI大模型 本地化部署 软件外包公司

如何租赁LED显示屏:你需要考虑的一切

Dylan

活动 广告 LED显示屏 全彩LED显示屏 led显示屏厂家

【每日学点HarmonyOS Next知识】 状态变量、公共Page、可见区域变化回调、接收参数、拖拽排序控件

轻口味

HarmonyOS HarmonyOS NEXT

芯盾时代移动办公融合解决方案

芯盾时代

远程办公 iam 统一身份管理平台

VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版

sysin

esxi

AI大模型本地化部署的优化

北京木奇移动技术有限公司

AI大模型 本地化部署 软件外包公司

YashanDB参数配置

YashanDB

数据库

异构算力管理与调度:高效利用计算资源

鲸品堂

算力 企业号 2025年3月PK榜

AI与.NET技术实操系列:ML.NET篇

秃头小帅oi

培训中心教务系统(源码+文档+讲解+演示)

深圳亥时科技

有必要使用 Oracle 向量数据库吗?

秃头小帅oi

卸载YashanDB服务端

YashanDB

数据库 yashandb

智慧党建系统(源码+文档+讲解+演示)

深圳亥时科技

AI大模型本地化部署的运营

北京木奇移动技术有限公司

AI大模型 本地化部署 软件外包公司

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