<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Enoque Leal</title>
    <description>The latest articles on DEV Community by Enoque Leal (@enoqueleal).</description>
    <link>https://dev.to/enoqueleal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F818731%2Fbf6873ea-7ca1-426d-af42-1af837fc7287.png</url>
      <title>DEV Community: Enoque Leal</title>
      <link>https://dev.to/enoqueleal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/enoqueleal"/>
    <language>en</language>
    <item>
      <title>Monólito, vilão ou mocinho? [ pt-BR ]</title>
      <dc:creator>Enoque Leal</dc:creator>
      <pubDate>Mon, 31 Jul 2023 12:42:41 +0000</pubDate>
      <link>https://dev.to/enoqueleal/monolito-vilao-ou-mocinho-52el</link>
      <guid>https://dev.to/enoqueleal/monolito-vilao-ou-mocinho-52el</guid>
      <description>&lt;p&gt;Muito se ouve falar sobre microsserviços, aplicações modulares e independentes, que possuem seu próprio repositório de dados, que são autossuficientes, possuem alta coesão, baixo acoplamento, que seu deploy seja feito de forma independente de outros componentes e que também seja fácil de escalar.&lt;/p&gt;

&lt;p&gt;A minha provocação aqui é: porque o monólito é o vilão? Porque microsserviços é a melhor opção?&lt;/p&gt;

&lt;p&gt;Porque você decidiu migrar de uma arquitetura monolítica para uma arquitetura de “microsserviços”?&lt;/p&gt;

&lt;p&gt;Você vivenciou alguma migração de uma arquitetura monolítica para uma arquitetura de microsserviços? Se sim, as vantagens que esse modelo arquitetural supostamente oferece foram colhidas ou só foram criados novos problemas como por exemplo: dificuldades na integração e orquestração da comunicação entre os novos serviços, muita duplicidade de regras de negócios em diferentes componentes, um número insustentável de componentes de software e por fim, mas não menos importante um desperdício dos seus recursos computacionais?&lt;/p&gt;

&lt;p&gt;Você sabe quantos ativos de software estão em execução no seu ambiente produtivo hoje? e, se souber, todas essas aplicações são realmente necessárias para o funcionamento do seu negócio ou produto? ou está apenas desperdiçando o seu dinheiro ou do seu empregador? Sim, manter uma aplicação no ar custa dinheiro, seja no seu datacenter on-premise ou em quaisquer cloud provider, utilizando qualquer tipo de infraestrutura. Isso custa dinheiro e fica muito evidente quando estamos utilizamos um provisionamento de infraestrutura sob demanda através do famoso billing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsqehsst41wz890jttxz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsqehsst41wz890jttxz.gif" alt="Image description" width="312" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essas são só algumas questões que eu queria trazer à tona para te convidar a refletir a respeito de algumas decisões que foram tomadas, não necessariamente por você é claro, mas por qualquer pessoa que em algum momento ocupou a cadeira de arquiteto, engenheiro, gestor ou seja lá qual for o cargo, mas que tenha tomado essa decisão de forma prematura e que agora, muito provavelmente esta pessoa não se encontre mais entre seus colegas de trabalho e deve estar por aí tomando esse tipo de decisão em outras empresas sem medir as consequências.&lt;/p&gt;

&lt;p&gt;Porém toda decisão tem suas consequências, não é mesmo? E agora temos que arcar com as mesmas. rs&lt;/p&gt;

&lt;p&gt;O mercado de tecnologia sofre com uma escassez de profissionais, isso é um fato. Existe muita demanda e poucas pessoas capacitadas para atendê-la, o que abre precedentes para os aventureiros de plantão, que se autodenominam os gurus da arquitetura de software e que acabam tendo espaço para tomar decisões muitas das vezes questionáveis.&lt;/p&gt;

