Вы находитесь на странице: 1из 23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

www.devmedia.com.br
[verso para impresso]
Link original: http://www.devmedia.com.br/articles/viewcomp.asp?comp=29114

Introduo a Multi-Tenancy
com Hibernate 4
Este artigo apresenta a funcionalidade, do Hibernate, que
prov mecanismos de suporte arquitetura Multi-Tenant.
Artigo do tipo Tutorial
Recursos especiais neste artigo:
Contedo sobre Novidades
Autores: Marcos de Melo Siega e Everton Coimbra de Arajo
Suporte a Multi-Tenancy com Hibernate 4
Este artigo apresenta a funcionalidade, agregada verso 4 do framework Hibernate, que
prov mecanismos de suporte arquitetura Multi-Tenant (vrios clientes, logicamente
isolados, utilizando os mesmos recursos fsicos). Alm de demonstrar os aspectos deste
novo recurso, expe-se uma contextualizao sobre Hibernate e Multi-Tenancy, e ento,
ao final, implementa-se um exemplo prtico utilizando esta nova funcionalidade.
Em que situao o tema til
Arquitetos de software encontram grandes desafios ao construir modelos arquiteturais
SaaS (Software como servio, do ingls Software as a Service) que apresentem uma
infraestrutura de dados diferenciada, podendo no contar com servidores locais e
infraestrutura prpria, tendo que dispor todos os dados em um espao compartilhado.
Fatores como estes influenciam diretamente na capacidade de gerncia, monitoramento e
at mesmo na segurana dos dados.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

1/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Na medida em que a linguagem Java comeou a ganhar destaque em ambientes


corporativos, notou-se rapidamente que um tempo excessivo era gasto com a
codificao de instrues SQL e com cdigo JDBC capaz de interpret-las.
O processo de desenvolvimento sofre influncia direta deste aspecto negativo, pois h
uma imensa queda de produtividade quando o desenvolvedor torna-se responsvel por
criar tais instrues manualmente, cabendo a ele tratar da mudana do paradigma
orientado a objetos para o mapeamento objeto relacional e vice-versa. Este
procedimento implica na necessidade de escrita de muitas linhas de cdigo, criando um
enorme obstculo para o desenvolvedor, que ficar encarregado de tratar da persistncia
e recuperao de seus objetos utilizando uma linguagem de consulta estruturada.
A existncia desta divergncia entre o modelo orientado a objetos e o modelo relacional
estimulou o desenvolvimento de mecanismos que contornassem este problema. Uma das
principais ferramentas que surgiram, buscando resolver esta incompatibilidade, foi o
Hibernate. Este framework aplica tcnicas de mapeamento objeto relacional para resolver
a dissonncia entre os modelos.
Os frameworks de mapeamento objeto relacional, como o Hibernate, permitem mapear a
representao dos dados de um modelo de objeto para um modelo de dados relacional e
seu respectivo esquema de banco de dados, utilizando arquivos de configurao no
formato XML e anotaes Java.
Tais ferramentas de ORM, alm de tratar da persistncia e recuperao dos dados,
devem garantir que as informaes permaneam ntegras e seguras, seja qual for a
arquitetura de software adotada para a soluo. Diante da constante necessidade de
garantia destes fatores nos mais variados contextos, a verso 4 do Hibernate oferece
suporte para uma das arquiteturas que tem ganhado bastante destaque, denominada
Multi-Tenancy. Este novo recurso vai de encontro ao aumento do nmero de aplicaes
que esto sendo desenvolvidas voltadas para a nuvem, ou ambientes onde os recursos
disponveis so compartilhados.
Com base nisso, este artigo aborda as principais caractersticas deste recurso adicionado
ao Hibernate, suas possveis aplicaes e um exemplo simples de como empreg-lo.

Hibernate
O Hibernate um framework para mapeamento objeto relacional e consulta a bases de
dados de cdigo aberto e que distribudo sob a licena LGPL. Ele assegura a
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

2/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

transparncia no processo de armazenamento de objetos em bancos de dados


