Particionamento de Banco com o Hibernate Shards

Documentos relacionados
Vamos falar de Hibernate?

AULA 07 HIBERNATE. Ao término desse capítulo você terá aprendido: Fundamentos do MVC Estrutura dos pacotes no NetBeans

Mecanismo de Persistência

Introdução ao Hibernate. Hibernate Mapeamento com Anotação. Projeto Desktop Uma Classe. Objetivo. Programas Utilizados

Curso de Java. Acesso a banco de dados através do Hibernate. Todos os direitos reservados Klais

POO Programação Orientada a Objetos

DW2 Desenvolvimento Web 2

Utilizando Swing com Hibernate

JPA Com Hibernate. Paulo Ricardo Lisboa de Almeida. 1 Universidade Positivo

Mapeamento Objeto-Relacional

Este Tutorial básico irá nos orientar como salvar e carregar uma imagem a partir de banco de dados (MySQL), utilizando Hibernate e Java.

Parte III Persistência entre Modelos de Dados

Desenvolvimento Web com Java. Sérgio Lopes Caelum -

De forma simples, para a execução de comandos SQL com JDBC, precisa-se da instancia de três classes Java. São elas: Nome da classe Função

Desenvolvimento para Web em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM Lamarck Heinsch Mestrando PPGI/CT/UFSM

Injeção de Dependências e Spring

Spring Framework. Parte 04 transações

UTILIZAÇÃO DO FRAMEWORK HIBERNATE NA CONSTRUÇÃO DE UM SISTEMA DE INFORMAÇÃO

JPA Java Persistence API. Prof. Ramon Chiara

PROJETO INTEGRADOR Levantamento de Requisitos

PLATAFORMA SIGA RIO DAS VELHAS MANUAL DO CÓDIGO FONTE

Integrando recuperação de informação em banco de dados com Hibernate Search

PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Departamento de Computação Curso de Análise e Desenvolvimento de Sistemas Modelagem Conceitual de Dados

INE 5612 Professor: Frank Siqueira. Leonardo Silva Jean Ercilio Thiago


Conexão do Banco de Dados localhost

Organizando seus Testes Funcionais AUMENTANDO A MANUTENIBILIDADE DE TESTES FUNCIONAIS ATRAVÉS DA ORIENTAÇÃO A OBJETOS.

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

UNIVERSIDADE FEDERAL DO PIAUÍ DEPARTAMENTO DE COMPUTÇÃO DISCIPLINA: ENGENHARIA DE SOFTWARE II PROFESSOR: ARMANDO SOARES

Linguagem de Programação II Implementação

Mapeando Relacionamentos Entre Classes com Anotações Hibernate Por: Raphaela Galhardo Fernandes Gleydson de Azevedo F. Lima

Um exemplo de aplicação multi-tenancy com Hibernate Shards

Mapeamento Objeto-Relacional (Object Relational Mapping)


TUTORIAL INTEGRAÇÃO SPRING, HIBERNATE E MYSQL

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Java para Desktop. Programação Orientada à Objetos 2 JSE

Tratando exceções em Java

JPA: Persistência padronizada em Java

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Tratamento de Exceção. Programação Orientada a Objetos Java (Rone Ilídio)

Carlos S. Rodrigues Leonardo Lino Vieira Eric Felipe Barboza Antonio Vasconcellos

DATA ACCESS OBJECT (DAO)

Lista de exercícios I - RESPOSTAS Servlets e banco de dados

Tipos, Literais, Operadores

Tipos, Literais, Operadores

C A P I T U L O 10 F U N Ç Õ E S I N T E R N A S P H P P A R A B A N C O D E D A D O S

Tabelas. Banco de Dados I MySQL

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

Desvendando o Hibernate

Objetos Dublês. Mariana Bravo AgilCoop Cursos de Verão 2009

Desenvolvendo aplicações Java

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

Armazendando Senhas Com Funções de Hash

Hibernate Anotations

Testes com objetos mock. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos

Modelo de Componentes CORBA

Tutorial: Utilização do sqlite no Android (Parte I)

J550 JSP com tags padrão

