Neste artigo, veremos como usar o HSQL em aplicativos Vert.x, é claro, você também pode usar qualquer JDBC e usar a API assíncrona fornecida pela Vertx-JDBC-Client. O código deste artigo está no GitHub.
assíncrono?
Uma característica muito importante do Vert.x é sua assíncrona. Usando uma API assíncrona, você não precisa esperar que o resultado retorne. Quando um resultado é retornado, o Vert.x o notificará ativamente. Para ilustrar isso, vejamos um exemplo simples.
Vamos supor que exista um método Add. De um modo geral, será usado como int r = add (1, 1). Esta é uma API síncrona, então você deve esperar até que o resultado seja retornado. A API assíncrona ficará assim: add (1, 1, r -> { /*faça algo com o resultado* /}). Nesta versão, você passa em um manipulador, que é chamado apenas quando o resultado é calculado. Este método não retorna nada e o implementa da seguinte forma:
public void add (int a, int b, manipulador <TEGER> ResultHandler) {int r = a + b; resultandler.handle (r);}Para evitar conceitos confusos, as APIs assíncronas não são multithread. Como vimos no exemplo, não há multithreading envolvido.
JDBC assíncrono
Depois de ler algumas APIs assíncronas básicas, agora entenda o vertx-jdbc-client. Este componente nos permite interagir com o banco de dados através do driver JDBC. Essas interações são assíncronas, como antes:
String sql = "selecione * de produtos"; ResultSet rs = stmt.executeQuery (SQL);
Agora é assim:
Connection.Query ("Selecione * de Produtos", Resultado -> {// Faça algo com o resultado});Esse modelo é mais eficiente e, quando o resultado é lançado, o vert.x é notificado, evitando esperar o resultado.
Aumentar as dependências do Maven
Adicione duas dependências maven ao arquivo pom.xml
<Depencency> <PuerpId> io.vertx </groupId> <stifactId> vertx-jdbc-client
A primeira dependência fornece vertx-jdbc-client e o segundo fornece o driver do HSQL JDBC. Se você deseja usar outro banco de dados, modifique essa dependência e também precisa modificar os nomes do driver JDBC URL e JDBC.
Inicialize o cliente JDBC
Crie um cliente JDBC:
Na classe MyFirstverticle, declare uma nova variável jdbcclient jdbc e adicione -a no método inicial:
JDBC = JDBCCLIENT.CREATHARHARDED (Vertx, config (), "minha coleta de branco");
Uma instância do cliente JDBC foi criada e o cliente JDBC está configurado usando o arquivo de configuração da vertical. Este arquivo de configuração requer a seguinte configuração para fazer com que o cliente JDBC funcione corretamente:
URL URL-JDBC, por exemplo: JDBC: HSQLDB: MEM: DB? Shutdown = true
_Driver Class-JDBC Driver, por exemplo: org.hsqldb.jdbcdriver
Com o cliente, você precisa se conectar ao banco de dados a seguir. A conexão com o banco de dados é alcançada usando o JDBC.getConnection, que requer um manipulador <Asyncresult <SqlConnection>> Parâmetro a ser passado. Vamos dar uma olhada mais profunda neste tipo. Primeiro, este é um manipulador, por isso será chamado quando o resultado estiver pronto. Este resultado é uma instância de assíncro -cultura <SqlConnection>. Asyncresult é uma estrutura fornecida pela Vert.x. Use -o para saber se a operação conectada ao banco de dados foi bem -sucedida ou falhada. Se for bem -sucedido, ele fornece um resultado, que é uma instância do SQLConnection.
Quando você recebe uma instância de Asyncresult, o código é geralmente:
if (ar.failed ()) {System.err.println ("A operação falhou ...:"+ ar.cause (). getMessage ());} else {// use o resultado: resultado = ar.result ();}Você precisa obter o SQLConnection e iniciar o aplicativo REST. Como se torna assíncrono, isso requer alterar a maneira como o aplicativo é iniciado. Então, se você dividir a sequência de inicialização em vários blocos:
startbackend ((conexão) -> CreateSomedata (conexão, (nada) -> startwebapp ((http) -> completeStartUp (http, fut)), fut), fut);
startbackend- Obter objeto SQLConnection e ligue para a próxima etapa
CrieSomedata- Inicializa o banco de dados e insere dados. Quando terminar, ligue para o próximo passo
Startwebapp - Inicie um aplicativo da web
completestartUp- finalmente complete a inicialização
O FUT é passado pelo Vert.x para notificar problemas que foram iniciados ou encontrados durante a inicialização.
Método Startbackend:
private void startbackend (manipulador <Asyncresult <SqlConnection>> Em seguida, futuro <Void> FUT) {jdbc.getConnection (ar -> {if (ar.Failed ()) {FUT.Fail (ar.Cause ());} else {a seguir.Este método obtém um objeto SQLConnection para verificar se a operação foi concluída. Se for bem -sucedido, o próximo passo será chamado. Se falhar, um erro será relatado. Outros métodos seguem o mesmo padrão:
Verifique se a operação anterior foi bem -sucedida
Lidar com a lógica de negócios
Ligue para a próxima etapa
SQL
O cliente está pronto e agora escreva SQL. Começando com o método CreateSomedata, esse método também faz parte da sequência de inicialização:
Void privado CreateSomedata (Asyncresult <SqlConnection> Resultado, Handler <Asyncresult <Void>> Em seguida, futuro <Void> FUT) {if (resultado.Failed ()) {Fut.Fail (resultado.Causa ());} {sqlConnection Connection = resultado.Result (); nome varchar (100), " +" origem varchar (100)), ar -> {if (ar.failed ()) {fut.fail (ar.cause ()); conexão.close (); return;} conexion.Quey ("selecione * do whisky", select -> {se select.Failed ()) {fut.fil (AR. (select.Result (). getNumrows () == 0) {insert (New Whisky ("Bowmore 15 anos Laimrig", "Escócia, Islay"), conexão, (v) -> inserção (New Whisky ("Talisker 57 ° North", "Scotland, Island, Island"), (R) -> {Next.Handle (FUTURO.Este método verifica se o SQLConnection está disponível e executa algumas instruções SQL. Primeiro, crie uma tabela se não existir. Confira o seguinte código:
Connection.Execute (instrução SQL, manipulador chamado quando a declaração foi executada)
O manipulador recebe o Asyncresult <Void>, por exemplo: é apenas uma notificação e não há resultado de retorno real.
Feche a conexão
Após a conclusão da operação, não se esqueça de fechar o link SQL. Essa conexão é colocada no pool de conexões e pode ser reutilizada.
No código deste manipulador, verificamos se a instrução é executada corretamente. Se estiver correto, verificaremos se a tabela contém dados. Caso contrário, usaremos o método de inserção para inserir os dados:
Inserção de vazio privado (uísque uísque, conexão sqlConnection, manipulador <asyncresult <hiskey>> próximo) {string sql = "inserir no uísque (nome, origem)?,?"; conexão.UpdateWithParams (sql, new jsonRay (). (ar.Failed ())) {next.Handle (FUTURO.FAILEDFUTURE (AR.CAUSE ()); RETURN;} UpdateResult resultado = ar.Result (); // Construa uma nova instância de uísque com o id.wisky whish.nky Whisk (New WhisKey.getKeys (). whoky.getorigin ()); next.Handle (FUTURO.SUCEDEDEDFUTURE (W));});}Este método usa o método de atualizaçãoWithParams com a instrução Insert (declaração) e o valor é passado. Esse método evita a injeção de SQL. Depois que a instrução for executada (ela será criada quando o banco de dados não tiver esses dados), um novo objeto de uísque é criado e o ID é gerado automaticamente.
Descanse com banco de dados (SQL)
Os métodos acima fazem parte da sequência de inicialização. Mas e o método de chamar a API REST? Veja o método Getall como exemplo. Este método é chamado pelo front-end do aplicativo da web e recupera todos os produtos armazenados:
private void getall (roteingContext roteingContext) {jdbc.getConnection (ar -> {sqlConnection Connection = ar.result (); conexão.Query ("Selecione * do uísque", resultado -> {list <hisky> whiskyys = resultado.Result (). GetRows (). Stream (). Map (Whisky :: new) .Collect (Collectors.Tolist ()); RoutingContext.Response (). });});}Este método obtém um objeto SQLConnection e emite uma consulta. Depois que o resultado da consulta for obtido, ele escreverá uma resposta HTTP como o método anterior. Os métodos GETONE, DELETEONE, UPDATEONE e ADDONE são os mesmos. Observe que, após a resposta, você precisa fechar a conexão SQL.
Observe os resultados fornecidos pelo manipulador passado para o método de consulta. Obtenha um ResultSet contendo os resultados da consulta. Cada linha é um JsonObject; portanto, se você possui um objeto de dados que usa o JsonObject como o único parâmetro, criar esse objeto é simples.
teste
O programa de teste precisa ser atualizado de uma maneira pequena e a configuração do JDBCClient é adicionada. Na classe MyFirstverticleest, modifique o objeto de implantação criado no método de configuração para:
Opções de implantação = new NOWMENTOPTIONS (). SetConfig (new JsonObject (). Put ("http.port", port) .put ("url", "jdbc: hsqldb: MEM: teste? Shutdown = true").Além dos drivers http.port, JDBC URL e JDBC também estão configurados. Durante o teste, um banco de dados na memória é usado. A mesma modificação deve ser feita no arquivo SRC/Test/Resources/my-t-config.json.
{"http.port": $ {http.port}, "url": "jdbc: hsqldb: mem: it-test? Shutdown = true", "driver_class": "org.hsqldb.jdbcdriver"}O arquivo src/main/conf/my-pplication-conf.json também precisa ser modificado, não para teste, mas para executar este aplicativo:
{"http.port": 8082, "url": "jdbc: hsqldb: arquivo: db/uísques", "driver_class": "org.hsqldb.jdbcdriver"}O URL JDBC aqui é um pouco diferente do arquivo anterior, porque o banco de dados precisa ser armazenado no disco rígido.
Tempo de exibição!
Comece a construir o programa:
MVN Pacote limpo
Sem modificar a API (sem alterar os arquivos Java publicados e a interface REST), o teste deve ser executado sem problemas.
Inicie o aplicativo:
Java -Jar Target/My-First-App-1.0-Snapshot-Fat.jar -Conf Src/Main/Conf/My-Application-Conf.json
Visite http: // localhost: 8082/Assets/Index.html e, em seguida, você pode ver que este aplicativo usa um banco de dados. Desta vez, mesmo que o aplicativo seja reiniciado, os dados ainda estão lá porque o produto de armazenamento é persistido no disco rígido.
Resumir
Neste artigo, sei como usar o JDBC Database em Vert.x, e não há muitas coisas complicadas. Você pode se surpreender com esse modelo de desenvolvimento assíncrono no início, mas quando começar a usá -lo, será difícil para você voltar.
Da próxima vez, veremos como esse aplicativo usa o MongoDB para substituir o HSQL.
Bem -vindo a seguir <a href = "http://quanke.name/" rel = "nofollow"> </a>
Grupo de Comunicação: 231419585
Por favor, indique a fonte ao reimprimir, obrigado