&lt;p&gt;Bom, vamos lá, feito toda a provocação vamos a um pouco de contexto sobre o que é um sistema monolítico. &lt;strong&gt;Sam Newman&lt;/strong&gt; em seu livro &lt;em&gt;“Migrando Sistemas Monolíticos para microsserviços”&lt;/em&gt;, apresenta uma definição de que existem três tipos de sistemas monolíticos, sendo eles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sistema monolítico de um só processo&lt;/strong&gt;: Todo o código está contido em um único processo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sistema monolítico modular&lt;/strong&gt;: É uma variação do monolítico de um só processo. No monolítico modular, é possível trabalhar em cada módulo de forma independente, mas estes módulos ainda devem ser combinados na implantação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sistema monolítico distribuído&lt;/strong&gt;: É um sistema composto de vários serviços, mas por algum motivo, o sistema como um todo deve ser implantado em conjunto.&lt;/p&gt;

&lt;p&gt;Eu particularmente gosto bastante dessas definições e já me deparei com esses diferentes tipos de monólitos ao longo da minha carreira como desenvolvedor. O fato é que tudo está fortemente acoplado.&lt;/p&gt;

&lt;p&gt;Ta e sobre microsserviços? Beleza, vamos lá.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Newman&lt;/em&gt; no mesmo livro define microsserviços como serviços que podem ser implantados de forma &lt;strong&gt;independente&lt;/strong&gt;, e são modelados em torno de um domínio de negócio.&lt;/p&gt;

&lt;p&gt;O icônico &lt;strong&gt;Martin Fowler&lt;/strong&gt; escreveu em seu blog pessoal em meados de 2014 um post com o seguinte título: &lt;em&gt;Microservices: a definition of this new architectural term&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fowler&lt;/em&gt; descreveu microsserviços como uma abordagem para desenvolver um único aplicativo como um conjunto de pequenos serviços, cada um executando em seu próprio processo e se comunicando com mecanismos leves, geralmente uma API de recurso HTTP. Esses serviços são desenvolvidos em torno de recursos de negócios e podem ser implantados de forma independente por meio de máquinas de implantação totalmente automatizadas.&lt;/p&gt;

&lt;p&gt;Esse modelo de arquitetura ganhou bastante notoriedade na comunidade de desenvolvimento e arquitetura de software, mas qual é o problema então? O problema é a romantização desses conceitos. Você e / ou sua empresa não é a &lt;em&gt;Netflix, Google ou Facebook&lt;/em&gt;. Microsserviços não são uma bala de prata e o monolítico não é um vilão, então não romantize isso. Uma empresa pode sim ter uma aplicação monolítica e ter uma boa escalabilidade, um baixo acoplamento e uma alta coesão, tudo vai depender de como essa aplicação monolítica foi construída e estruturada. Da mesma forma que componentizar uma aplicação que contém um emaranhado de código ruim, altamente acoplado e com uma baixa coesão não vai tornar torná-la mais escalável e coesa. Você só vai ganhar novos problemas e gastar mais dinheiro.&lt;/p&gt;

&lt;p&gt;Não estou aqui para dizer que microsserviços são ruins, longe disso. Peço apenas que analise com cautela o contexto a qual está você está inserido e o problema que você precisa resolver, para que possa tomar a melhor decisão. Se você não fizer isso, estará apenas criando novos monólitos distribuídos e aumentando a complexidade dos seus ativos de software e isso a longo prazo vai sair muito mais caro do que você pode imaginar.&lt;/p&gt;




&lt;p&gt;Referências:&lt;/p&gt;

&lt;p&gt;FOWLER, M. &lt;strong&gt;Microservices: a definition of this new architectural term&lt;/strong&gt;. martinFowler.com, 25, mar. 2014. Disponível em: &lt;a href="https://martinfowler.com/articles/microservices.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/microservices.html&lt;/a&gt;. Acesso em: 10 de ago. de 2021.&lt;/p&gt;

&lt;p&gt;NEWMAN, S. &lt;strong&gt;Migrando sistemas monolíticos para microsserviços&lt;/strong&gt;: Padrões evolutivos para transformar seu sistema monolítico. São Paulo: Novatec, 2020.&lt;/p&gt;

