Guia Acesso a bancos de dados em .NET

Estudo de caso: Persistência de dados com NHibernate

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (1)  (0)

Veja neste artigo um estudo de caso que aborda a utilização do framework ORM NHibernate como alternativa para persistência de dados em vários bancos.

Os autores

Edson Mendes de Oliveira é analista programador, pós-graduando em Arquiteturas Corporativas de TI pela FIAP (2013), pós-graduando em Engenharia de Software Orientada para Serviços (SOA) pela VERIS (2012), graduado em Tecnologia da Informação pela FAINAM (2009). E-mail: emoliveira@jenetwork.com.br.

Rodrigo Otávio Leão Colares é analista de operações, pós-graduando em Arquiteturas Corporativas de TI pela FIAP (2013), graduado em Ciências da Computação pela PUC Minas campus Poços de Caldas (2008). E-mail: rodrigoleaocolares@hotmail.com.

1. Introdução

Na maioria das vezes, as aplicações que são desenvolvidas tem uma necessidade de armazenar os dados que são gerados por elas em um banco de dados relacional. Por essa necessidade as aplicações utilizam os sistemas de gerenciamento de banco de dados (SGBD) para armazenar, modificar e extrair informações. Há mais de um tipo de SGBD no mercado, eles utilizam uma linguagem de pesquisa relacional padrão que é a Structured Query Language (SQL), mas cada um pode possuir seus próprios comandos para manipular os dados.

A maioria dos SGBDs tem objetos que são utilizados para criar blocos de códigos SQL para realizar um determinado procedimento, isso possibilita ao desenvolvedor colocar regras de negocio dentro desses blocos. Uma das evoluções em construir softwares é a construção em camadas e um modelo padrão de arquitetura para sistemas é o modelo em 3 camadas, a camada de apresentação que interage com o usuário, a camada de negócio que ficam as funções e regras do negócio e a camada de dados que é responsável em persistir os dados.

Uma desvantagem em desenvolver diretamente com o SGBD é que os códigos de persistência são repetitivos e consomem muito tempo do desenvolvedor, tempo esse que deveria ser utilizado para desenvolver outras atividades. Outra desvantagem é que a aplicação não tem a facilidade de trocar seu repositório, sendo que podem existir códigos de regra de negócio junto com códigos de persistência.

Uma boa solução é utilizar um framework de persistência, que gerencia e mapeia o banco de dados e os objetos da aplicação. Algumas vantagens estão em não escrever os códigos SQL e desvincular a aplicação de um SGBD, facilitando assim a troca de um repositório por outro.

O NHibernate é um framework de persistência open-source que vem do Hibernate para Java, que foi um dos primeiros ORMs do mercado. Ele foi desenvolvido para ser utilizado em projetos que utilizam o .NET Framework 3.5 ou Framework 4.0 da Microsoft, que é base de desenvolvimento da linguagem C#.

Nas próximas seções deste trabalho são apresentados, de maneira mais detalhada, como NHibernate ajudou no desenvolvimento de uma aplicação na empresa Spinup.

2. Revisão Bibliográfica

2.1 SGBD

Sistema gerenciador de banco de dados(SGBD) é um gerenciador computadorizado de registros. Um banco de dados em si pode ser comparado a um estoque, onde uma coleção de arquivos de dados computadorizados são guardados conforme a necessidade da aplicação (Date;Vieira;Lifschitz, 2004).

A funções básicas de um SGBD são:

  • Criar banco de dados.
  • Criar elementos no banco de dados.
  • Inserir, alterar, excluir e consultar dados no banco de dados.
  • Garantia a integridade dos dados.
  • Segurança de acesso e na consistência dos dados.
  • Gerenciar transações.

2.2 Persistência de dados

Persistência de dados é a gravação de dados em um dispositivo físico, sendo um armazenamento não volátil, onde os dados não serão perdidos e podem ser recuperados em qualquer momento.

Para persistir os dados em um banco de dados relacional é utilizada a linguagem SQL, que é a linguagem padrão nos sistemas gerenciadores de banco de dados. Outro jeito de persistir os dados é utilizando um banco de dados orientado a objetos, que tem seus pilares em herança, polimorfismo e encapsulamento, com maior flexibilidade na manipulação de seus objetos. Nesse tipo não é utilizada a linguagem padrão SQL (Boscarioli;Bezerra;Benedicto;Delmiro, 2013).

