写点什么

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

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

关注

评论

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

证监会最新政策重点来了!

容光

监管合规

IDEA中request获取不到getParameter方法

咿呀呀

javaWeb Request getParameter

架构实战营 - 模块 5- 作业

泄矢的呼啦圈

架构实战营

Github上“Java面试考点大全”被我扒下来了,20+互联网公司,应有尽有

Java架构师迁哥

ubuntu64位搭建OpenVINO系统(上篇)

IT蜗壳-Tango

5月日更

Don't judge others, Work on yourself

escray

学习 极客时间 5月日更 朱赟的技术管理课

业界大佬跨界造车底气何来?

容光

AI

区块链早报|拜登的2022年预算包括新的加密货币报告提案

容光

加密货币

Java面试基础:面向对象和面向过程的区别

三掌柜

5月日更

架构训练营模块 5 作业

Geek_649372

架构实战营

探索科技手段下的食品安全,区块链冷链追溯平台建设解决方案

源中瑞-龙先生

废物,我TMD一个985却斗不过专科生(大厂java开发2年被裁)

Java架构师迁哥

微服务注册中心:Consul——服务发现

程序员架构进阶

微服务 Consul API网关 28天写作 5月日更

太顶了!阿里大牛离职带出来的这份“Java架构核心宝典”学习笔记,差距不是一点点

Java 程序员 架构 面试

Spring 是什么?如何去了解spring?

???

Java spring 程序员 编程语言 spring M

网络攻防学习笔记 Day29

穿过生命散发芬芳

5月日更 网络攻防

记录:28天拿到字节offer的全过程(Java岗)

Java架构师迁哥

🔎【Java 源码探索】深入浅出的分析ClassLoader

洛神灬殇

Java ClassLoader 类加载器 5月日更 双亲委托模型

算法训练营 - 学习笔记 - 第七周

心在飞

梯度下降法2

Qien Z.

5月日更

Mysql 常见概念

water

星石深度:如何看待近期人民币汇率走强?

容光

无人驾驶汽车有望持牌上路!这些公司称已经布局

容光

AI

喜讯!腾讯团队Redis技术笔记,下载量已突破30W;附下载方式

Java架构师迁哥

iOS打包签名,你真的懂吗

Geen练

ios 打包 签名 iOS Developer

解析如程688免费住民宿的商业模式

石云升

商业模式 5月日更

🎙️ 如何写好一篇新闻资讯稿?(时事政治篇)

洛神灬殇

写作技巧 5月日更 新闻资讯 案例分析 时事政治

Java岗熬了6年,终成P8,只因搞懂了这七件事

Java架构师迁哥

由云入端:一场云计算巨头的闯关游戏

脑极体

架构师实战营-模块4-设计千万级学生管理系统的考试试卷存储方案

吴建中

架构实战营

一篇文章弄清磁盘的里里外外及访问特性

SunnyZhang的IT世界

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