relacionais para o desenvolvedor, tirando dele a necessidade de se preocupar com a
forma com que estes objetos sero persistidos ou recuperados. Esta transparncia
permite que o desenvolvedor concentre-se somente nas caractersticas e nos problemas
a serem resolvidos pela aplicao.
O Hibernate possibilita que os desenvolvedores utilizem a conveno POJO (Objetos
Simples em Java, do ingls Plain Old Java Objects) para construir a camada de modelo
das aplicaes. No entanto, ele no apenas uma soluo ORM, mas sim uma coleo de
projetos que fornecem funcionalidades que vo alm do mapeamento objeto relacional.
Uma dessas funcionalidades o suporte ao isolamento de dados para os vrios clientes
de uma aplicao, tambm conhecido como Multi-Tenancy, sobre o qual abordaremos a
partir de agora.

O que Multi-Tenancy?
Em uma aplicao que atende diversos clientes simultaneamente, fundamental que uma
possvel falha na operao de um cliente no afete os demais. Desta maneira, em
modelos onde os recursos computacionais so amplamente compartilhados, este cenrio
requer uma ateno especial.
Para as organizaes, mecanismos que garantam a integridade dos dados, seu mais
importante acervo, so extremamente importantes. Por este motivo, elas preferem
manter seus softwares e bancos de dados instalados em hardwares pertencentes
prpria organizao, a ter que confi-los a estruturas inadequadas de fornecedores de
hospedagem.
Com o advento da computao em nuvem, e a tendncia de novas aplicaes operarem e
serem disponibilizadas, cada vez mais, por esta tecnologia, modelos arquiteturais
adequados que forneam apoio integridade dos dados se tornam imprescindveis.
Diante deste cenrio, onde a utilizao dos recursos fsicos feita de maneira
compartilhada e a garantia de integridade e segurana dos dados vital, uma soluo
tem ganhado destaque por permitir o isolamento lgico dos recursos. Esta soluo o
modelo chamado de Multi-Tenancy.
O termo Multi-Tenancy aplicado ao desenvolvimento de software para indicar uma
arquitetura na qual uma nica instncia de determinada aplicao serve simultaneamente
a vrios clientes (tenants). Cada um dos clientes pode receber a habilidade de customizar
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

3/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

partes da aplicao, tais como a cor da interface com o usurio ou as regras de negcio
(por meio de configuraes), porm, no so capazes de modificar o cdigo do aplicativo.
Este modelo arquitetural comumente utilizado em solues SaaS para isolar as
informaes (dados, armazenados em um banco de dados, e customizaes, por
exemplo) dos diferentes clientes. O uso desse modelo para tal propsito comumente
chamado de Multi-Tenant de dados.

Multi-Tenancy no Hibernate
Como de costume, o Hibernate se esfora para manter a API simples e isolada de
qualquer detalhe da complexidade de sua implementao. Neste sentido, o uso deste
novo recurso resume-se basicamente a especificar o identificador do cliente no processo
de abertura de uma nova sesso (session) e indicar, no processo de configurao do
framework, a estratgia que ser adotada para isolar os dados.
Entre as diferentes estratgias de implementao do Multi-Tenancy, esto as seguintes:
1. Criar um banco de dados ou esquema de dados exclusivo para cada cliente;
2. Usar o mesmo banco de dados ou esquema para todos os clientes, mas com uma
coluna adicional em todas as tabelas (um id_tenant, por exemplo) para filtrar os dados.
O Hibernate, em sua verso 4, suporta apenas o primeiro item. O suporte para o
segundo est planejado para acompanhar a verso 5.0 do framework.

Banco de dados exclusivo por cliente


Nesta abordagem, os dados de cada cliente so mantidos em uma instncia de banco de
dados separada fisicamente, como demonstra a Figura 1.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

4/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Figura 1. Base de dados exclusiva por cliente.


Neste modelo, conexes JDBC apontam especificamente para cada banco de dados.
Deste modo, cada cliente utilizar apenas a conexo que lhe pertence, e as modificaes
feitas por cada um dos inquilinos no afetar os dados e configuraes dos demais.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

5/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Adota-se este modelo atravs da definio de um pool de conexes JDBC por cliente, de
modo que a seleo do pool a ser utilizado ocorre com base em um identificador
associado ao usurio logado.

Esquema exclusivo por cliente


Nesta abordagem, os dados de cada cliente so mantidos em diferentes esquemas de
uma instncia compartilhada de banco de dados, conforme ilustra a Figura 2.

Figura 2. Base de dados compartilhada por vrios clientes com separao por
esquemas.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