2.3 Framework

Framework é uma biblioteca de classes que oferecem uma funcionalidade, é baseada em extensão de objetos, técnicas de reaproveitamento, compreendendo tanto designer quanto código (Fayad;Schimidt, 1997).

O Framework tenta capturar o fluxo de controle de uma aplicação dentro de um domínio, este fluxo pode ser explorado por uma aplicação específica, eles são adaptáveis por customização e extensão da estrutura que eles provêm.

2.4 Framework de Persistência

Framework de Persistência faz o trabalho de persistir os objetos em um repositório, separando regras de negócio da persistência, buscando assim facilidades em inserir, consultar, alterar e excluir dados (Natalli; Menezes, 2013). Geralmente é escrito para trabalhar em conjunto com um banco de dados relacional ou uma API, para serviços de dados orientados a registros.

Frameworks de persistência são desenvolvidos tendo como alvo o conceito de software orientado a objetos.

Tal framework definirá o particionamento e organização da aplicação em classes e objetos instanciados a partir delas, bem como o fluxo de dados e controle.

2.5 ORM

ORM (Object-Relational Mapping, ou Mapeamento Objeto Relacional) é uma técnica que faz com que as tabelas do banco de dados sejam representadas por classes, e seus registros por instâncias das classes (Silva, 2013).

Com isso, o programador não precisa escrever código SQL, utilizando a própria interface do framework para realizar toda a persistência dos dados.

Por realizar esse mapeamento, sem a necessidade de escrever SQL, escrito e configurado de forma correta, o mesmo software pode trabalhar com diferentes bases de dados, sem a necessidade de alterar o código.

2.6 Hibernate

O Hibernate é uma soluçâo de mapeamento objeto relacional, sendo reconhecido por desenvolvedores Java (BAUER; KING, 2007).

Ele não apresenta apenas a função de mapeamento de ojeto relacional, também disponibiliza um mecanismo de consulta. Com isso obtem-se um ganho maior no desenvolvimento da aplicação.

Para seu uso é necessário que cada elemento da tabela do banco de dados tenha uma classe Java que a represente.

As instâncias dessas classes são persistidas pelo Hibernate no banco através da identificação do arquivo XML.

Caso haja a necessidade de alteração do banco de dados, basta fazer alteração do driver e alterar a configuração no arquivo XML do hibernate.

2.7 NHibernate

O Nhibernate é uma solução para plataforma .NET, ele lida com plano de persistência, gerando um XML contendo suas entidades e relacionamentos. Para objetos de dados relacionais, ele gera o código SQL para carregar e guardar os objetos (Dourado, 2013).

Suporta persistência transparente e os objetos da classe não tem que seguir um modelo de programação restritiva.

As classes persistentes não precisam implementar nenhuma interface ou herdar de uma classe especial base. Isto torna possível desenvolver a lógica empresarial utilizando o plano de objetos .NET.

O NHibernate contém três interfaces principais:

  • ISession: representa a conexão com o banco de dados;
  • ITransaction: representa a transação controlada pelo NHibernate;
  • IQuery: representa a consulta à base de dados.

3. Estudo de Caso

A spin-up Desenvolvimento de Sistema foi criada para atuar no mercado de desenvolvimento de software sob encomenda, com foco no desenvolvimento de aplicações de gravação de voz e monitoração telefônica.

3.1 MonitorRercorderTelephonic

O MonitorRecorderTelephonic é um sistema telefônico desenvolvido na linguagem C# da Microsoft, dividido em dois módulos.

  • Gravador Telefônico - É um gravador seletivo de chamadas telefônicas que passam através de troncos ou ramais de um Call Center, PABX Corporativo, ou mesa financeira. As gravações são feitas com base em regras de gravação criadas pelos usuários e administradores, que definem as características das chamadas que precisam ser gravadas. As chamadas são gravadas em Stereo e em formato similar ao MP3, e pode ser reproduzido em programas como o Windows Media Player ou o Winamp. Armazena os dados da chamada em um banco de dados PostgreSQL e o backup das chamadas é realizado em DVD.
  • Monitoração PABX Coral - Aplicação responsável por coletar e tratar as informações dos grupos de atendimento da central Tadiran Coral. Aplicação crítica para coleta e tratamento dos eventos de telefonia, a indisponibilidade deste aplicativo impacta diretamente nos relatórios e monitoração em tempo real. Armazena os dados históricos e de tempo real em um banco de dados SQL Server Express e o backup deste banco de dados é feito diariamente e o arquivo de backup é disponibilizado em um diretório local do servidor.