</description>
      <category>development</category>
      <category>monolith</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Criando um pool de Conexões com Apache Commons DBCP [ pt-BR ]</title>
      <dc:creator>Enoque Leal</dc:creator>
      <pubDate>Tue, 16 May 2023 23:11:16 +0000</pubDate>
      <link>https://dev.to/enoqueleal/criando-um-pool-de-conexoes-com-apache-commons-dbcp-1528</link>
      <guid>https://dev.to/enoqueleal/criando-um-pool-de-conexoes-com-apache-commons-dbcp-1528</guid>
      <description>&lt;h2&gt;
  
  
  Este laboratório tem como objetivo apresentar uma forma básica sobre como configurar um pool de conexões para gerenciar as conexões com o banco de dados!
&lt;/h2&gt;

&lt;p&gt;Um pool de conexões é uma técnica usada para melhorar o desempenho de aplicações que fazem uso frequente de conexões com um banco de dados.&lt;/p&gt;

&lt;p&gt;Neste tutorial eu irei mostrar como implementando um Pool de Conexões em Java utilizando a biblioteca (library) &lt;strong&gt;&lt;a href="https://github.com/apache/commons-dbcp" rel="noopener noreferrer"&gt;Apache Commons DBCP&lt;/a&gt;;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;É importante mencionar que existem várias bibliotecas disponíveis para implementar um pool de conexões em Java.&lt;/p&gt;

&lt;p&gt;Algumas alternativas populares incluem HikariCP, C3P0 e Tomcat JDBC Pool. No entanto, para este tutorial, iremos utilizar a Apache Commons DBCP por ser uma biblioteca amplamente utilizada e com uma grande comunidade de suporte.&lt;/p&gt;

&lt;p&gt;Após concluir este tutorial, você deverá ser capaz de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementar um pool de conexões utilizando a biblioteca &lt;a href="https://github.com/apache/commons-dbcp" rel="noopener noreferrer"&gt;Apache Commons DBCP&lt;/a&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso você queira ver esse tutorial em formato de vídeo, eu deixei disponível no &lt;strong&gt;You Tube&lt;/strong&gt;: &lt;a href="https://youtu.be/HcAkUWNJxbQ" rel="noopener noreferrer"&gt;Criando e configurando um Connection Pool com Apache Commons DBCP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Passo 1: Adicionando a dependência&lt;/p&gt;

&lt;p&gt;No IntelliJ IDEA, abra o arquivo de configuração do projeto chamado "pom.xml" (geralmente localizado na raiz do projeto).&lt;/p&gt;

&lt;p&gt;Localize a seção  e adicione a seguinte dependência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.commons&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;commons-dbcp2&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.9.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nenhum código deve ser removido nesta etapa. Apenas adicione a nova dependência no &lt;em&gt;pom.xml&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;Salve todas as alterações &lt;strong&gt;(CTRL + S)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OBS: Após salvar as alterações, o &lt;em&gt;IntelliJ IDEA&lt;/em&gt; deve sincronizar automaticamente as alterações do arquivo de configuração e baixar a biblioteca Apache Commons DBCP automaticamente.&lt;/p&gt;

&lt;p&gt;Passo 2: Criando a classe para o Pool de Conexões&lt;/p&gt;

&lt;p&gt;No IntelliJ IDEA, navegue até o pacote principal da sua aplicação, clique com o botão direto do mouse e selecione &lt;em&gt;New / Package&lt;/em&gt; digite &lt;strong&gt;config&lt;/strong&gt; e pressione a tecla ENTER.&lt;/p&gt;

&lt;p&gt;Após ter criado o pacote &lt;em&gt;config&lt;/em&gt;, clique com o botão direito do mouse no pacote &lt;strong&gt;config&lt;/strong&gt; e selecione &lt;em&gt;New / Java Class&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Defina o nome da classe como "ConnectionPoolConfig" e clique em "OK".&lt;/p&gt;

