This question is building off of a previous question I've asked before -- and while I resolved that issue by increasing FetchSize, I need to now change the query from SELECT * FROM TABLE1
to SELECT * FROM VIEW1
, where TABLE1
, and a couple of other tables in the database, are the base tables for VIEW1
.
The code from the previous question is pretty much the same, but to account for the FetchSize change, breakpoints, and query:
Program.cs
class Program
{
static void Main(string[] args)
{
// Create Connection
OracleConnection con = new OracleConnection();
// Create ConnectionString using Builder
OracleConnectionStringBuilder ocsb = new OracleConnectionStringBuilder();
ocsb.Password = "PASSWORD";
ocsb.UserID = "USER1";
ocsb.DataSource = "URL";
// Connect
con.ConnectionString = ocsb.ConnectionString;
con.Open();
Console.WriteLine();
Console.WriteLine(">>> Connection Established");
// Execute a SQL SELECT
OracleCommand cmd = con.CreateCommand();
// Breakpoint #1
cmd.CommandText = "select * from VIEW1";
// Breakpoint #2
OracleDataReader reader = cmd.ExecuteReader();
reader.FetchSize = 10 * 1024 * 1024;
// Cache configuration
var cfg = new IgniteConfiguration
{
PeerAssemblyLoadingMode = Apache.Ignite.Core.Deployment.PeerAssemblyLoadingMode.CurrentAppDomain,
CacheConfiguration = new[]
{
new CacheConfiguration
{
Name = "cacheName",
Backups = 1,
QueryEntities = new[]
{
new QueryEntity(typeof(int), typeof(Table))
}
}
}
}
// Breakpoint #3
IIgnite ignite = Ignition.Start(cfg);
ICache<int, Table> cache = ignite.GetOrCreateCache<int, Table>("cacheName");
// Breakpoint #4
using (var stmr = ignite.GetDataStreamer<int, Table>("cacheName"))
{
// Add entries to cacheName
while (reader.Read())
{
Table table = new Table();
table.SetObject(reader);
stmr.AddData(table.Id, table.Name);
}
// Clean up
// Breakpoint #5
reader.Dispose();
cmd.Dispose();
con.Dispose();
}
}
}
Table.cs
class Table
{
[QuerySqlField(IsIndexed = true)]
public int Id { get; set; }
[QuerySqlField]
public string Name { get; set; }
public void SetObject(OracleDataReader reader)
{
Id = reader.IsDBNull(0) ? 0 : reader.GetInt32(0);
Name = reader.IsDBNull(1) ? "" : reader.GetString(1);
}
}
View Definition
DROP VIEW USER1.VIEW1;
CREATE OR REPLACE FORCE VIEW USER1.VIEW1
(
COL1,
COL2,
COL3,
COL4,
COL5,
COL6,
COL7
)
BEQUEATH DEFINER
AS
SELECT a.col1,
a.col2,
a.col3,
a.col4,
a.col5,
a.col6,
a.col7
FROM table1 a,
table2 ph,
( SELECT col1,
SUM (DECODE (user_type, 'Top User', 0, 1))
team_count,
SUM (DECODE (user_type, 'Top User', 1, 0))
top_user_count
FROM view2
GROUP BY col1) gat
WHERE A.col3 = UPPER (PH.col3(+))
AND a.col1 = gat.col1(+);
CREATE OR REPLACE SYNONYM USER2.VIEW1 FOR USER1.VIEW1;
CREATE OR REPLACE SYNONYM USER3.VIEW1 FOR USER1.VIEW1;
GRANT SELECT ON USER1.VIEW1 TO ID1;
GRANT SELECT ON USER1.VIEW1 TO ID2;
GRANT SELECT ON USER1.VIEW1 TO ID3;
GRANT SELECT ON USER1.VIEW1 TO ID4;
GRANT SELECT ON USER1.VIEW1 TO ID5;
Getting from breakpoint #1 to #2 is done in under a second. However, the time in between breakpoint #2 and breakpoint #3 was exceeding 30 minutes before my computer disconnected from the internet (there were no errors/exceptions prior to the disconnect as the program and diagnostic session were both running).
I was wondering if anyone could shed some light on why the program hangs on the line OracleDataReader reader = cmd.ExecuteReader();
, and why this is an issue I face once I switched from TABLE
to VIEW
in my query.