Lista de Exercícios da disciplina Aplicações de Linguagem de Programação Orientada a objetos

Objetos Dublês. AgilCoop Cursos de Verão Mariana Bravo IME/USP

Introdução ao Desenvolvimento de

JAVA TÓPICOS ESPECIAIS DE PROGRAMACAO ORIENTADA A OBJETOS

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Agenda. Instalação e configuração. Processamento de comandos SQL com JDBC. Driver JDBC Criação da classe de conexão

Curso Superior de Banco de Dados

UFG - Instituto de Informática

Mapeamento Lógico/Relacional com JPA

Laboratório de Banco de Dados. Prof. Luiz Vivacqua.

Programação Estruturada e Orientada a Objetos

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Linguagem de Programação III

Administração de Sistemas Operacionais. Prof. Marlon Marcon

Tutorial Hibernate + Vraptor para projetos Restful.

Unidade 12: Programação de Banco de Dados com Java Prof. Daniel Caetano

SMC Sistema de Gerenciamento de Loja de Manutenção de Celular.

Desenvolvimento de um Framework para replicação de dados entre bancos heterogêneos

Aula Extra Configuração do Eclipse com Hibernate

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula de Revisão para AV1

Regras de Navegação e Templates

Grails. Desenvolvimento Java Açucarado

Sistema para acompanhamento de Trabalhos de Conclusão de Curso. Elisângela Cristina Lombardi Klitzke Acadêmica Dalton Solano dos Reis - Orientador

Orientação a Objetos e Java

Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

SOFTWARE DE APOIO A GESTÃO DE SOLICITAÇÃO DE MUDANÇAS

Introdução. Configuração. Padrão POJO. Framework Pesistência de. Mapeamento Annotation. Objetos. Persistência. Java. Objetos. Prof.

Oracle Objeto-Relacional. Pablo Vieira Florentino

Programação Orientada a Objetos

Nota de Aplicação: Utilização de Base de Dados MySQL com BluePlant. Sumário

Diagrama de Classes Módulo de Treinamento FIGURA 19: DIAGRAMA DE CLASSES DO MÓDULO DE TREINAMENTO

AULA 2 VISÃO BÁSICA DE CLASSES EM PHP

Agilizando o processo de redeploy de aplicações Java

Programação Orientada a Objetos Relacionamentos entre classes

Programação Orientada a Objetos

Utilização do Framework Hibernate na criação de um sistema web para avaliação de fornecedores

JDBC - Java Data Base Connectivity

Resolvendo objeto-relacional impedance mismatch com hibernate

Transcrição:

Ademir Constantino Filho (ademirconstantino@gmail.com): é bacharel em Sistemas de Informação e atua com Java desde 2002. Atualmente atua com desenvolvimento, consultoria e como instrutor para treinamentos. Particionamento de Banco com o Hibernate Shards equipe de projetistas de um sistema de uma rede social tem como objetivo rever o sistema, que hoje centraliza todos os dados de usuários em um único banco de dados e por isso servidores estão sempre operando no vermelho devido ao alto número de transações de leitura e gravação, o que está comprometendo a disponibilidade do serviço para seus usuários. Com a disponibilidade de serviços em alta escala nos últimos anos, empresas com grande volume de dados em serviços de grande porte tendem a aplicar conceitos de computação distribuída, mais especificamente bancos de dados distribuídos como solução de distribuição de dados geograficamente. O framework Hibernate Shards permite o desenvolvimento de soluções de particionamento horizontal com Java. Problema como este não é novidade em sistemas centralizados com um grande número de acesso, e que ainda com o grande crescimento no número de usuários e alta carga têm tido dificuldade em operar para atender grandes demandas. O fato é que limitações de hardware comprometem a disponibilidade de sistemas e como solução, o particionamento horizontal de dados e frameworks que auxiliam no desenvolvimento e utilizam este conceito, como o Hibernate Shards, começam a surgir e ganhar popularidade no mercado. Este artigo pretende introduzir os primeiros passos para a programação utilizando o framework Hibernate Shards, em que na Seção 1 Introdução é apresentado o conceito de Database sharding e particionamento horizontal de dados, na Seção 2 Desenvolvendo uma aplicação de registro e login de usuários a aplicação proposta é apresentada com os devidos passos de configuração e os conceitos que envolvem a programação utilizando o framework e enfim nas considerações finais uma análise de tendências de aplicação no futuro. 31