6/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Ao empregar este modelo, teremos duas maneiras distintas para definir as conexes
JDBC:
1. As conexes podem apontar especificamente para cada esquema, de maneira anloga
ao modelo de banco de dados exclusivo por cliente. Contudo, este mtodo s pode ser
adotado se o driver de conexo com a base de dados suportar a nomeao do esquema
padro por meio de sua URL, ou se o mecanismo de pooling suportar a nomeao de um
esquema para utilizar suas conexes. Ao empregar este mtodo, haver um pool de
conexes JDBC distinto por cliente, onde o pool a ser utilizado selecionado com base
no identificador associado ao cliente logado;
2. As conexes poderiam apontar para a prpria base de dados (utilizando algum
esquema padro), e a mudana de esquema ocorreria atravs do uso do comando SQL
SET SCHEMA (ou similar) pela aplicao. Ao utilizar esta tcnica, apenas um pool de
conexes JDBC delegado para atender a todos os clientes, e antes de ocorrer o
consumo da conexo, haveria a alterao para o esquema nomeado com o identificador
associado ao cliente logado na aplicao.

Implementao do modelo Multi-Tenancy com


Hibernate
A fim de ilustrar o suporte ao modelo Multi-Tenancy, prope-se a criao de uma
aplicao de exemplo, onde a abordagem adotada ser a de esquema exclusivo por
cliente. A soluo proposta ter como finalidade realizar a persistncia de dados de
acordo com tal separao e apresentar os resultados obtidos. Antes de comear a
desenvolver esta soluo, no entanto, faz-se necessrio obter todos os arquivos citados
a seguir.
Para contar com o Hibernate preciso baixar os arquivos do framework e coloc-los no
classpath da aplicao. Tais arquivos podem ser obtidos no site oficial da ferramenta (ver
seo Links). L se encontram tambm instrues sobre como utiliz-la adequadamente.
No exemplo trabalhado, optou-se pelo uso do MySQL, mas nada impede que o
desenvolvedor utilize outro SGBD. A adoo do MySQL cria a necessidade de obter e
adicionar o arquivo JAR correspondente ao seu driver no diretrio lib, alm de inclu-lo no
classpath, do mesmo modo como foram adicionados os arquivos do Hibernate.
Assim, com o ambiente de desenvolvimento instalado e corretamente configurado, pode
ser dado incio ao processo de implementao da aplicao exemplo.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

7/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Criao dos esquemas e tabelas


Antes de comear a implementao do projeto, utiliza-se a ferramenta MySQL Command
Line Client para criar dois esquemas na instncia do MySQL. Cada um dos esquemas
definidos pertencer exclusivamente ao cliente cujo nome lhe identifica. A Listagem 1
demonstra os comandos utilizados para este processo.
Listagem 1. Instrues utilizadas para a criao dos esquemas.

mysql> CREATE SCHEMA cliente1;


mysql> CREATE SCHEMA cliente2;

Aps a definio dos esquemas, vamos criar uma tabela em cada um deles. Para o
exemplo, nomearemos estas tabelas como Pessoa, e ambas tero a mesma estrutura.
A Listagem 2 apresenta as instrues utilizadas na criao das tabelas. Cada uma
possui, basicamente, dois atributos, um identificador e um nome. Decidiu-se por replicar
a estrutura nos dois esquemas apenas para facilitar a apresentao do exemplo.
Listagem 2. Instrues utilizadas na criao das tabelas.

mysql> CREATE TABLE cliente1.pessoa ( id INT NOT NULL, nome VARCHAR(45)


NULL, PRIMARY KEY(id));
mysql> CREATE TABLE cliente2.pessoa ( id INT NOT NULL, nome VARCHAR(45)
NULL, PRIMARY KEY(id));

Com a base de dados configurada e seus esquemas definidos, pode-se iniciar o


desenvolvimento da aplicao que utilizar a funcionalidade de Multi-Tenancy.

Criao do projeto
Para comear, preciso criar um novo projeto do tipo Java Project no Eclipse e definir
algumas caractersticas da aplicao. Assim, deve-se nomear o projeto, definir sua
localizao, o ambiente de execuo e optar por um layout para separar adequadamente
os arquivos de extenso .class e .java, como demonstrado na Figura 3.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

8/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Figura 3. Janela do wizard para criao de um novo projeto.


Para finalizar este processo, especifique as bibliotecas que sero adicionadas ao
classpath, a fim de atender os requisitos de dependncia da nova aplicao, como
realizado na Figura 4. Caso as bibliotecas no estejam disponveis para seleo, o
desenvolvedor pode facilmente configur-las utilizando a opo User Libraries.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

