【发布时间】:2013-12-12 09:43:49
【问题描述】:
在我的公司,我们有一个 WPF 应用程序,它可以连接到不同的数据库(MS SQL、MySQL、SQLite 和 Oracle)。我们有很多表(有时 200+,不要问为什么,它非常复杂),我们的数据访问层有几个接口和虚拟/覆盖方法来处理特定数据库中的数据读取。这很重要,因为我们不像大多数教程所示专门在一张表上工作,而是动态创建了我们需要运行的特定于数据库的命令。在 MS SQL、MySQL 和 SQLite 下一切正常,但在 Oracle CLOB 中读取非常慢。读取 2000 行数据需要 40-50 秒。不幸的是,在大多数情况下,我们不能假设我们不需要 CLOB 类型,因为我们以 xml 格式存储财务数据,有时它超过 4000、8000 甚至 10k+ char-long 大小。我使用 ODP.Net 解决方案来读取数据,这就是我正在做的事情:
我们的环境: 甲骨文:11.2.0.1.0 VS:2010,专业版 Oracle.DataAccess.dll 从我的 Oracle 主页安装中引用: C:\Oracle\ODP.NET\bin\4\Oracle.DataAccess.dll
还有我的测试代码(来自我们的解决方案):
属性:
private string ConnectionString
{
get
{
return
string.Format(
"User Id={0}; Password={1}; POOLING=true;
Data Source= (DESCRIPTION=(ADDRESS=
(PROTOCOL=TCP)(HOST={2})(PORT={3})) (CONNECT_DATA=(SID={4})
(SERVICE_NAME={5})));",
"ourUser", "ourPassword", "ourHost", "ourPort", "ourSID",
"ourDatabaseName");
}
}
要运行的命令:
string sql = "SELECT * FROM OurTable";
//This table contains at least one CLOB column
还有我们的测试代码:
List<object[]> readerList = new List<object[]>();
using (Oracle.DataAccess.Client.OracleConnection oraConn = new
Oracle.DataAccess.Client.OracleConnection(ConnectionString))
{
oraConn.Open();
Oracle.DataAccess.Client.OracleCommand oraComm = new
Oracle.DataAccess.Client.OracleCommand(sql);
oraComm.CommandType = CommandType.Text;
oraComm.Connection = oraConn;
Oracle.DataAccess.Client.OracleDataReader oraReader;
oraReader = oraComm.ExecuteReader();
oraComm.InitialLOBFetchSize = -1;
while (oraReader.Read())
{
object[] readObjects = new object[oraReader.FieldCount];
oraReader.GetValues(readObjects);
readerList.Add(readObjects);
}
oraConn.Close();
}
while 迭代运行非常慢,除非我们不需要读取 CLOB,因为它会很快。 不幸的是,我无法制定特定于表格的解决方案,因为并非在每种情况下我都知道我必须处理哪些表格(有时有动态创建的表格)。
所以,问题是: 有什么解决方案可以让它像从 MS SQL 中读取 TEXT 类型的对象一样快?
【问题讨论】:
标签: c# performance oracle data-access-layer clob