Esses módulos são executados em servidores separados, o processo de gravação telefônica não tinha a informação exata quando a ligação foi terminada, com isso a duração era calculada pela data do arquivo de áudio que era salva em uma pasta do servidor. Um Serviço Windows fica monitorando a pasta para saber se tinha um novo arquivo e com o nome do arquivo comparava com o registro que já estava gravado no banco de dados. Com o módulo de monitoração do PABX Coral, esse procedimento foi trocado por outro mais eficiente, que era a geração de bilhete do PABX, que são dados que são enviados por ele quando uma ligação é finalizada. Quando esse bilhete é recebido por esse módulo, ele dispara um evento que grava no repositório do módulo de gravação telefônica, por isso a necessidade de ter uma camada de persistência mais eficiente e de fácil mudança. O crescimento do volume de dados é uma realidade no gravador de telefônico, sendo assim, a troca para um banco de dados mais robusto era uma necessidade dessa solução. A área de desenvolvimento tinha que ter a flexibilidade e rapidez na troca de um repositório por outro.

As imagens a seguir mostram a arquitetura dos módulos.

Arquitetura do módulo Gravador Telefônico

Figura 1: Arquitetura do módulo Gravador Telefônico

Arquitetura do módulo Monitoração PABX Coral

Figura 2: Arquitetura do módulo Monitoração PABX Coral

3.2 Características da solução com NHibernate

A implementação de um framework de persistência começou com a escolha de um produto que estivesse no mercado por algum tempo e o aprendizado deveria ser rápido e sem um custo elevado. Caso houvesse a necessidade de um curso para o grupo de desenvolvedores, essa solução deveria também estar já algum tempo no mercado e já tivesse sido usada em algum projeto conhecido por alguém da área de desenvolvimento da Spinup. Essa exigência seria pelo motivo de a solução da empresa já estar em produção nos clientes e caso houvesse alguma falha, os prejuízos seriam grandes para a empresa e seus clientes.

A primeira solução indicada foi o Entity Framework da Microsoft, como já estava incluso no Visual Studio e havia uma grande facilidade em encontrar material de estudo na internet, o aprendizado poderia se dar em pequeno espaço de tempo. Essa solução era a mais indicada porque os desenvolvedores já tinham uma grande experiência em desenvolver em produtos da Microsoft e tinham uma grande pressão por parte desses em utilizar somente produtos dessa empresa.

A outra solução indicada seria o NHibernate que é open source, é uma versão do Hibernate para a plataforma Microsoft .NET. Já encontrava-se mais tempo no mercado do que o Entity Framework e muita gente já o usavam em seus projetos.

Por fim, foi decido que o NHibernate seria o framework de persistência padrão nos próximos projetos, por ser uma solução que já estava há um tempo no mercado e vinha de um produto que era o Hibernate, que já era muito utilizado entre os desenvolvedores Java. Uma pessoa foi responsável em estudar sobre a solução e repassar o conhecimento para o restante do pessoal da equipe.

A primeira etapa do projeto era mapear as tabelas do banco de dados SQL Server e do PostgreSQL. Para gerar os arquivos de mapeamento e das entidades foi usado o software MyGeneration, que também é uma solução open source.

As próximas figuras mostram o software que gera os arquivos e o que foi gerado por ele.

Software para gerar arquivos de mapeamento e entidade

Figura 3: Software para gerar arquivos de mapeamento e entidade. Fonte: http://www.mygenerationsoftware.com

Diagrama de Relacionamento de entidade

Figura 4: Diagrama de Relacionamento de entidade

Arquivos que foram gerados pelo software MyGeneration

Figura 5: Arquivos que foram gerados pelo software MyGeneration

Conteúdo do arquivo Agente.cs

Figura 6: Conteúdo do arquivo Agente.cs

