quarta-feira, 1 de março de 2023

Problema N +1 utilizando JPA

 


O problema n+1 é um desafio comum que os desenvolvedores enfrentam ao usar o JPA (Java Persistence API) para acessar bancos de dados relacionais. Em essência, o problema n+1 ocorre quando a aplicação realiza uma consulta ao banco de dados e depois, para cada resultado da consulta, realiza uma segunda consulta para buscar informações adicionais relacionadas a esses resultados. Esse problema pode ter um impacto significativo no desempenho da aplicação e, portanto, é importante entender como evitá-lo.

Antes de explicarmos como evitar o problema n+1 no Java usando JPA, é importante entender como ele ocorre. Considere o seguinte exemplo: suponha que temos uma classe de entidade chamada "Pedido" que possui uma associação com a classe "Cliente" por meio do atributo "cliente". Se desejamos recuperar todos os pedidos e seus clientes associados, podemos usar a seguinte consulta em JPQL:

SELECT p FROM Pedido p JOIN FETCH p.cliente

Essa consulta buscará todos os pedidos e seus clientes associados. No entanto, ela também pode ser responsável por criar o problema n+1. Quando a consulta é executada, ela buscará todos os pedidos e seus clientes associados. Mas, em seguida, para cada resultado da consulta, uma segunda consulta será realizada para buscar informações adicionais relacionadas a esses resultados, como o endereço do cliente ou seus pedidos anteriores.

Isso significa que, se tivermos 100 pedidos em nossa consulta, seremos obrigados a realizar 101 consultas: uma para buscar os pedidos e 100 para buscar informações adicionais sobre os clientes. Esse comportamento pode ser muito custoso em termos de tempo de execução e recursos do servidor, especialmente quando lidamos com grandes conjuntos de dados.

Felizmente, existem várias maneiras de evitar o problema n+1 no Java usando JPA. Uma solução comum é usar o recurso de "fetch join" do JPA para buscar todos os dados relacionados em uma única consulta. Isso pode ser feito adicionando a cláusula "JOIN FETCH" à consulta original, como no exemplo acima.

No entanto, é importante notar que o uso excessivo de "fetch joins" pode prejudicar o desempenho da consulta. Isso ocorre porque, quanto mais dados são buscados em uma única consulta, mais tempo levará para executar a consulta e transferir os dados do banco de dados para a aplicação. Além disso, o uso de "fetch joins" também pode levar a consultas muito complexas, o que pode dificultar a manutenção e o desenvolvimento da aplicação.

Outra solução é usar a técnica de "eager loading" para pré-carregar os dados relacionados antes de realizar a consulta principal. Isso pode ser feito usando o método "findAll" em um repositório JPA, por exemplo:

List<Pedido> pedidos = pedidoRepository.findAllWithClientes();

O método "findAllWithClientes" usará uma consulta JPA para buscar todos os pedidos e seus clientes associados em uma única consulta, em vez de usar várias consultas para buscar informações adicionais relacionadas a cada resultado.

Por fim, também podemos usar o recurso de "lazy loading" para carregar os dados relacionados sob demanda, conforme necessário. Com o "lazy loading", os dados relacionados são buscados apenas quando o código da aplicação acessaos dados relacionados. Isso pode ser feito usando o atributo "fetch" nas associações JPA, como no exemplo abaixo:

@Entity public class Pedido { @ManyToOne(fetch = FetchType.LAZY) private Cliente cliente; // outros atributos e métodos da classe }


Nesse exemplo, o atributo "fetch" da associação "cliente" é definido como "LAZY". Isso significa que, quando um objeto "Pedido" é carregado, o objeto "Cliente" associado não será carregado automaticamente. Em vez disso, ele será carregado somente quando for necessário, como quando a propriedade "cliente" for acessada diretamente em código.

Essa abordagem pode ajudar a minimizar o número de consultas realizadas pelo JPA e reduzir o impacto do problema n+1 na aplicação. No entanto, é importante lembrar que o uso excessivo de "lazy loading" pode levar a um comportamento imprevisível da aplicação, especialmente quando lidamos com transações que abrangem vários objetos e associações.

Em resumo, o problema n+1 no Java usando JPA ocorre quando a aplicação realiza uma consulta ao banco de dados e, em seguida, para cada resultado da consulta, realiza uma segunda consulta para buscar informações adicionais relacionadas a esses resultados. Isso pode ter um impacto significativo no desempenho da aplicação e, portanto, é importante entender como evitá-lo. Algumas soluções comuns incluem o uso de "fetch joins", "eager loading" e "lazy loading" para minimizar o número de consultas realizadas e maximizar o desempenho da aplicação.

SDK Man!!!



O SDKMAN é uma ferramenta de gerenciamento de software para desenvolvedores Java que permite a instalação e gerenciamento de múltiplas versões de diversas ferramentas, como o Java, o Groovy, o Gradle e o Maven. Neste artigo, vamos explorar o uso do SDKMAN com o Java e como ele pode facilitar o desenvolvimento de aplicações em Java.

O SDKMAN é uma ferramenta de linha de comando que permite instalar e gerenciar diversas versões de diversas ferramentas, incluindo o Java. Com o SDKMAN, você pode instalar e gerenciar múltiplas versões do JDK (Java Development Kit) e do JRE (Java Runtime Environment) em um único ambiente.

Para começar a utilizar o SDKMAN com o Java, você precisa instalá-lo em seu sistema operacional. O processo de instalação é simples e pode ser realizado em poucos minutos. Após a instalação, você pode usar o comando sdk para listar as ferramentas disponíveis para instalação e gerenciamento.

Para instalar uma nova versão do JDK, basta utilizar o comando sdk install java. O SDKMAN exibirá uma lista das versões disponíveis do JDK e você poderá selecionar a que deseja instalar. Após a instalação, você pode definir a versão do JDK que deseja utilizar em um determinado projeto utilizando o comando sdk use java <versão>.

Uma das principais vantagens do SDKMAN é a sua capacidade de gerenciar múltiplas versões do JDK e do JRE em um único ambiente. Isso é especialmente útil para desenvolvedores que trabalham em projetos que exigem diferentes versões do Java. Com o SDKMAN, você pode facilmente alternar entre as versões do Java que precisa utilizar em seus projetos.

Além disso, o SDKMAN também permite a instalação e gerenciamento de outras ferramentas Java, como o Groovy, o Gradle e o Maven. Isso torna o processo de desenvolvimento ainda mais rápido e eficiente, pois você pode instalar e gerenciar todas as ferramentas necessárias em um único ambiente.

Outra vantagem do SDKMAN é que ele é compatível com diferentes sistemas operacionais, incluindo o Linux, o macOS e o Windows. Isso permite que desenvolvedores Java em diferentes plataformas utilizem a mesma ferramenta de gerenciamento de software.

No entanto, é importante lembrar que o SDKMAN não é uma ferramenta oficial da Oracle e que o uso de versões do JDK e do JRE instaladas através do SDKMAN pode afetar a compatibilidade com outras ferramentas e bibliotecas Java.

Em resumo, o SDKMAN é uma ferramenta de gerenciamento de software poderosa e flexível para desenvolvedores Java. Com o SDKMAN, você pode facilmente instalar e gerenciar múltiplas versões do JDK e do JRE em um único ambiente, além de outras ferramentas Java como o Groovy, o Gradle e o Maven. Seu uso pode acelerar o processo de desenvolvimento e torná-lo mais eficiente, permitindo que você se concentre na lógica do negócio em vez de se preocupar com a configuração e instalação de ferramentas e bibliotecas.

Mais informações em https://sdkman.io/

Projeto Lombok


Lombok é uma biblioteca Java que ajuda a reduzir a quantidade de código boilerplate que é necessário escrever em Java. A biblioteca inclui anotações que podem ser usadas em classes Java para gerar automaticamente o código comumente usado, como getters, setters, construtores e muito mais. Neste artigo, vamos explorar como o Lombok pode ser usado com o Spring Boot e outras aplicações Java.

Configurando o Lombok com o Spring Boot

Para usar o Lombok com o Spring Boot, você precisa incluir a dependência do Lombok no seu projeto. Você pode fazer isso adicionando a seguinte dependência ao seu arquivo pom.xml ou build.gradle:

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency>

Após adicionar a dependência, você precisa configurar o plugin do Lombok no seu ambiente de desenvolvimento. Isso pode ser feito adicionando o plugin do Lombok ao seu IDE, como Eclipse, IntelliJ IDEA ou NetBeans. Para fazer isso, você pode seguir as instruções detalhadas no site oficial do Lombok.

Usando o Lombok com o Spring Boot

O Lombok é amplamente utilizado em projetos Java e é compatível com a maioria dos frameworks e ferramentas Java, incluindo o Spring Boot. Com o Lombok, você pode reduzir drasticamente a quantidade de código necessário para criar uma classe Java. Em vez de criar métodos getters e setters para cada atributo de uma classe, por exemplo, você pode simplesmente adicionar a anotação @Getter e @Setter acima da definição do atributo e deixar o Lombok gerar automaticamente os métodos correspondentes.

No Spring Boot, o Lombok pode ser utilizado em conjunto com outras anotações, como @RestController e @Autowired. Isso torna o processo de desenvolvimento mais rápido e eficiente, pois você pode se concentrar na lógica do negócio em vez de se preocupar com a criação de métodos getters e setters.

Outra vantagem do Lombok é que ele pode ser facilmente integrado a outras ferramentas Java, como o Eclipse e o IntelliJ IDEA. Isso permite que você use a funcionalidade do Lombok diretamente na sua IDE, tornando o processo de desenvolvimento ainda mais rápido e eficiente.

Além disso, o Lombok também oferece outras anotações úteis, como @Builder e @Slf4j. A anotação @Builder permite que você crie objetos de maneira mais fácil e legível, enquanto a anotação @Slf4j simplifica o uso do framework de logging SLF4J.

Uma vez configurado o Lombok, você pode começar a usá-lo em suas classes Java. Aqui estão alguns exemplos de como usar as anotações do Lombok com o Spring Boot:

@Getter e @Setter

A anotação @Getter gera automaticamente os getters para todos os campos da classe, enquanto a anotação @Setter gera automaticamente os setters. Com o Lombok, você não precisa escrever esses métodos manualmente, o que economiza tempo e torna seu código mais limpo. Por exemplo:

@Data public class Pessoa { private String nome; private int idade; }

Com a anotação @Data, o Lombok gera automaticamente os getters e setters para os campos nome e idade.

@NoArgsConstructor e @AllArgsConstructor

A anotação @NoArgsConstructor gera automaticamente um construtor sem argumentos, enquanto a anotação @AllArgsConstructor gera automaticamente um construtor com todos os argumentos. Isso é especialmente útil quando você tem muitos campos em sua classe e não quer escrever um construtor manualmente. Por exemplo:

@Data @NoArgsConstructor @AllArgsConstructor public class Pessoa { private String nome; private int idade; }

Com a anotação @NoArgsConstructor, o Lombok gera automaticamente um construtor sem argumentos. Com a anotação @AllArgsConstructor, o Lombok gera automaticamente um construtor com todos os argumentos.

@Builder

A anotação @Builder gera automaticamente um construtor com padrão Builder. Isso permite que você crie objetos de maneira mais legível e fácil. Por exemplo:

@Data @Builder public class Pessoa { private String nome; private int idade; }

Com a anotação @Builder, você pode criar objetos dessa classe usando a sintaxe Builder. Por exemplo:

Pessoa pessoa = Pessoa.builder() .nome("João") .idade(25) .build();

Porém, é importante lembrar que o uso do Lombok pode afetar a legibilidade do seu código. Alguns desenvolvedores argumentam que o uso de anotações Lombok pode obscurecer o código, tornando-o mais difícil de entender e manter no futuro. Por isso, é importante utilizar o Lombok com moderação e sempre buscar um equilíbrio entre a simplicidade e a legibilidade do código.

Em resumo, o Lombok é uma ferramenta poderosa que pode facilitar o desenvolvimento de aplicações em Java. Seu uso em conjunto com o Spring Boot e outras ferramentas Java pode acelerar o processo de desenvolvimento e reduzir a quantidade de código necessário para criar uma classe Java. No entanto, é importante utilizar o Lombok com moderação e sempre considerar a legibilidade do código.



Spring Boot - Revolução no desenvolvimento com Java



Spring Boot é um dos frameworks mais populares para desenvolvimento de aplicativos Java. Criado pela Pivotal Software, o Spring Boot permite que os desenvolvedores construam aplicativos Java de maneira rápida e fácil, fornecendo um ambiente de desenvolvimento robusto e consistente.

O Spring Boot vem com várias características que o tornam uma excelente escolha para o desenvolvimento de aplicativos Java, desde a configuração automática até a detecção e resolução automática de dependências. Isso torna o Spring Boot fácil de usar, especialmente para desenvolvedores que estão começando.

Entre as principais vantagens do Spring Boot, destacam-se a facilidade de configuração, a simplicidade no uso, o suporte integrado para ferramentas como o Maven, o Gradle e o Eclipse, além de possuir uma grande comunidade de desenvolvedores ativa e engajada.

Uma das principais características do Spring Boot é a configuração automática. O Spring Boot analisa a classe principal do aplicativo e configura automaticamente várias partes do aplicativo, incluindo o contêiner de servlet, o pool de conexões de banco de dados e muitas outras configurações. Isso reduz significativamente o tempo de configuração necessário para iniciar um novo projeto.

O Spring Boot também é projetado para ser simples de usar. Ele oferece um modelo de programação baseado em convenções que permite que os desenvolvedores construam aplicativos rapidamente, sem a necessidade de escrever muito código. O Spring Boot também possui uma ampla documentação e exemplos de código que facilitam o aprendizado.

Outra vantagem do Spring Boot é o suporte integrado para ferramentas de desenvolvimento. Ele é compatível com o Maven e o Gradle, que são ferramentas populares de gerenciamento de dependências, e pode ser integrado facilmente com o Eclipse e outras IDEs.

Além disso, o Spring Boot possui uma grande comunidade de desenvolvedores ativa e engajada. Isso significa que existem muitos recursos disponíveis para os desenvolvedores, desde bibliotecas e plugins até fóruns de discussão e grupos de usuários.

No Spring Boot, os aplicativos são divididos em módulos que são chamados de módulos do Spring Boot. Cada módulo é responsável por uma parte diferente do aplicativo. Por exemplo, há um módulo para o servidor da web, outro para o banco de dados e assim por diante. Isso torna o Spring Boot altamente modular e flexível, permitindo que os desenvolvedores escolham apenas os módulos que precisam para seus projetos.

O Spring Boot também suporta vários tipos de banco de dados, incluindo bancos de dados relacionais, NoSQL e outros tipos de bancos de dados. Ele vem com vários módulos que fornecem suporte para bancos de dados, como o Spring Data JPA para bancos de dados relacionais e o Spring Data MongoDB para bancos de dados NoSQL.

Além disso, o Spring Boot também suporta diferentes protocolos de comunicação, incluindo HTTP, WebSockets e TCP. Isso permite que os desenvolvedores criem aplicativos que se comunicam com outros aplicativos usando diferentes protocolos.

Outra vantagem do Spring Boot é a facilidade de integração com outros frameworks e bibliotecas.

Exemplo de código:

  1. Primeiro, você precisa configurar o seu projeto Maven ou Gradle para incluir o Spring Boot. Para o Maven, adicione a seguinte dependência ao seu arquivo pom.xml:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.6.2</version>
</dependency>

  1. Em seguida, crie uma classe principal em seu projeto que use a anotação @SpringBootApplication. Isso é necessário para configurar automaticamente o Spring Boot e iniciar o aplicativo.
@SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } }

  1. Agora você pode criar seus controladores RESTful usando a anotação @RestController. Por exemplo:
@RestController public class MyController { @GetMapping("/hello") public String hello() { return "Hello, world!"; } }

  1. Para testar seu aplicativo, execute a classe principal MyApp e acesse http://localhost:8080/hello em seu navegador ou cliente REST. Você deve ver a mensagem "Hello, world!" retornada pelo seu controlador.
Esses são apenas exemplos básicos, o Spring Boot é um framework muito poderoso e flexível, e há muitas outras funcionalidades que você pode usar em seus projetos.

domingo, 9 de outubro de 2016

Groovy / Grails



Olá pessoal,

Depois de bastante tempo sem postar, resolvi escrever este post para começar a relatar um pouco da experiência que estou tendo utilizando as técnologias Groovy e Grails.

Onde tudo começou


Rencentemente, migrei de empresa e nesta nova empresa, começei a trabalhar em um projeto que utiliza Grails. Eu já conhecia a técnologia, mas nunca havia me aprofundado, e com esse projeto, mesmo que utilizando uma versão bem antiga, a 2.3.6, percebi o ganho de produtividade que podemos ter ao utilizar esse framework. Também pude observar que é preciso mudar a forma de pensar e se desapegar de velhos e maus hábitos, pois a técnologia te "força" a trabalhar utilizando suas convenções que na minha opinião e na de muitos profissionais, são boas práticas que na maioria das vezes não seguimos. Percebi também que a linguagem Groovy, na verdade é um Java melhorado, e tudo que falta no Java e que temos muito trabalho para fazer, no Groovy é extremamente simples.