&lt;p&gt;Passo 3: Abra a classe que acabamos de criar e implemente um método estático (static) chamado &lt;em&gt;getDataSource&lt;/em&gt; que não recebe nenhum parâmetro e retorna um objeto do tipo &lt;strong&gt;BasicDataSource&lt;/strong&gt; conforme código a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.commons.dbcp2.BasicDataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConnectionPoolConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt; &lt;span class="nf"&gt;getDataSource&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OBS: Não esqueça de importar (import) a classe BasicDataSource do pacote &lt;em&gt;org.apache.commons.dbcp2&lt;/em&gt;. Para realizar o importe utilizando o IntelliJ, clique com o botão direito do mouse em cima do nome da classe e utilize o atalho &lt;strong&gt;(ALT + ENTER)&lt;/strong&gt; e selecione a opção &lt;strong&gt;import class&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Passo 4: Agora que já temos nossa classe &lt;strong&gt;BasicDataSource&lt;/strong&gt; e nosso método &lt;strong&gt;getDataSource()&lt;/strong&gt;, vamos iniciar a implementação. &lt;/p&gt;

&lt;p&gt;A primeira parte da implementação consiste em uma validação condicional que verifica se a variável &lt;em&gt;dataSource&lt;/em&gt; é nula (null).&lt;/p&gt;

&lt;p&gt;O código resultante deverá ser igual ao código a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.carstore.config&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.commons.dbcp2.BasicDataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConnectionPoolConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt; &lt;span class="nf"&gt;getDataSource&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataSource&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o resultado dessa validação condicional for verdadeiro (true), nós iremos criar um novo &lt;em&gt;dataSource&lt;/em&gt;. Caso o retorno seja falso (false), significa que já existe um dataSource criado e portando ele será retornado e nenhuma ação adicional será executada. &lt;/p&gt;

&lt;p&gt;Passo 5: Assumindo que o retorno da validação condicional é verdadeiro (true), é necessário criar um novo dataSource. Para isso nós iremos criar uma nova instância de &lt;strong&gt;BasicDataSource&lt;/strong&gt; e passar alguns parâmetros sendo eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL&lt;/li&gt;
&lt;li&gt;Username&lt;/li&gt;
&lt;li&gt;Password&lt;/li&gt;
&lt;li&gt;Min Idle&lt;/li&gt;
&lt;li&gt;Max Idle&lt;/li&gt;
&lt;li&gt;Max total&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alguns desses parâmetros são auto descritivos como por exemplo (url, username e password). Porém os outros três parâmetros sendo (Min Idle, Max Idle e Max total) precisam ser descritos.&lt;/p&gt;

&lt;p&gt;Esses parâmetros são necessários para que o nosso pool de conexões (BasicDataSource) possa ser configurado corretamente. &lt;br&gt;
Esses parâmetros também podem variar de acordo com as características da sua aplicação. &lt;/p&gt;

&lt;p&gt;A seguir, uma breve descrição sobre o papel desses parâmetros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MinIdle: Número mínimo de conexões ociosas no pool&lt;/li&gt;
&lt;li&gt;MaxIdle: Número máximo de conexões ociosas no pool&lt;/li&gt;
&lt;li&gt;MaxTotal: Número máximo de conexões totais no pool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por último, vamos adicionar uma mensagem de feedback para nossos usuários sinalizando que um novo pool de conexões foi criado com sucesso.&lt;/p&gt;

&lt;p&gt;O código resultante deverá ser igual ao código a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.carstore.config&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.commons.dbcp2.BasicDataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.sql.Connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.sql.SQLException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConnectionPoolConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt; &lt;span class="nf"&gt;getDataSource&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataSource&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setUrl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"jdbc:h2:~/test"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setUsername&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPassword&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMinIdle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Número mínimo de conexões ociosas no pool&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMaxIdle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Número máximo de conexões ociosas no pool&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMaxTotal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Número máximo de conexões totais no pool&lt;/span&gt;

            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"New connection pool created with successful"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passo 6: Criando o método getConnection&lt;/p&gt;

&lt;p&gt;Agora que já temos o método getDataSource devidamente implementado, vamos criar o método que devolve uma conexão com o banco de dados para os usuários.&lt;/p&gt;

&lt;p&gt;Para isso, vamos criar um novo método estático (static) chamado getConnection que devolve uma &lt;em&gt;Connection&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O código resultante deverá ser igual ao código a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="nf"&gt;getConnection&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;SQLException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getDataSource&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getConnection&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passo 7: Criando um construtor privado&lt;/p&gt;