9/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Figura 4. Janela do wizard para definio das configuraes de construo do projeto.


Alm de adicionar as bibliotecas no classpath, tambm importante colocar tais arquivos
(JARs do Hibernate e do MySQL) na pasta lib do projeto. Caso a IDE no crie tal pasta
automaticamente, o desenvolvedor deve cri-la manualmente.
O processo de adio de tais arquivos pode ser realizado por meio da tcnica de Dragand-Drop (Arrastar e Soltar). O resultado de tal procedimento apresentado na Figura
5.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

10/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Figura 5. Resultado da adio dos arquivos de dependncia no projeto.


Neste momento, aps ter criado o projeto, faz-se necessrio definir uma faceta para ele.
Facetas permitem que projetos Java EE obtenham, atravs de configurao, suporte para
vrias outras tecnologias. O uso deste recurso deve-se pelo emprego da IDE Eclipse,
sendo que outros ambientes de desenvolvimento no agregam tal conceito. A este
exemplo foi adicionada a faceta JPA, como exposto na Figura 6.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

11/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Figura 6. Janela do wizard de configurao das propriedades do projeto.


A seleo desta faceta obriga o desenvolvedor a realizar algumas configuraes bsicas,
tais como, indicar a biblioteca que contm os arquivos de implementao do JPA e ajustar
a conexo com a base de dados utilizada. Um link (Further configuration required...)
emitido pela prpria IDE e que estar disponvel, em destaque, na parte inferior da janela
do Wizard de ajustes das propriedades do projeto, d acesso s propriedades da
conexo, que deve ser configurada. O resultado dessa etapa pode ser observado na
Listagem 3.
Listagem 3. Arquivo persistence.xml gerado automaticamente aps o processo de
configurao da faceta JPA.

<?xml version="1.0" encoding="UTF-8"?>


<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

12/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="MultiTenancyApp">
</persistence-unit>
</persistence>

Como resultado do processo de configurao o arquivo persistence.xml gerado, e deve


ser modificado de acordo com as propriedades do banco de dados e seguindo o padro
definido pelo provedor de persistncia. A Listagem 4 apresenta o resultado de tal
procedimento.
Listagem 4. Configurao do arquivo persistence.xml.

<?xml version="1.0" encoding="UTF-8"?>


<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="MultiTenancyApp"
transaction-type="RESOURCE_LOCAL">
<provider>
org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost:3306/cliente1" />
<property name="hibernate.connection.username" value="user" />
<property name="hibernate.connection.password" value="password" />
<property name="hibernate.multiTenancy" value="SCHEMA" />
</properties>
</persistence-unit>
</persistence>

Implementao da aplicao exemplo


Tendo criado o projeto e realizadas as devidas configuraes, d-se incio ao
desenvolvimento da classe que demonstrar o uso do suporte ao modelo Multi-Tenant, e
das demais classes necessrias para compor a soluo.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

13/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Para comear, uma nova classe Java, denominada Pessoa, deve ser criada. Esta classe
ter a finalidade de representar a tabela presente em ambos os esquemas do banco de
dados. Feito isto, faz-se necessrio implement-la, definindo seus atributos, mtodos
acessores e mapeando-a com anotaes, conforme realizado na Listagem 5. E vlido
lembrar tambm de mape-la no arquivo persistence.xml, para que a unidade de
persistncia consiga gerenci-la.
Listagem 5. Implementao da classe Pessoa.

package br.edu.utfpr.modelo;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
//Mapeamento da classe com sua representao na base de dados
@Entity(name = "Pessoa")
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
//Definio de atributo identificador
@Id
private Long id;
private String nome;
// Mtodos get/set omitidos
}

Aps realizar a implementao da classe Pessoa, preciso criar um arquivo XML de


configuraes para o Hibernate. Este arquivo similar ao persitence.xml quanto a
finalidade, variando apenas na sintaxe e possuindo alguns recursos extras de
configurao especficos do Hibernate. O arquivo dever ser criado na pasta src e
nomeado como hibernate.cfg.xml. O corpo deste arquivo pode ser visto na Listagem 6.
Listagem 6. Arquivo de configuraes do Hibernate hibernate.cfg.xml.

<?xml version='1.0' encoding='utf-8'?>


<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.ejb.naming_strategy">
org.hibernate.cfg.ImprovedNamingStrategy"</property>
<property name="hibernate.connection.driver_class">
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