Groovy


De uma maneira bem resumida, o groovy é uma linguagem de programação que roda sobre a máquina virtual Java (JVM), dinâmica, puramente orientada a objetos, possui carcateristicas funcionais, possui um vasto ecosistema, na qual o Grails faz parte, utilizada na construção de scripts e também está presente na ferramenta Gradle, hoje aparecendo como uma opção ao Maven.

Grails


Também falando resumidamente, o Grails é um framework web, fullstack, utiliza groovy como linguagem, possui influências no Ruby On Rails, ou seja, todas as suas funcionalidades praticamente também são encontradas no Ruby On Rails. Seu foco é no ganho de produtivade, trazendo ferramentas e padrões para chegar a esse objetivo, trabalha com Convention over Configuration (CoC), sendo esse um dos maiores fatores na minha opinião, para que tenhamos uma maior produtividade com o framework. Utiliza por baixo dos panos, técnologias conhecidas, tais como: Spring, Hibernate, Log4j, Tomcat, Sitemesh e outras, tornando a curva de aprendizado mais curta e fortalecendo a confiança no framework. No Brasil existe uma forte comunidade, chamada Groovy \ Grails Brasil, na qual seu fundador e na minha opinião, o maior evangelizador do Grails atua, o Henrique Lobo, mais conhecido com Kiko. Neste primeiro post, não foi a minha intenção abordar mais detalhes e no final coloco alguns links que utilizei, assim como todos os meios pelo qual aprendi e ainda uso para continuar estudando o framework e a linguagem Groovy.