&lt;p&gt;Agora que já temos o método getDataSource() e getConnection() devidamente criados, precisamos criar um construtor privado que chama o método getDataSource para iniciar um novo pool de conexões assim que nossa classe &lt;strong&gt;ConnectionPoolConfig&lt;/strong&gt; for chamada pela primeira vez.&lt;/p&gt;

&lt;p&gt;O código resultante deverá ser igual ao código a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;ConnectionPoolConfig&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="n"&gt;getDataSource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com toda a implementação feita, o código da classe &lt;strong&gt;ConnectionPoolConfig&lt;/strong&gt; deverá ser igual ao código a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.carstore.config&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.commons.dbcp2.BasicDataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.sql.Connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.sql.SQLException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConnectionPoolConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;ConnectionPoolConfig&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;getDataSource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt; &lt;span class="nf"&gt;getDataSource&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataSource&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BasicDataSource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setUrl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"jdbc:h2:~/test"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setUsername&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPassword&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMinIdle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Número mínimo de conexões ociosas no pool&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMaxIdle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Número máximo de conexões ociosas no pool&lt;/span&gt;
            &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMaxTotal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Número máximo de conexões totais no pool&lt;/span&gt;

            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"New connection pool created with successful"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="nf"&gt;getConnection&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;SQLException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getDataSource&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getConnection&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salve todas as alterações &lt;strong&gt;(CTRL + S)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Passo 8: Criando a classe para Testar o pool de conexões&lt;/p&gt;

&lt;p&gt;No IntelliJ IDEA, navegue até o pacote principal da sua aplicação, clique com o botão direito do mouse ne selecione "New" -&amp;gt; "Java Class". Defina o nome da classe como "Main" e clique em "OK".&lt;/p&gt;

&lt;p&gt;Substitua o código gerado pelo seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.sql.Connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.sql.SQLException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

            &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ConnectionPoolConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getConnection&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// Utilize a conexão para executar suas operações no banco de dados&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SQLException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

            &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

                &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SQLException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

                &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

            &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, os métodos não irão abrir mais conexões diretamente,  porque a abertura de novas conexões agora será de responsabilidade da nossa classe &lt;strong&gt;BasicDataSource&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Estamos aqui implementando o &lt;strong&gt;S&lt;/strong&gt; do &lt;a href="https://www.freecodecamp.org/news/solid-principles-explained-in-plain-english/" rel="noopener noreferrer"&gt;SOLID&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Faça uma revisão tudo que foi feito até aqui!&lt;/p&gt;

&lt;p&gt;Passo 9: Salve todas as alterações &lt;strong&gt;(CTRL + S)&lt;/strong&gt; e execute sua aplicação.&lt;/p&gt;

&lt;p&gt;Ao executar sua aplicação, repare que o comportamento da aplicação não mudou, porém a mensagem ("New connection pool created with successful") só é escrita uma única vez no &lt;em&gt;stdout&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Esse comportamento é esperado porque agora a nossa aplicação reaproveita as conexões que já foram abertas e estão disponíveis e são gerenciadas pelo nosso pool de conexões.&lt;/p&gt;




&lt;p&gt;Parabéns! 👍&lt;/p&gt;

&lt;p&gt;Você adicionou um pool de conexões na sua aplicação utilizando a biblioteca &lt;strong&gt;Apache Commons DBCP&lt;/strong&gt; e agora sua aplicação gerencia as conexões com o banco de dados de forma eficiente. &lt;/p&gt;