Listagem 1:Conteúdo do arquivo Agente.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
	<!--Build: with lujan99@usa.net NHibernate template-->
	<class name="Monitor.Agente,Monitor" table="Agente" lazy="true">
		<id name="Id" column="Id" type="Integer">
			<generator class="native"/>
			<property name="Nome" column="Nome" type="String"/>
			<property name="Ramal" column="Ramal" type="String"/>
			<many-to-one name="Grupo" column="IdGrupo" cascade="save-update" not-null="true"/>
		</id>
	</class>
<hibernate-mapping>

A segunda etapa do projeto foi construir a camada de persistência com NHibernate, construindo a classe que teria todas os métodos de inserir, excluir, alterar e consultar das tabelas dos módulos da solução telefônica.

Foi criada uma classe facade que é um objeto que expõe métodos mais simplificados para serem usados em outras classes. Todos os objetos que tem que ser criados no NHibernate foram criados dentro dela.

A seguir são citadas as classes que foram construídas na camada de persistência.

Gravador Telefônico: FacadeGravador; ChamadaDAO; BackupDAO; RamalDAO; RegraDAO.

Monitoração PABX Coral: FacadeMonitor; ChamadaDAO ;GrupoDAO; AgenteDAO; StatusDAO; StatusAgenteDAO.

A figura 7 e a listagem 2 mostram como foi construída a camada de persistência.

Diagrama de classe da camada de persistência

Figura 7: Diagrama de classe da camada de persistência

Listagem 2: Conteúdo da classe FacadeGravador

using System;
using System.Collections.Generic;
using system.Web;
using NHibernate;
using NHibernate.Cfg;

namespace Gravador
{
	public class FacadeGravador : IFacadeGravador
	{
		private ISession oSession;
		ITransaction oTransaction;
		IsessionFactory _sessionFactory;
		
		private ISessionFactory SessionFactory{
			get{
				Configuration configuration = new Configuration()
				configuration.Configure();
				configuration.AddAssembly(typeof(Chamada).Assembly);
				configuration.AddAssembly(typeof(Backup).Assembly);
				_sessionFactory = configuration.BuildSessionFactory();
				
				return _sessionFActory;
			}			
		}
		
		public void OpenSession{
			oSession = SessionFactory.OpenSession();
		}
		
		public void CloseSession(){
			SessionFactory.Close();
		}
		
		public void BeginTransaction(){
			oTransaction = oSession.BeginTransaction();
		}
		
		public void CommitTransaction(){
			oTransaction.Commit();
		}
		
		public void RollbackTransaction(){
			oTransaction.Rollback();
		}
		
		public void ChamadaAdd(Chamada chamada){
			oSession.Save(chamada);
		}
	}
}

3.3 Resultados alcançados utilizando NHibernate

O uso do NHibernate pela área de desenvolvimento da empresa Spinup proporcionou flexibilidade no uso de banco de dados e agilidade em criar repositórios para as aplicações. O objetivo foi alcançado em construir uma forma de persistir os dados em um repositório com as características de uma linguagem orientada a objetos e que a construção da lógica de banco de dados não ficasse responsável para a equipe de desenvolvimento. Abaixo são citados os benefícios no uso de um framework de persistência:

  • Agilidade no desenvolvimento
  • Padrão na camada de persistência
  • Flexibilidade em trocar o banco de dados
  • Regras de negocio fora da camada de persistência
  • Equipe focada nas regras de negocio
  • Custo reduzido pelo tempo reduzido em desenvolver comandos SQL.

A utilização de um framework de persistência no desenvolvimento de sistemas proporciona qualidade, agilidade e flexibilidade, removendo a complexidade na criação dos objetos do banco de dados relacional (Alonso;Ciferri, 2013).

4. CONCLUSÃO

Com a utilização do framework de persistência, se tem uma facilidade para gerenciar os dados no banco de dados, separando regras de negócios e persistência.

Neste estudo de caso proposto utilizamos o framework NHibernate, onde foram mapeadas as tabelas dos bancos de dados SQL Server e Postgree, definindo assim a camada de persistência. Com isso, houve uma redução considerável do tempo de implementação do sistema na Spinup e menor erro na codificação. E neste caso um foco maior na regra de negócio.

Conforme apresentado na seção 3.3, o uso do NHibernate trouxe maior agilidade aos processos e regras de negócio.

6. REFERÊNCIAS

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?