Interfejs AsyncQueryRunner

Plik org.apache.commons.dbutils.AsyncQueryRunnerclass pomaga wykonywać długo działające zapytania SQL z obsługą asynchronii. Ta klasa jest bezpieczna wątkowo. Ta klasa obsługuje te same metody, co QueryRunner, ale zwraca obiekty Callable, których można później użyć do pobrania wyniku.

Deklaracja klasy

Poniżej znajduje się deklaracja klasy org.apache.commons.dbutils.AsyncQueryRunner -

public class AsyncQueryRunner
   extends AbstractQueryRunner

Stosowanie

  • Step 1 - Utwórz obiekt połączenia.

  • Step 2 - Użyj metod obiektu AsyncQueryRunner, aby wykonać operacje na bazie danych.

Przykład

Poniższy przykład pokaże, jak zaktualizować rekord przy użyciu klasy AsyncQueryRunner. Zaktualizujemy jeden z dostępnych rekordów w tabeli pracowników.

Składnia

String updateQuery = "UPDATE employees SET age=? WHERE id=?";
future = asyncQueryRunner.update(conn,
            "UPDATE employees SET age=? WHERE id=?", 33,103);

Gdzie,

  • updateQuery - Zaktualizuj zapytanie zawierające symbole zastępcze.

  • asyncQueryRunner - obiekt asyncQueryRunner do aktualizacji obiektu pracownika w bazie danych.

  • future - Przyszły obiekt do późniejszego pobrania wyniku.

Aby zrozumieć wspomniane powyżej koncepcje związane z DBUtils, napiszmy przykład, który uruchomi zapytanie aktualizujące w trybie asynchronicznym. Aby napisać nasz przykład, stwórzmy przykładową aplikację.

Krok Opis
1 Zaktualizuj plik MainApp.java utworzony w rozdziale DBUtils - Pierwsza aplikacja .
2 Skompiluj i uruchom aplikację, jak wyjaśniono poniżej.

Poniżej znajduje się zawartość Employee.java.

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

Poniżej znajduje się zawartość MainApp.java plik.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.AsyncQueryRunner;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException; 
import java.util.concurrent.ExecutorCompletionService; 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; 
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws 
      SQLException, InterruptedException, 
      ExecutionException, TimeoutException {
      Connection conn = null;

      AsyncQueryRunner asyncQueryRunner = new AsyncQueryRunner( Executors.newCachedThreadPool());

      DbUtils.loadDriver(JDBC_DRIVER);       
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      Future<Integer> future = null;
      try {
         future = asyncQueryRunner.update(conn, 
            "UPDATE employees SET age=? WHERE id=?", 33,103);         
         Integer updatedRecords = future.get(10, TimeUnit.SECONDS);
         System.out.println(updatedRecords + " record(s) updated.");
      } finally {
         DbUtils.close(conn);
      }  
   }
}

Po utworzeniu plików źródłowych uruchom aplikację. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.

1 record(s) updated.