Преимущества доступа к данным Vert.x по сравнению с CompletableFuture.supplyAsyn c с JDBC - PullRequest
0 голосов
/ 18 февраля 2020

Каковы преимущества использования библиотеки доступа к данным vert.x для подключения к базе данных (например, Reactive PostgreSQL клиент ) по сравнению с CompletableFuture.supplyAsyn c с JDB C с точки зрения управления потоками .

Предположим, у нас есть веб-приложение. В обоих случаях поток запроса не будет заблокирован во время ожидания базы данных, так почему бы кому-то использовать драйвер vert.x вместо официального jdb c?

Например, в JDB C:

String url = "jdbc:postgresql://localhost/test";
Properties props = new Properties();
props.setProperty("user","fred");
props.setProperty("password","secret");
props.setProperty("ssl","true");

CompletableFuture.supplyAsync(() -> {
    Connection conn = DriverManager.getConnection(url, props);

    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
    while (rs.next())
    {
        System.out.print("Column 1 returned ");
        System.out.println(rs.getString(1));
    }
    rs.close();
    st.close();
});

In ver.x

PgConnectOptions connectOptions = new PgConnectOptions()
  .setPort(5432)
  .setHost("the-host")
  .setDatabase("the-db")
  .setUser("user")
  .setPassword("secret");

// Pool options
PoolOptions poolOptions = new PoolOptions()
  .setMaxSize(5);

// Create the client pool
PgPool client = PgPool.pool(connectOptions, poolOptions);

// A simple query
client.query("SELECT * FROM users WHERE id='julien'", ar -> {
  if (ar.succeeded()) {
    RowSet<Row> result = ar.result();
    System.out.println("Got " + result.size() + " rows ");
  } else {
    System.out.println("Failure: " + ar.cause().getMessage());
  }

  // Now close the pool
  client.close();
});

1 Ответ

3 голосов
/ 18 февраля 2020

Действительно, в обоих случаях поток вызывающего не будет заблокирован.

Но в первом случае задача передается потоку из пула (в вашем примере, внутреннего пула JDK) в то время как во втором случае Reactive Pg Client работает асинхронно и вызывает предоставленный обратный вызов, когда результаты готовы.

Потоки идут с оплатой (память, переключение контекста). Поэтому, если вашим приложениям нужно обрабатывать много запросов с меньшими ресурсами, лучше использовать Reactive Pg Client.

...