: : www.mundoj.com.br : : Particionamento horizontal e Database sharding O conceito de particionamento horizontal de dados permite que uma tabela seja dividida entre várias tabelas com o mesmo número de colunas, mas menos linhas. Por exemplo: uma tabela de Usuários pode ser dividida em quatro tabelas, cada uma armazenando dados dos usuários de sua região (considerando Norte, Sul, Leste e Oeste) e estar localizada em diferentes servidores em sua infraestrutura, melhorando o desempenho e facilitando a manutenção. O conceito de database sharding é um método de particionamento horizontal que tem ganhado popularidade nos últimos anos pelo enorme aumento de transações e tamanho dos bancos de dados corporativos. Esta particularidade é real para muitos provedores de serviços que utilizam o conceito de SaaS (Software as a Service) e sites de redes sociais. A ideia central aqui é imaginar um banco de dados quebrado em cacos (tradução livre para shard: caco), ou seja, em várias partes, ou ainda distribuído. Este conceito foi criado pelos engenheiros da Google e popularizado pela arquitetura BigTable utilizada nos serviços da Google. Para o entendimento do conceito de database sharding, considere o sistema de uma empresa, que possui uma matriz e três unidades. Se considerarmos o modelo ideal para este sistema, poderemos considerar o modelo onde cada unidade armazena seus dados, compartilhando ainda os dados em comum da matriz conforme a figura 1. Sistema Matriz Figura 2. Bibliotecas e dependências do projeto. Com todos os jars em sua aplicação devemos configurar os arquivos de configuração do hibernate. O hibernate shards utiliza um arquivo de configuração do hibernate para cada banco de dados configurado, podendo ser até mesmo o mesmo host, porém bancos distintos. Para o aprendizado é utilizado apenas um servidor mysql e dois bancos de dados distintos, porém o primeiro ou segundo banco de dados pode ser alterado para um postgres, Oracle ou até mesmo db2 sem muita dificuldade, apenas alterando o arquivo de configuração referente ao shard que estivermos configurando. Listagem 1. Código de configuração do shard a. Unidade 1 Unidade 2 Unidade 3 Figura 1. Modelo para um sistema que utiliza o conceito de Database Sharding. Para implementar soluções em shards em Java, o projeto Hibernate Shards surgiu com o intuito de facilitar o desenvolvimento utilizando os conceitos de database sharding, permitindo ainda que toda a programação possa ser feita utilizando o hibernate, um framework altamente popular na comunidade Java. Desenvolvendo uma aplicação de registro e login de usuários Nesta aplicação, o usuário pode efetuar seu cadastro selecionando o banco de dados em que será gravado seus dados, e em seguida, sem distinção de banco de dados o login é efetuado utilizando uma consulta em dois banco de dados. A aplicação que é usada para exemplificar utiliza JSF, Hibernate Core e Hibernate Shards com annotations e ainda IDE eclipse. O primeiro passo para a criação de nossa aplicação é criar um projeto web no eclipse com faceta Java Server Faces 1.2. Como o foco deste artigo não é o de como criar aplicações em JSF, estes detalhes não são abordados. Após criar a aplicação em JSF é necessário adicionar os jars do hibernate e suas dependências. <?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 name= MySQLSessionFactory > <property name= connection.driver_class >com.mysql.jdbc.driver</ property> <property name= connection.url > jdbc:mysql://localhost:3306/mjshards_a </property> <property name= connection.username >root</property> <property name= connection.password >123</property> <property name= connection.pool_size >1</property> <property name= dialect > org.hibernate.dialect.mysqldialect</property> <property name= hibernate.connection.shard_id >0</property> <property name= show_sql >true</property> <property name= hbm2ddl.auto >none</property> <property name= hibernate.shard.enable_cross_shard_relationship_checks > true</property> <mapping class= br.com.mundoj.mjshards.entity.usuarioentity /> </session-factory> </hibernate-configuration> 32

