default void executeQueryAsync(int maxRows, boolean scrollable, List<PageKey> pageKeys, AsyncHandler<AsyncResult<Result>> handler) { Result result = executeQuery(maxRows, scrollable, pageKeys); if (handler != null) { AsyncResult<Result> r = new AsyncResult<>(); r.setResult(result); handler.handle(r); } }
@Override public void handle(AsyncResult<Integer> ar) { if (ar.isSucceeded()) updateCount = ar.getResult(); // 设置完后再调用handle,否则有可能当前语句提前关闭了 setExecutingStatement(null); command.close(); handler.handle(ar); } };
@Override public void handle(AsyncResult<Result> ar) { JdbcResultSet resultSet = null; if (ar.isSucceeded()) { Result r = ar.getResult(); resultSet = new JdbcResultSet(conn, JdbcStatement.this, r, id, closedByResultSet, scrollable, updatable); resultSet.setCommand(command); } setExecutingStatement(null); if (handler != null) { AsyncResult<ResultSet> r2 = new AsyncResult<>(); if (ar.isSucceeded()) r2.setResult(resultSet); else r2.setCause(ar.getCause()); handler.handle(r2); } } };
@Override public void handle(AsyncResult<Result> ar) { Result r = ar.getResult(); resultSet = new JdbcResultSet(conn, JdbcPreparedStatement.this, r, id, closedByResultSet, scrollable, updatable, cachedColumnLabelMap); setExecutingStatement(null); resultSet.setCommand(command); if (handler != null) { AsyncResult<ResultSet> r2 = new AsyncResult<>(); r2.setResult(resultSet); handler.handle(r2); } } };
rowCount = updateCount; if (updateHandler != null) { AsyncResult<Integer> ar = new AsyncResult<>(); ar.setResult(updateCount); asyncResult = ar; result = r; if (queryHandler != null) { AsyncResult<Result> ar = new AsyncResult<>(); ar.setResult(r); asyncResult = ar; asyncResult = new AsyncResult(); asyncResult.setCause(e); asyncHandler.handle(asyncResult); async = false; // 不需要再回调了 return null;
@SuppressWarnings("unchecked") public final void run(Transfer transfer) { if (e == null) { this.transfer.setDataInputStream(transfer.getDataInputStream()); runInternal(); } else if (ah != null) { AsyncResult r = new AsyncResult(); r.setCause(e); ah.handle(r); } if (ah == null) latch.countDown(); }
@Override public void run() { command.executeUpdateAsync(pageKeys, res -> { if (res.isSucceeded()) { int updateCount = res.getResult(); try { transfer.writeResponseHeader(id, getStatus(session)); if (session.isRunModeChanged()) { transfer.writeInt(sessionId).writeString(session.getNewTargetEndpoints()); } if (operation == Session.COMMAND_DISTRIBUTED_TRANSACTION_UPDATE || operation == Session.COMMAND_DISTRIBUTED_TRANSACTION_PREPARED_UPDATE) { transfer.writeString(session.getTransaction().getLocalTransactionNames()); } transfer.writeInt(updateCount); transfer.writeLong(session.getLastRowKey()); transfer.flush(); } catch (Exception e) { sendError(transfer, id, e); } } else { sendError(transfer, id, res.getCause()); } }); } });
@SuppressWarnings({ "rawtypes", "unchecked" }) private void stop(boolean async, AsyncResult ar, AsyncHandler ah) { session.closeTemporaryResults(); session.setCurrentCommand(null); if (async) { if (session.isAutoCommit() && session.getReplicationName() == null) { // 在复制模式下不能自动提交 // 等到事务日志写成功后再返回语句的执行结果 session.setRunnable(() -> ah.handle(ar)); session.prepareCommit(); } else { // 当前语句是在一个手动提交的事务中进行,提前返回语句的执行结果 ah.handle(ar); } } else { if (session.isAutoCommit() && session.getReplicationName() == null) { session.commit(); } } if (startTimeNanos > 0 && trace.isInfoEnabled()) { long timeMillis = (System.nanoTime() - startTimeNanos) / 1000 / 1000; // 如果一条sql的执行时间大于100毫秒,记下它 if (timeMillis > Constants.SLOW_QUERY_LIMIT_MS) { trace.info("slow query: {0} ms, sql: {1}", timeMillis, getSQL()); } } }
default void executeUpdateAsync(List<PageKey> pageKeys, AsyncHandler<AsyncResult<Integer>> handler) { int updateCount = executeUpdate(pageKeys); if (handler != null) { AsyncResult<Integer> r = new AsyncResult<>(); r.setResult(updateCount); handler.handle(r); } }
@Override public void run() { command.executeQueryAsync(maxRows, scrollable, pageKeys, res -> { if (res.isSucceeded()) { Result result = res.getResult(); cache.addObject(resultId, result); try { sendError(transfer, id, res.getCause());
@Override public void runInternal() { try { if (isDistributedUpdate) session.getParentTransaction().addLocalTransactionNames(transfer.readString()); int updateCount = transfer.readInt(); long key = transfer.readLong(); if (commandUpdateResult != null) { commandUpdateResult.setUpdateCount(updateCount); commandUpdateResult.addResult(ClientCommand.this, key); } setResult(updateCount); if (handler != null) { AsyncResult<Integer> r = new AsyncResult<>(); r.setResult(updateCount); handler.handle(r); } } catch (IOException e) { throw DbException.convert(e); } } };
@Override public void runInternal() { try { if (isDistributedQuery) session.getParentTransaction().addLocalTransactionNames(transfer.readString()); int columnCount = transfer.readInt(); int rowCount = transfer.readInt(); ClientResult result; if (rowCount < 0) result = new RowCountUndeterminedClientResult(session, transfer, resultId, columnCount, fetch); else result = new RowCountDeterminedClientResult(session, transfer, resultId, columnCount, rowCount, fetch); setResult(result); if (handler != null) { AsyncResult<Result> r = new AsyncResult<>(); r.setResult(result); handler.handle(r); } } catch (IOException e) { throw DbException.convert(e); } } };