Como comecei a estudar


Primeiramente, começei a buscar na internet e vi que no Brasil, existe um grupo dedicado a técnologia, o Grails Brasil, nele percebi que o seu fundador, o Kiko, havia escrito um livro falando sobre o assunto, comprei o livro e recomendo, pois o livro aborda tudo que precisamos saber para construirmos uma aplicação do zero em Grails, mesmo o livro abordando também uma versão antiga, ele apresenta pontos que mudaram na nova versão. Depois disso, começei a estudar também pela documentação oficial que sempre é atualizada e que devemos sempre recorrer em primeiro lugar.
O importante é continuar estudando e praticando bastante, pois tanto o groovy quanto o grails possuem uma infinade de novos recursos e funcionalidades talvez não utlizados pela maioria de nós e por isso, na minha opinião, a prática se torna indispensável.

Seguem os links para estudo e o link do livro


Groovy

http://www.groovy-lang.org/
http://www.groovy-lang.org/documentation.html
http://www.groovy-lang.org/ecosystem.html

Grails

https://grails.org/
https://grails.org/documentation.html

Groovy / Grails Brasil

http://www.grailsbrasil.com.br/

Palestra dada pelo Kiko na infoQ

https://www.infoq.com/br/presentations/grails-alta-produtividade-em-java

Livro Falando de Grails (Kiko)

https://www.casadocodigo.com.br/products/livro-grails

É isso pessoal, nos próximos posts, pretendo apresentar mais pontos que aprendi e demonstrar também com exemplos de código.




sábado, 19 de março de 2016

Tradução do idioma para Inglês do Netbeans no Windows




Bem, como sabemos, o Netbeans por padrão, depois de instalado, é inicializado usando a língua padrão do sistema operacional, mas, as vezes, queremos utilizar o inglês mesmo usando o sistema operacional em português, sim, estamos falando do Windows, então, para forçar o Netbeans a utilizar o inglês é muito simples. Depois de instalarmos o Netbeans no Windows, é criado um atalho na Área de trabalho (Desktop). Basta clicar com o botão direito em cima deste atalho e acessar a guia Propriedades, como mostra a imagem abaixo:


Depois basta adicionar a seguinte instrução ao final do campo Destino:
--locale en_US

Como demonstrado na imagem abaixo:



Feito isso, basta clicar em Ok e reinicializar o Netbeans IDE.


Netbeans 8.1 Release




Olá amigos, ha algum tempo a nova versão do Netbeans IDE foi lançada, trazendo novas features e melhorias de performance na ferramenta, para mais informações, seguem os links abaixo:

Para baixar a ultima versão:
https://netbeans.org/downloads/

Para saber mais sobre as novas features:
https://netbeans.org/community/releases/81/

No decorrer dos novos posts, abordarei assuntos que usarão as novas funcionalidades, até lá.