14/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/cliente1</property>
<property name="hibernate.connection.username">
user</property>
<property name="hibernate.connection.password">
Password</property>
<property name="hibernate.hbm2ddl.auto">
create-drop</property>
<property name="hibernate.show_sql">
true</property>
<property name="hibernate.format_sql">
true</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.multiTenancy">
schema</property>
<property name="hibernate.multi_tenant_connection_provider">
br.edu.utfpr.application.MultiTenantConnectionProviderImpl</property>
<mapping class="br.edu.utfpr.modelo.Pessoa" />
</session-factory>
</hibernate-configuration>

Neste arquivo existem duas propriedades que so extremamente importantes, pois so


elas que determinam o modelo de abordagem Multi-Tenancy que ser utilizada pela
aplicao. A primeira a hibernate.multiTenancy, que responsvel por definir que o
modelo que ser utilizado ser baseado em um esquema exclusivo por cliente, e a outra
propriedade a hibernate.multi_tenant_connection_provider, que define qual ser a
classe responsvel por obter as conexes de acordo com o identificador do cliente. As
demais propriedades devem ser configuradas de acordo com a base de dados utilizada,
com as classes de modelo que estaro passiveis de persistncia, e outras preferncias do
desenvolvedor.
Tendo configurado o arquivo XML com as propriedades do Hibernate, realiza-se ento a
criao das demais classes que compem o projeto. Estas classes so responsveis por
utilizar efetivamente o recurso de Multi-Tenancy baseado no esquema exclusivo por
cliente.
A Listagem 7 apresenta a classe ConnectionProviderBuilder com alguns comentrios
sobre algumas das suas caractersticas. Ela disponibiliza dois mtodos que, em conjunto,
so responsveis por fornecer conexes configuradas para o SGBD escolhido. O mtodo
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

15/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

getConnectionProviderProperties(), por exemplo, se encarregar de construir e


devolver um arquivo de propriedades com todos os parmetros necessrios para
estabelecer tais conexes, enquanto o mtodo buildConnectionProvider() utilizar
este recurso para criar uma instncia da classe
DriverManagerConnectionProviderImpl, que tem como papel fornecer conexes
valendo-se dos recursos da classe DriverManager.
Listagem 7. Classe construtora de provedores de conexes
ConnectionProviderBuilder.

package br.edu.utfpr.application;
import java.util.Properties;
import org.hibernate.cfg.Environment;
import org.hibernate.service.jdbc.connections.internal
.DriverManagerConnectionProviderImpl;
//Classe responsvel por prover conexo com o banco de dados a partir de
//configuraes e propriedades
public class ConnectionProviderBuilder {
//Constantes utilizadas para configurao da conexo com a base de dados.
public static final String DRIVER = "com.mysql.jdbc.Driver";
//Para este exemplo assumiu-se o esquema cliente1 como default.
public static final String URL =
"jdbc:mysql://localhost:3306/cliente1";
public static final String USER = "user";
public static final String PASS = "password";
public static Properties getConnectionProviderProperties
(String dbName) {
Properties props = new Properties(null);
props.put(Environment.DRIVER, DRIVER);
props.put(Environment.URL, String.format(URL, dbName));
props.put(Environment.USER, USER);
props.put(Environment.PASS, PASS);
return props;
}
private static DriverManagerConnectionProviderImpl
buildConnectionProvider(
Properties props, final boolean allowAggressiveRelease) {
DriverManagerConnectionProviderImpl connectionProvider =
new DriverManagerConnectionProviderImpl() {
public boolean supportsAggressiveRelease() {
return allowAggressiveRelease;
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

16/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

}
};
connectionProvider.configure(props);
return connectionProvider;
}
}

Concluda a implementao de ConnectionProviderBuilder, deve-se criar uma nova


classe para que seja possvel obter conexes baseadas em identificadores. Seu nome,
acompanhado de sua localizao no projeto, devem ser atribudos propriedade
hibernate.multi_tenant_connection_provider, definida no XML de configuraes do
Hibernate.
Esta nova classe, em nosso exemplo, receber o nome de
MultiTenantConnectionProviderImpl, e ser responsvel por prover conexes de
acordo com o identificador do inquilino, sendo esta uma das caractersticas essenciais na
implementao do modelo arquitetural Multi-Tenant. Para que isso seja possvel o
Hibernate fornece a interface MultiTenantConnectionProvider, que define uma srie de
mtodos necessrios para obteno e liberao do acesso fonte de dados e que devem
ser implementados. Detalhes de sua implementao esto apresentados na Listagem 8.
Listagem 8. Classe provedora de conexes baseadas em identificadores
MultiTenantConnectionProviderImpl.