Listagem 2. Código de configuração do shard b. <?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 name= MysqlBSessionFactory > <property name= connection.driver_class >com.mysql.jdbc.driver </property> <property name= connection.url >jdbc:mysql://localhost:3306/mjshards_b </property> <property name= connection.username >root</property> <property name= connection.password >123</property> <property name= connection.pool_size >1</property> <property name= dialect >org.hibernate.dialect.mysqldialect </property> <property name= hibernate.connection.shard_id >1</property> <property name= show_sql >true</property> <property name= hbm2ddl.auto >none</property> <property name= hibernate.shard.enable_cross_shard_relationship_checks > true</property> <mapping class= br.com.mundoj.mjshards.entity.usuarioentity /> </session-factory> </hibernate-configuration> Os arquivos de configuração são exatamente iguais aos comuns do Hibernate, porém possuem duas propriedades a mais, uma define o id do shard onde são realizados os relacionamentos cruzados. No nó session-factory passa a existir também o atributo name. Isto significa que estamos trabalhando com mais de uma session factory, embora tudo seja controlado pelo framework. O hibernate-shards provê implementações específicas para serem utilizadas quando usados seus recursos. Para isto algumas extensões de classes básicas do Hibernate devem ser utilizadas. Na tabela abaixo é apresentada uma relação das diferenças de classes que são utilizadas quando utilizado o framework Hibernate Shards. Hibernate Core rg.hibernate.session org.hibernate.criteria org.hibernate.query org.hibernate.sessionfactory Hibernate-shards org.hibernate.shards.session. ShardedSession org.hibernate.shards.sharded- SessionFactory org.hibernate.shards.criteria. ShardedCriteria org.hibernate.shards.query. ShardedQuery Após criado no mysql os bancos de dados mjshards_a e mjshards_b, devemos criar uma tabela chamada usuário, como é apresentado na Listagem 3. Listagem 3. Código de criação da tabela Usuário. CREATE TABLE IF NOT EXISTS USUARIO ( ID INT NOT NULL, USUARIO VARCHAR(45) NULL, SENHA VARCHAR(45) NULL, PRIMARY KEY ( ID ) ) É importante compreender que esta tabela deve existir em ambos os bancos de dados. Note que não existe uma constraint para controle de numeração. Isto é importante de ser controlado em nossa aplicação, pois ids não podem ser duplicados em banco de dados quando trabalhamos com o particionamento horizontal. Logo após a criação da tabela em ambos os bancos, deve ser criado também o mapeamento da classe Usuario como apresentado na Listagem 4. Listagem 4. Código da entidade UsuarioEntity. @Entity @Table(name = USUARIO ) public class UsuarioEntity extends AbstractEntity { @Id @GenericGenerator(name= UsuarioGenerator, strategy= org.hibernate. shards.id.shardeduuidgenerator ) private Long id; @Column(name = USUARIO ) private String usuario; @Column(name = SENHA ) private String senha; private transient String idbanco; // getters e setters Note que o schema não foi configurado para esta entidade. Isto evita que a consulta seja feita em apenas um dos repositórios de dados. Note também que a estratégia de geração de ids foi configurada para ser gerenciada pela aplicação, portanto no momento da gravação de um registro o id será informado. Existem algumas soluções para o gerenciamento de IDS, a saber: Native id generation: com a geração de ids nativas do hibernate o banco de dados pode ser configurado para que os ids nunca colidam. Por exemplo, você pode configurar o banco de dados 1 para gerar ids de 0 a 1000 e o banco de dados 2 iniciando de 1000 a 2000 (embora isto seja uma particularidade do banco de dados). Geração de id em nível de aplicação: pode ser implementada uma solução para que o gerenciamento de ids seja feito por sua aplicação, dependendo de seus requisitos e regras de negócio. Para isto o hibernate provê um gerador chamado ShardedUUIDGenerator. Hilo Generator: com esta solução as chaves são guardadas em uma tabela específica em uma das shards configuradas no hibernate, embora este assunto não seja tratado neste artigo, a documentação possui informações sobre como utilizá-lo. Após configurarmos nossa entidade no banco de dados e o mapeamento de sua classe, será necessário criar uma classe utilitária para trabalhar com os objetos shards, assim como normalmente é criada uma classe utilitária em aplicações hibernate, temos a seguinte implementação (Listagem 5). 33