</description>
      <category>java</category>
      <category>h2db</category>
      <category>dbcp</category>
    </item>
    <item>
      <title>Deseja conquistar sua primeira certificação AWS e não sabe por onde começar? Eu te ajudo!</title>
      <dc:creator>Enoque Leal</dc:creator>
      <pubDate>Wed, 14 Sep 2022 13:50:31 +0000</pubDate>
      <link>https://dev.to/enoqueleal/deseja-conquistar-sua-primeira-certificacao-aws-e-nao-sabe-por-onde-comecar-eu-te-ajudo-51ha</link>
      <guid>https://dev.to/enoqueleal/deseja-conquistar-sua-primeira-certificacao-aws-e-nao-sabe-por-onde-comecar-eu-te-ajudo-51ha</guid>
      <description>&lt;p&gt;Se você chegou até aqui, significa que você deseja iniciar sua jornada em cloud, especificamente utilizando a AWS como provedor e não sabe muito bem por onde começar. Pois bem, fica tranquil@, isso é normal e eu quero te ajudar. 🤩&lt;/p&gt;

&lt;p&gt;Meu objetivo aqui não é vender nenhum curso nem solução mágica, fiquem tranquilos. 😂 😅&lt;/p&gt;

&lt;p&gt;Iniciar uma nova jornada e aprender algo novo, pode ser de certa forma um tanto complicado, principalmente nos casos onde não tenhamos o direcionamento adequado. É aqui que eu quero te ajudar.&lt;/p&gt;

&lt;p&gt;A primeira coisa que eu tenho a dizer é: Tenha calma! Isso mesmo, tenha calma porque tudo requer tempo e conquistar sua primeira certificação AWS não será diferente. 🤯&lt;/p&gt;

&lt;p&gt;A primeira certificação da AWS é a &lt;strong&gt;Cloud Practitioner (CLF-C01)&lt;/strong&gt;. A Cloud Practitioner é uma certificação de nível foundational. Isso quer dizer que após se preparar para esse exame, você terá uma visão sobre os fundamentos de computação em nuvem (cloud computing) e sobre os principais produtos e serviços oferecidos por esse provedor. Você estará apt@ a dar os seus primeiros passos, entrar em uma reunião de trabalho, entender os termos técnicos que as pessoas estão falando e possivelmente vai conseguir contribuir com o coletivo.&lt;/p&gt;

&lt;p&gt;A segunda coisa que eu gostaria de compartilhar com você é: Tenha foco e pare de consumir conteúdo de diferentes fontes e que possivelmente não vai te ajudar de forma efetiva. &lt;/p&gt;

&lt;p&gt;No mercado e na comunidade, certamente tem muita gente bem-intencionada e que compartilha conteúdo de qualidade. Porém na mesma proporção, existe muitos charlatões querendo te vender receitas milagrosas e cursos que supostamente vai resolver o seu problema. Sinto muito, mas preciso te dizer que não vai. Não caia nessa e não jogue seu precioso dinheiro fora R$! Respeite o seu dinheiro.&lt;/p&gt;

&lt;p&gt;A AWS é uma empresa muito generosa e oferece a seus clientes, diversas formas para que as pessoas interessadas em obter suas certificações possam se preparar. Isso inclui treinamentos on-line ao vivo, workshops, bootcamps e até academias com formações completas e de forma gratuita.&lt;/p&gt;

&lt;p&gt;É isso mesmo, no 0800 (free) :D. Tudo isso para que você consiga atingir o seu objetivo final, que nesse contexto é conquistar sua primeira certificação. Isso implica em uma relação de ganha a ganha, só há vantagens aqui! Olhe pela seguinte perspectiva:&lt;/p&gt;

&lt;p&gt;Com essas ações a AWS terá mais profissionais certificados e que conhecem seus produtos e serviços. Ponto para a AWS certo? &lt;/p&gt;

&lt;p&gt;Você conquistando sua certificação, terá mais uma forma de comprovar para o mercado que você conhece e sabe minimamente do que está falando certo? Ponto para você!&lt;/p&gt;

&lt;p&gt;Já as empresas por sua vez, ganha mais uma forma de procurar profissionais com conhecimentos sobre temas específicos para demandas específicas e dessa forma, consegue filtrar com mais facilidade para uma possível contratação certo? Ponto para a empresa!&lt;/p&gt;

&lt;p&gt;Viu só? É uma relação de ganha a ganha.&lt;/p&gt;

