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'? –