: : www.mundoj.com.br : : Listagem 5. Classe utilitária do Hibernate. public class ShardedHibernateUtil { private static final ShardedSessionFactory sessionfactory; static { try { sessionfactory = createsessionfactory(); catch (Throwable ex) { throw new ExceptionInInitializerError(ex); public static ShardedSessionFactory getsessionfactory() { return sessionfactory; private static ShardedSessionFactory createsessionfactory() { Configuration prototypeconfig = new AnnotationConfiguration(). configure( mysql.shard.configuration.xml ); ((AnnotationConfiguration)prototypeConfig). addannotatedclass(br.com.mundoj.mjshards.entity.usuarioentity.class); List<ShardConfiguration> shardconfigs = new ArrayList<ShardConfiguration>(); shardconfigs.add(buildshardconfig( mysql.shard.configuration.xml )); shardconfigs.add(buildshardconfig( mysqlb.shard.configuration.xml )); ShardStrategyFactory shardstrategyfactory = buildshardstrategyfactory(); ShardedConfiguration shardedconfig = new ShardedConfiguration( prototypeconfig, shardconfigs, shardstrategyfactory); return shardedconfig.buildshardedsessionfactory(); private static ShardStrategyFactory buildshardstrategyfactory() { ShardStrategyFactory shardstrategyfactory = new ShardStrategyFactory() { ; public ShardStrategy newshardstrategy(list<shardid> shardids) { RoundRobinShardLoadBalancer loadbalancer = new RoundRobinShardLoadBalancer(shardIds); ShardSelectionStrategy pss = new MJShardsSelectionStrategy(); ShardResolutionStrategy prs = new AllShardsShardResolutionStrategy(shardIds); ShardAccessStrategy pas = new SequentialShardAccessStrategy(); return new ShardStrategyImpl(pss, prs, pas); return shardstrategyfactory; private static ShardConfiguration buildshardconfig(string configfile) { AnnotationConfiguration config = new AnnotationConfiguration().configure(configFile); Cont. Listagem 5. Classe utilitária do Hibernate. return new ConfigurationToShardConfigurationAdapter(config); O método createsessionfactory acima cria uma configuração para dois bancos de dados utilizando o Hibernate Shards, criando também uma solução de estratégia para a session factory. Uma estratégia define como os dados são armazenados e como eles serão recuperados através de queries. A mais simples das estratégias, ShardAccessStrategy, que é usada para determinar como aplicar operações do banco de dados entre múltiplos shards. A ShardAccessStrategy é consultada sempre que você executar uma query entre suas shards. Duas implementações que utilizam esta interface estão disponíveis. a) SequentialShardAccessStrategy SequentialShardAccessStrategy se comporta exatamente do jeito que é implicada por seu nome: queries são executadas em suas shards em sequência. Dependendo do tipo das queries executadas você pode alterar esta implementação porque as queries serão executadas na mesma ordem todas as vezes. b) ParallelShardAccessStrategy ParallelShardAccessStrategy também se comporta exatamente como o nome diz: as queries são executadas em suas shards em paralelo. Quando você usar esta implementação você irá precisar prover uma java.util.concurrent.threadpoolexecutor que é adaptável para a performance de sua aplicação. Outra estratégia disponível é a ShardSelectionStrategy usada para determinar em qual shard um novo objeto deve ser criado que será usado neste projeto para definir em qual banco de dados será criado o usuário. Como sua implementação deverá funcionar deve ser totalmente configurada. Algumas soluções podem ser aplicadas utilizando atributos nas tabelas para definir a shard em que se está trabalhando. A estratégia de seleção do projeto está apresentada na Listagem 6. Listagem 6. Classe contendo a Estratégia de Gravação. public class MJShardsSelectionStrategy implements ShardSelectionStrategy { public ShardId selectshardidfornewobject(object obj) { if (obj instanceof UsuarioEntity) { UsuarioEntity usuario = (UsuarioEntity) obj; Integer idbanco = Integer.parseInt(usuario.getIdBanco()); return new ShardId(idBanco); return new ShardId(0); 34

O seguinte código cria uma estratégia de seleção onde o id do shard a ser gravado é definido pela propriedade UsuarioEntity. idbanco. Neste objeto poderia ser configurada a estratégia para todos os objetos do sistema, bastando incluir condições IF para a instância de classes e as verificações conforme requisitos. Para a criação de um login, nossa aplicação executará a regra conforme ilustrado na figura 3. cont. Listagem 7. Classe de controle da aplicação. public String dologin() throws Exception { if(loginservice.efetualogin(usuario, senha)) { return sucesso ; else { return falha ; public void criarlogin() { loginservice.crialogin(banco, novousuario, novasenha); // getters e setters Figura 3. Digrama de sequência ilustrando o fluxo de gravação. O sistema basicamente disponibiliza uma tela de entrada de dados para que o usuário registre um novo usuário, porém existe uma combo Box indicando qual será o banco de dados onde o dado será gravado. Logo após o registro, caso tudo ocorra com sucesso, é possível validar o usuário através de login. As listagens 7, 8 e 9 apresentam as classes com a implementação. Listagem 8. Classe de negócio da aplicação. public class LoginService { private LoginDAO logindao = new LoginDAO(); public boolean efetualogin(string usuario, String senha) throws Exception { UsuarioEntity usuariovo = (UsuarioEntity) logindao.dologin(usuario, senha); if(usuariovo!= null && usuariovo.getid() > 0) { return true; else { return false; Listagem 7. Classe de controle da aplicação. public class LoginBean { private LoginService loginservice; private String usuario, senha; private String novousuario, novasenha; private String banco; public LoginBean() { loginservice = new LoginService(); /** * Método responsável por realizar o login da aplicação */ public void crialogin(string banco, String usuario, String senha) { logindao.criarlogin(banco, usuario, senha); public LoginDAO getlogindao() { return logindao; public void setlogindao(logindao logindao) { this.logindao = logindao; 35

: : www.mundoj.com.br : : Listagem 9. Classe DAO da aplicação. public class LoginDAO extends GenericHibernateDAO<UsuarioEntity> { public LoginDAO() { super(usuarioentity.class); /** * Método responsável por buscar um login através de usuário e senha * * @param usuario * @param senha * @return Um objeto do tipo usuário Entity contendo o usuário logado */ public UsuarioEntity dologin(string usuario, String senha) { Considerações finais Com os conceitos de Software as a Service e o grande volume de dados, existe uma grande tendência para adoção dos conceitos de database sharding no futuro. Observa-se que em sistemas de redes sociais estes recursos já são utilizados e o framework Hibernate Shards nos permite de forma simples implementar uma solução de particionamento horizontal em Java Referências http://sourceforge.net/projects/hibernate/files/hibernate-shards http://www.codefutures.com/database-sharding/ http://www.hibernate.org/subprojects/shards.html ShardedSession s = (ShardedSession) ShardedHibernateUtil.getSessionFactory().openSession(); ShardedCriteria q = (ShardedCriteria) s.createcriteria( UsuarioEntity.class).add(Restrictions.eq( usuario, usuario)).add(restrictions.eq( senha, senha)); UsuarioEntity retornologin = (UsuarioEntity) q.uniqueresult(); s.close(); return retornologin; public void criarlogin(string banco, String usuario, String senha) { ShardedSession s = (ShardedSession) ShardedHibernateUtil.getSessionFactory().openSession(); Transaction tx = s.begintransaction(); UsuarioEntity novologin = new UsuarioEntity(); novologin.setusuario(usuario); novologin.setsenha(senha); novologin.setidbanco(banco); novologin.setid(0l); List<Long> idshard = s.createquery( select max(usuario.id) from UsuarioEntity usuario ).list(); for(long idmax: idshard) { if(idmax!= null) { if((novologin.getid() <= idmax) ) { idmax++; novologin.setid(idmax); s.save(novologin); tx.commit(); s.close(); 36