Leobreda.net

Web, .Net,
SQL, Cloud...

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.




Acessar todos os artigos »