package br.edu.utfpr.application;
import java.sql.Connection;
import java.sql.SQLException;
import org.hibernate.HibernateException;
import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.service.jdbc.connections.spi.MultiTenantConnectionProvider;
//Classe responsvel por prover conexes baseadas nos identificadores
// dos clientes
public class MultiTenantConnectionProviderImpl implements
MultiTenantConnectionProvider {
//Definio da instncia da classe construtora de provedores de conexo
private final ConnectionProvider connectionProvider =
ConnectionProviderBuilder
.buildConnectionProvider("cliente1");

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

17/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

//Mtodo que permite o acesso base de dados em situaes onde no h


//identificadores para os clientes
@Override
public Connection getAnyConnection() throws SQLException {
return connectionProvider.getConnection();
}
//Mtodo de libera uma conexo obtida atravs do mtodo
// getAnyConnection()
@Override
public void releaseAnyConnection(Connection connection)
throws SQLException {
connectionProvider.closeConnection(connection);
}
//Mtodo que obtm uma conexo de acordo com o identificador do cliente
//(esquema)
@Override
public Connection getConnection(String tenantIdentifier)
throws SQLException {
final Connection connection = getAnyConnection();
try {
connection.createStatement().execute("USE " +
tenantIdentifier);
} catch (SQLException e) {
throw new HibernateException(
"No pode alterar a conexo para o esquema especificado ["
+ tenantIdentifier + "]", e);
}
return connection;
}
//Mtodo que libera uma conexo obtida atravs do mtodo
// getConnection()
@Override
public void releaseConnection(String tenantIdentifier,
Connection connection)
throws SQLException {
try {
connection.createStatement().execute("USE " +
tenantIdentifier);
} catch (SQLException e) {
throw new HibernateException(
" No pode alterar a conexo para o esquema especificado ["
+ tenantIdentifier + "]", e);
}
connectionProvider.closeConnection(connection);
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

18/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

}
//Mtodos no utilizados neste exemplo, mas que precisam ser sobrescritos.
@Override
public boolean isUnwrappableAs(@SuppressWarnings("rawtypes")
Class arg0) {
@Override
public <T> T unwrap(Class<T> arg0) {
@Override
public boolean supportsAggressiveRelease() {
}

Para finalizar, prope-se a criao de uma classe para inserir alguns registros na base de
dados, apenas para demonstrar o uso da funcionalidade de Multi-Tenancy. A
implementao desta visa obter sesses de acordo com o inquilino desejado e realizar
inseres utilizando a sesso adquirida. A Listagem 9 apresenta o cdigo dessa classe.
Um detalhe importante nesta classe a definio do mtodo
configureSessionFactory(), que segue o novo modelo definido pelo Hibernate para
obteno de uma SessionFactory. Seu funcionamento baseia-se essencialmente na
utilizao do arquivo XML de propriedades para configurar novas fbricas de sesso.
Listagem 9. Cdigo da classe de testes MultiTenancyEsquemaExclusivo.

package br.edu.utfpr.application;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import br.edu.utfpr.modelo.Pessoa;
public class MultiTenancyEsquemaExclusivo {
// Fbrica de sesses
private static SessionFactory sessionFactory;
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

19/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

public static void main(String[] args) {


sessionFactory = configureSessionFactory();
//Obteno de sesso atravs do identificador do cliente1
Session session = sessionFactory.withOptions()
.tenantIdentifier("cliente1").openSession();
session.beginTransaction();
Pessoa pessoa = new Pessoa();
pessoa.setId(1L);
pessoa.setNome("Tenant One");
session.save(pessoa);
session.getTransaction().commit();
//Encerrando sesso do cliente1
session.close();
//Obteno de sesso atravs do identificador do cliente2
session = sessionFactory.withOptions().tenantIdentifier("cliente2")
.openSession();
session.beginTransaction();
Pessoa pessoa2 = new Pessoa();
pessoa2.setId(1L);
pessoa2.setNome("Tenant Two");
session.save(pessoa2);
session.getTransaction().commit();
//Encerrando sesso do cliente2
session.close();
}
// Mtodo que realiza as configuraes da fbrica de sesses
private static SessionFactory configureSessionFactory()
throws HibernateException {
Configuration configuration = new Configuration().configure();
ServiceRegistryBuilder serviceRegistryBuilder =
new ServiceRegistryBuilder();
serviceRegistryBuilder.applySettings
(configuration.getProperties());
ServiceRegistry serviceRegistry =
serviceRegistryBuilder.buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory
(serviceRegistry);
return sessionFactory;
}
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

20/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

A Listagem 10 apresenta o resultado obtido aps a execuo da classe de testes


MultiTenancyEsquemaExclusivo. Esse resultado demonstra que o processo de
insero seguiu a definio do cliente, conforme os parmetros utilizados na obteno de
novas sesses, e que os dados foram armazenados de acordo com a separao por
esquema.
Listagem 10. Resultado da execuo da aplicao.

Mar 10, 2013 3:53:07 AM org.hibernate.tool.hbm2ddl.SchemaExport execute


INFO: HHH000230: Schema export complete
Hibernate:
insert
into
Pessoa
(nome, id)
values
(?, ?)
Hibernate:
insert
into
Pessoa
(nome, id)
values
(?, ?)

A Listagem 11 apresenta duas consultas feitas nas tabelas para checar os resultados
das inseres. Como pode ser visto a partir dos registros retornados, as aes de
insero foram bem sucedidas.
Listagem 11. Resultado das consultas realizadas nas tabelas de cada cliente.

mysql> USE cliente1;


mysql> SELECT * FROM Pessoa;
+----+------------+
| id | nome

+----+------------+
| 1 + Tenant One |
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

21/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

+----+------------+
mysql> USE cliente2;
mysql> SELECT * FROM Pessoa;
+----+------------+
| id | nome

+----+------------+
| 1 + Tenant Two |
+----+------------+

Concluso
Este artigo apresentou as opes de suporte que o framework Hibernate, na verso 4,
oferece ao modelo arquitetural Multi-Tenant. Foram descritas algumas das caractersticas
presentes na nova verso da ferramenta e um dos recursos adicionados foi trabalhado
em um exemplo prtico.
Alm de expor variaes do modelo Multi-Tenant, foi construda uma aplicao a fim de
exemplificar a atuao do framework sobre uma destas alternativas. O modelo escolhido
define que cada cliente possui um esquema exclusivo em uma base de dados
compartilhada.
O exemplo abordado serve para compreender e aplicar a soluo em um dos possveis
modelos de arquitetura, porm, cabe ao arquiteto do sistema optar pela opo que
melhor se ajusta s necessidades do projeto, levando em considerao os fatores
positivos e negativos relacionados sua adoo.
Dentre as principais vantagens associadas ao emprego de uma soluo Multi-Tenant,
destacam-se a significativa reduo de custos com recursos fsicos, devido ao
compartilhamento e reutilizao de infraestrutura de hardware, e a integridade dos dados
dos diversos clientes, garantida pelo isolamento que os modelos proporcionam.
Em contrapartida, podem ser considerados aspectos negativos: a dificuldade de calcular
os recursos necessrios para cada novo cliente, garantindo que os demais inquilinos no
sofram influncia negativa desta incluso, e o risco associado a uma possvel falha nos
recursos de uso compartilhado, que pode acabar afetando vrios clientes e ocasionar
uma perda de grandes volumes de dados.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

22/23

29/7/2014

Introduo a Multi-Tenancy com Hibernate 4

Links
Hibernate Community Documentation Multi-Tenancy
http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch16.html
Hibernate 4: multitenancy, extenses, OSGI e uma entrevista com o lder do
projeto
http://www.infoq.com/br/news/2012/01/hibernate-4
Multi-Tenant Data Architecture
http://msdn.microsoft.com/en-us/library/aa479086.aspx
Using Hibernate to Implement Multi-Tenant Cloud Architecture
http://www.devx.com/Java/Article/47817/0/page/2
What is Hibernate
http://onjava.com/pub/a/onjava/2005/09/21/what-is-hibernate.html
Hibernate JavaDoc 4.1
http://docs.jboss.org/hibernate/orm/4.1/javadocs/
Hibernate JBoss Community
http://www.hibernate.org

DevMedia - Equipe De Moderao


A DevMedia um portal para analistas, desenvolvedores de sistemas, gerentes e DBAs com milhares de
artigos, dicas, cursos e videoaulas gratuitos e exclusivos para assinantes.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=29114

23/23