sábado, 26 de novembro de 2016

DevOps - MySQL no Docker

Terceiro artigo da série DevOps, continuação do livro Docker que pode ser acessado através do site Academia.edu.

Entre todas as linguagens que um desenvolvedor possa utilizar, pelo menos um banco de dados é comum a todas elas: MySQL. Utilize PHP, C, Java, Python (talvez não .NET que o pessoal é meio paranoico com Microsoft), ou qualquer outra linguagem o banco de testes será um MySQL.


Então neste artigo veremos como utilizar o MySQL com o Docker (essa mesma técnica pode ser aplicada para o MariaDB ou Postgres - respeitando obviamente a porta deste último). São apenas 3 passos a realizar:

1º) Baixar imagem oficial:
$ docker pull mysql
2º) Rodar o contêiner:
$ docker run --name mybanco -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
3º) Chamar o administrativo do banco:
$ docker exec -it mybanco mysql -p
Obviamente que não iremos parar por aqui pois não teria a menor graça. Vamos acessar o banco através de um programa Java, ainda com o administrativo aberto crie uma base de dados com o seguinte comando:
> create database teste;
> use teste;
> show tables;
Agora precisamos de um editor para o Java, para meus testes sempre utilizo o BlueJ e o Conector JDBC do MySQL deve ser disponibilizado, para proceder isso:

  1. Baixar o conector JDBC do MySQL no driver oficial ou através desse link.
  2. Acessar no menu principal "Tools | Preferences".
  3. Ir para a pasta "Libraries".
  4. Pressionar o botão "Add" e localizar o conector baixado.
Uma vez adicionado sair e entrar novamente no BlueJ para ativar a biblioteca. Agora é só criar o programa para testar a conexão (através do botão "New Class..."):
import java.sql.*;
import java.text.SimpleDateFormat;

public class Conexao {
    
    private Connection con;

    public static void main(String [] args) {
        new Conexao().executar();
    }
    
    public void executar() {
        try {
            criar();
            selecionar();
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

    }
    private void conexao() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(
         "jdbc:mysql://localhost:3306/teste", "root", "root");
    }
         
    private void criar() throws ClassNotFoundException, SQLException {
        conexao();
        // Criar a tabela
        Statement stm = con.createStatement();
        stm.executeUpdate(
            "CREATE TABLE funcionario (" +
            " matricula INT NOT NULL, " +
            " nome VARCHAR(50)," +
            " PRIMARY KEY (matricula))");  
        stm.close();

        // Adicionar 100 funcionarios
        PreparedStatement pstm = con.prepareStatement(
            "INSERT INTO funcionario (matricula, nome) VALUES (?, ?)");
        int tot = 0;
        for (int i = 0; i < 100; i++) {
            pstm.setInt(1, i);
            pstm.setString(2, "Funcionário " + i);
            tot += pstm.executeUpdate();
        }
        System.out.println("Inseridos : " + tot);
        pstm.close();
        con.close();
    }

    private void selecionar() throws ClassNotFoundException, SQLException {
        SimpleDateFormat fdt = new SimpleDateFormat("hh:mm:ss:SSSS");
        conexao();
        // Varrer todos os dados
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery(
            "SELECT nome, matricula FROM funcionario");
        int x = 0;
        String nome = null;
        int matricula;
        System.out.println("Tempo Inicial: " + fdt.format(new java.util.Date()));
        while (res.next()) {
            nome = res.getString(1);
            matricula = res.getInt(2);
            x += 1;
        }
        System.out.println("Tempo Final: " + fdt.format(new java.util.Date()));
        System.out.println("O último que li foi " + nome);
        System.out.println("Total de " + x);
    }
}
Na primeira parte deste programa será criada uma tabela na base teste e populada com 100 registros de funcionário, na segunda parte é realizada uma consulta para verificar a existência dos registros e o tempo de performance de leitura.

Assista o vídeo para tirar quaisquer dúvida de como proceder:


Pronto o MySQL está pronto para seus testes, uma boa vantagem é que podemos criar várias instâncias (contêineres) do banco para múltiplos testes ou mesmo destruir sem deixar rastro de quaisquer dados.

Obrigado e até a próxima
Fernando Anselmo

0 comentários:

Postar um comentário