写点什么

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

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

关注

评论

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

架构师训练营 -- 第 12 周作业

stardust20

微服务架构下的系统集成

码猿外

架构 微服务 系统集成

大数据解答(一)

dony.zhang

大数据 mapreduce

Week 12 命题作业

Jeremy

第九周

Acker飏

Docker 私有镜像仓库的搭建及认证

哈喽沃德先生

Docker 容器 微服务 镜像

Atlassian Team Playbook | 用户体验画布挖掘业务价值

Atlassian

团队管理 敏捷开发 Atlassian

所按非所得——聊一聊StandHogg漏洞

OPPO安全

安全攻防 安全 安全开发 漏洞

kubernetes node affinity 写法

Geek_f24c45

Kubernetes

【Spring Boot系列】之多种依赖集成方式

语霖

Week 12 学习总结

Jeremy

我所在公司和大数据

2流程序员

你真的知道什么是线程安全吗?

老胡爱分享

并发编程 线程 java 并发

架构师训练营第十二周作业

Hanson

架构设计开学第一天

escray

学习 从零开始学架构 架构师预科班

AtlassianTeam Playbook | 用户体验中的移情地图

Atlassian

团队管理 敏捷开发 Atlassian

oeasy教您玩转linux010201持续输出yes

o

3种 Springboot 全局时间格式化方式,别再写重复代码了

程序员小富

Java springboot

架构师训练营第十二周总结

Hanson

互联网人必备知识cookie和session认证

架构师修行之路

分布式 身份认证 session Cookie

Flink SQL FileSystem Connector 分区提交与自定义小文件合并策略

Apache Flink

flink

听说,阿里云给它的 OpenAPI 开发了一套编程语言

郭旭东

阿里云 OpenAPI

甲方日常 5

句子

工作 随笔杂谈 日常

计算机网络基础(二十二)---传输层-套接字与套接字编程

书旅

TCP 计算机网络 TCP/IP

云计算、人工智能、大数据技术三者之间的关系

cristal

人工智能 云计算 大数据

cookie和session的关系看这一篇就够了

架构师修行之路

session Cookie

FlinkX 如何读取和写入 Clickhouse?

Apache Flink

flink

大数据应用场景

dongge

42图揭秘,「后端技术学些啥」

我是程序员小贱

2020-08-29-第十二周作业

路易斯李李李

2020-08-29-第十二周学习总结

路易斯李李李

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