Utilizando DataReader em modo desconectado
Crie um CRUD na qual retorna um objeto IDataReader sem depender de uma conexão ativa com o banco de dados, aumentando a disponibilidade de uma aplicação crítica
A primeira vantagem em utilizar um DataReader desconectado do banco de dados é não se preocupar com esquecimento de fechar a conexão, deixando isto cargo de um GC (Garbage Collector). Aliás, nunca se sabe qual o momento certo desse GC acontecer.
Nos tempos de ASP clássico, o ato de não fechar uma conexão gerava um gargalo enorme, e o gerenciamento das conexões ficavam a cargo do próprio banco de dados
A segunda vantagem, problemas de conexões excedidas é um cenário "mais-que-normal" em momentos de pico de utilização de aplicações críticas. Pra quem já trabalhou em sustentação de sistemas, sabe bem que este cenário é bem comum de acontecer
Vamos ao que interessa:
git clone https://github.com/leobreda/datareader-desconectado
Prepare uma estrutura de banco de dados em SQL Server. Use docker se for preciso.
CREATE DATABASE POC; USE POC; DROP TABLE TB_CLIENTE; CREATE TABLE TB_CLIENTE ( ID INT IDENTITY PRIMARY KEY, NOME VARCHAR(60), EMAIL VARCHAR(80), CPF BIGINT, END_LOGRADOURO VARCHAR(60), END_NUMERO VARCHAR(5), END_CEP VARCHAR(9), END_CIDADE VARCHAR(60), END_ESTADO VARCHAR(20), TEL_DDD TINYINT, TEL_NUMERO BIGINT );
Com o ConsoleDataReader.sln aberto no Visual Studio, faça a adequação da ConnectionString no appsettings.json:
"ConnectionStrings": { "Sql": "Server=127.0.0.1;Database=POC;User Id=sa;Password=sa;" }
Altere o valor booleano da variável abaixo para iniciar a geração de massa de dados:
static void Main(string[] args) { gerarDados = true; }
Ative e desative o modo conectado, na classe CRUD, método ExecuteDataReader():
public static DbDataReader ExecuteReader(string strSQL) { conectado = true; }
No mesmo método, observe que houve a criação de um DataTable, realizado um Load() e a conexão tanto com o DataReader quanto DbCommand foi fechada:
if (!conectado) { DataTable dt = new DataTable(); dt.Load(dr); dr.Close(); dr = null; dr = dt.CreateDataReader(); dt = null; cmd.Connection.Close(); cmd.Connection = null; }
Com a conexão do banco de dados fechada, não nos preocupamos mais em fechá-la durante a leitura do DataReader, nem esperar o GC fazer o trabalho de desconexão.