&lt;p&gt;Mas Enoque, eu conheço muitas pessoas que tem profundo conhecimento e não tem certificação! Eu sei que existe e está tudo bem em relação a isso. Porém se você chegou até aqui, infiro que você saiba quais são as vantagens de tirar uma certificação. Portanto, eu não irei discutir com sobre a questão de tirar ou não tirar uma certificação, tudo bem?&lt;/p&gt;

&lt;p&gt;Tá, mas e aí, como faz então? rs &lt;/p&gt;

&lt;p&gt;Vamos lá, para a certificação de entrada eu recomendo fortemente que você utilize a plataforma de cursos on-line oficial da própria AWS, o &lt;a href="https://explore.skillbuilder.aws/" rel="noopener noreferrer"&gt;Skill Builder&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;No Skill Builder você encontrará diversos treinamentos que foram projetados e construídos pelos profissionais da própria AWS. Em outras palavras, você beberá direto da fonte, portanto  não perca tempo buscando por fontes alternativas, foque no seu objetivo e utilize um conteúdo de qualidade.&lt;/p&gt;

&lt;p&gt;Após se cadastrar na plataforma, procure por &lt;a href="https://explore.skillbuilder.aws/learn/course/external/view/elearning/8287/aws-cloud-practitioner-essentials-portuguese" rel="noopener noreferrer"&gt;AWS Cloud Practitioner Essentials (Portuguese)&lt;/a&gt;, você encontrará o treinamento oficial, totalmente em português. Agora é só partir para o abraço.&lt;/p&gt;

&lt;p&gt;Uma última coisa que eu queria te dizer é: Tenha uma rotina de estudos. Isso mesmo!&lt;/p&gt;

&lt;p&gt;Muitas pessoas me chamam para conversar pedindo sugestões sobre como dar o primeiro passo rumo à primeira certificação. Minha resposta é exatamente o que eu escrevi aqui para vocês.&lt;/p&gt;

&lt;p&gt;O grande ponto é, nada disso vai adiantar se você não tiver disciplina e estudar de verdade. Então monte um plano de estudo e estude &lt;strong&gt;X&lt;/strong&gt; horas por dia durante quantos dias você puder. Faça anotações e volte o vídeo quantas vezes for necessário para que você consiga entender o conteúdo do curso em Vídeo. Sempre que sentir falta de alguma informação, consulte também a documentação oficial de cada serviço. A AWS disponibiliza uma excelente documentação que está disponível em diversos idiomas inclusive em português. &lt;/p&gt;

&lt;p&gt;Monte um plano de estudo que seja realista e que você possa cumprir. Seja honest@ com você mesmo, porque se você falhar, estará falhado com você mesmo, então seja honesto e monte o plano de acordo com sua disponibilidade. Obviamente quanto mais rápido você fizer o curso, mas rápido chegará no seu objetivo, mas lembre-se de que não se trata de uma competição e o mais importante aqui é o processo de aprendizagem e o conhecimento adquirido a partir do mesmo. Então tenha calma e vai de coração que vai dar bom.&lt;/p&gt;

&lt;p&gt;Seguindo esses passos eu não tenho dúvida que você irá ter êxito e conquistará sua primeira certificação AWS.&lt;/p&gt;

&lt;p&gt;Mais Enoque, esse curso é o suficiente? Sim!&lt;/p&gt;

&lt;p&gt;O curso é bem completo e possuí questionários para teste de conhecimento no final de cada módulo. Evite distrações e foque em absorver o máximo do que os instrutores estão compartilhando com você. Funcionou para min e tenho alguns cases de sucesso com colegas que também conseguiram chegar lá através desse conteúdo.&lt;/p&gt;

&lt;h1&gt;
  
  
  #ficaadica
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkey0n7xviux4hndfigm6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkey0n7xviux4hndfigm6.jpeg" alt="Imagem da Badge da certificação aws cloud practitioner" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀 🙅🏻‍♂️&lt;/p&gt;

&lt;p&gt;Quando você tiver chegado lá eu ficarei imensamente feliz em receber uma mensagem sua compartilhando a conquista, comemorando e talvez agradecendo por ter contribuído de alguma forma para essa sua conquista. Eu ficarei imensamente feliz em ler. 🤩&lt;/p&gt;

