2
根据Oracle 12c文档https://docs.oracle.com/cd/E47955_01/win.121/e18594/using.htm#BABCHCDD,语句缓存功能消除了每次执行时都需要解析SQL语句的需要。但是,当我查看由假定的SSCCE创建的跟踪文件,我看到这个模式:为什么OraOLEDB的语句缓存功能不像JDBC的PreparedStatement?
PARSE
EXEC
FETCH
PARSE
EXEC
FETCH
PARSE
EXEC
FETCH
...
PARSE
EXEC
FETCH
我想看到的是这种模式来代替:
PARSE
EXEC
FETCH
EXEC
FETCH
EXEC
FETCH
...
EXEC
FETCH
下面的代码,以连接说明从变量的connectionString删除:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Oracle.DataAccess.Client;
namespace OracleTest {
class Program {
static void Main(string[] args) {
string connectionString = "Statement Cache Size=75; Self Tuning=False;";
OracleConnection connection = new OracleConnection(connectionString);
connection.Open();
Console.WriteLine(connection.StatementCacheSize);
string commandString = "select dummy from dual where dummy = :d";
OracleParameter parameter = new OracleParameter("d", OracleDbType.Varchar2);
parameter.Value = "X";
OracleCommand command = new OracleCommand(commandString);
command.Connection = connection;
command.AddToStatementCache = true;
command.Parameters.Add(parameter);
string trace = "begin dbms_monitor.session_trace_Enable(binds=>true, waits=>true); end;";
OracleCommand traceCommand = new OracleCommand(trace);
traceCommand.Connection = connection;
traceCommand.ExecuteNonQuery();
command.Prepare(); // docs say this is a no-op but I tried anyway
for (int i=1; i<= 10; i++) {
OracleDataReader reader = command.ExecuteReader();
while (reader.Read()) {
Console.WriteLine("a row");
}
}
}
}
}
根据该文件,如果你想在功能的完全控制,你必须做3两件事:
- 声明语句缓存
- 一套自我调整的尺寸为false
- 的的OracleCommand的AddToStatementCache成员设置为true
我相信我已经满足了所有要求,但数据提供者不做我想做的事。
你应该关闭OracleDataReader后,你必须使用它。当你使用像'var dt = new DataTable(); var da = new OracleDataAdapter(command); da.Fill(dt);'而不是'OracleDataReader'? –