&lt;p&gt;Me siga nas redes sociais. Eu estou sempre compartilhando informações úteis sobre o mundo tech, cloud, jvm e afins.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>aws</category>
      <category>awstraining</category>
      <category>cloudpractitioner</category>
    </item>
    <item>
      <title>Golang for Java Developers - [ part 1, pt-BR ]</title>
      <dc:creator>Enoque Leal</dc:creator>
      <pubDate>Sun, 17 Jul 2022 15:17:56 +0000</pubDate>
      <link>https://dev.to/enoqueleal/golang-for-java-developers-part-1--3a5n</link>
      <guid>https://dev.to/enoqueleal/golang-for-java-developers-part-1--3a5n</guid>
      <description>&lt;p&gt;O objetivo deste artigo é mostrar algumas Características da da linguagem Go a partir da perspectiva de um desenvolvedor Java. Para que a leitura não fiquei muito cansativa, eu irei dividir esse artigo em algumas partes, sendo essa portanto a parte 1.&lt;/p&gt;

&lt;p&gt;Eu trabalho com o desenvolvimento de software há mais de uma década e durante essa jornada tive a oportunidade de trabalhar e conhecer diversas linguagens de programação compiladas e interpretadas, conhecer diversas tecnologias e frameworks, porém o Java é a linguagem que esteve mais presente durante essa trajetória. Por conta disso, eu considero o Java como a minha principal linguagem de programação.&lt;/p&gt;

&lt;p&gt;Recentemente fui convidado a participar de um projeto, onde minha atividade consistia em pegar uma aplicação que havia sido desenvolvida em Java e reescrevê-la para Go em um modelo &lt;em&gt;As Is / To Be&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;OBS: Não faz parte do escopo deste artigo justificar o porquê de tal decisão. O que posso compartilhar aqui é que tal projeto era bem estratégico, onde o tempo de inicialização da aplicação era muito importante.&lt;/p&gt;

&lt;p&gt;Após alguns &lt;em&gt;benchmarks&lt;/em&gt;, o &lt;em&gt;Golang&lt;/em&gt; mostrou um tempo de inicialização muito satisfatório e também um mecanismo de &lt;em&gt;multithreading&lt;/em&gt; fácil de usar com base na implementação das suas &lt;em&gt;goroutines&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dado esse breve contexto, quero compartilhar algumas percepções em relação a essa fabulosa linguagem a partir da perspectiva de um dev Java.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Let's start&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Main class&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Estrutura básica da classe principal escrita em Go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
package main

import “fmt”

func main() {

    fmt.Println(“Hello, world!”)

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implementação equivalente em Java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
public class MainClass {

    public static void main(String [] args) {

        System.out.println(“Hello, world”);

    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É possível notar algumas semelhanças entre as duas implementações, porém vamos dar ênfase nas diferenças entre elas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;) Go dispensa a utilização de ponto e vírgula;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;) A implementação em Go possui apenas a declaração das funções, mas nenhuma declaração de nome de classe, dando a sensação que em Go trabalhamos apenas com escopo de função e não de classe. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;OBS&lt;/strong&gt;: Isso não deixa de ser verdade, mas falaremos disso mais adiante;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;) A declaração explícita da visibilidade da função utilizando palavras reservadas como public, protected ou private não é necessárias;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4&lt;/strong&gt;)  O import em Go referência apenas ao nome do pacote e não ao nome da classe.&lt;/p&gt;

&lt;p&gt;Alguns dos pontos supramencionados me trouxeram bastante estranheza no primeiro momento, já outro um encantamento em relação ao design da linguagem, pois afinal de contas, porque colocar obrigatoriamente ponto e vírgula no final da declaração de uma variável ou na chamada de uma função? rsrs&lt;/p&gt;

&lt;p&gt;Na próxima sessão trarei mais alguns pontos interessantes. Até breve!&lt;/p&gt;

</description>
      <category>go</category>
      <category>java</category>
      <category>developement</category>
    </item>
  </channel>
</rss>
