ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive...

39

Transcript of ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive...

Page 1: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads
Page 2: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |

ADBA – Asynchronous Database AccessA Reactive, non-blocking API for Connecting to an RDBMS

Douglas Surber Kuassi MensahJDBC Architect Director, Product Management Database Server TechnologiesMarch, 2019

Page 3: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Safe Harbor StatementThe following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

3

Page 4: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Program Agenda

Introduction

Code

Wrap-up

Q&A

1

2

3

4

4

Page 5: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

ADBA – Asynchronous Database AccessBringing Reactive Programming to RDBMS

• What • a Java standard RDBMS access API that never blocks user threads

• Reactive Streams processing with non-blocking backpressure where appropriate

• Why• Database access is slow; blocked threads leave resources idle for a long time

• Bring Reactive programming to the RDBMS

• Who• Developed by the Java Community, the ADBA Expert Group (coming soon) and Oracle

• When: JSR in the works

5

Page 6: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Design Goals• No user thread blocks ever– Minimize the number of threads used for database access

• Alternate API for database access– Not an extension to the current JDBC standard– Not a replacement for the current JDBC standard

• Target high throughput apps– Not a completely general purpose database access API– At least version 1 will have a limited feature set

• Build exclusively on the Java SE class library

• Support 3rd party full Reactive Stream Database Access APIs

6

Page 7: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Design Choices

• No reference to java.sql• Rigorous use of types• Builder pattern• Fluent API• Immutable after initialization • One way to do something is enough• No SQL processing by the driver• Avoid callback hell

7

Page 8: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

What About …?

• Streams … ultimately blocking

• Reactive Streams– De facto standard for Reactive Streams processing with non-blocking backpressure – There is Java 9 Flow API but No standard implementation in the JDK– All existing implementations require non-standard 3rd party libraries

• Jakarta EE JNoSQL– A standard asynchronous API for NoSQL database types: Column, Key-Value, Document and Graph– A mapping API or layer that maps Java annotated objects to the target NoSQL database.

• Fibers and Continuations for the JVM (project Loom)– Reduces the complexity of writing efficient concurrent applications – High throughput to existing Java applications with minimal code change

Confidential – Oracle Internal/Restricted/Highly Restricted 8

Page 9: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

What About R2DBC

Reactive Relational Database Connectivity

• Full Reactive Streams Database Access API

– “Reactive everywhere”

– Dependency on Reactor library

• R2DBC over ADBA “…allows usage of ADBA drivers by using the R2DBC SPI”– https://github.com/r2dbc/r2dbc-over-adba

• ADBA is committed to meet R2DBC requirements

– Tell us what exactly you need!!!

Confidential – Oracle Internal/Restricted/Highly Restricted 9

Page 10: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Reactive Programming Mechanisms in Java• Java 8: CompletionStage, CompletableFutures– java.util.concurrent.CompletionStage– Event based, push model – Allows composing asynchronous tasks– Supports lambda expressions and fluent programming–More @ http://bit.ly/2nnLqa0

• Java 9: Flow and Reactive Streams

10

Page 11: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Java 9 Reactive Streams with Non blocking Backpressurejava.util.concurrent.Flow

Confidential – Oracle Internal/Restricted/Highly Restricted 11

ADBA User Java code

Page 12: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Program Agenda

Introduction

Code

Wrap-up

Q&A

1

2

3

4

12

Page 13: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Trivial Insert

// RowCountOperationpublic void insertItem(Session session, Item item) {session.rowCountOperation("insert into tab values (:id, :name, :answer)")

.set("id", item.id(), AdbaType.NUMERIC)

.set("name", item.name(), AdbaType.VARCHAR)

.set("answer", item.answer(), AdbaType.NUMERIC)

.submit();}

Confidential – Oracle Internal/Restricted/Highly Restricted 13

Page 14: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Execution Model

• Everything is an Operation• An Operation consists of– SQL or other database operation

– Parameter assignments

– Result handling

– Submission and CompletionStage

• User thread creates and submits Operations– Creating and submitting never blocks; user thread never blocks

• Implementation executes those Operations asynchronously– Performs round trip(s) to the database– Executes result handling

– Completes CompletionStage

14

Page 15: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

getDataSource// DataSourceFactorypublic DataSource getDataSource() {return DataSourceFactory.newFactory("oracle.database.adba")

.builder()

.url("//host.oracle.com:5521/example")

.username("scott")

.password("tiger")

.build();}

Confidential – Oracle Internal/Restricted/Highly Restricted 15

Page 16: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Getting a SessionDefault method in DataSource:

public default Session getSession() {return builder().build().attach();

}

Default method in Session:

public default Session attach() {this.submit();this.attachOperation()

.submit();return this;

}

16

Page 17: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Trivial Select// RowOperationpublic void idsForAnswer(DataSource ds, List<Integer> result, int correctAnswer) {try (Session session = ds.getSession()) {session.<List<Integer>>rowOperation("select id, name, answer from tab where answer = :target")

.set("target", correctAnswer, AdbaType.NUMERIC)

.collect(() -> result,(list, row) -> list.add(row.at("id").get(Integer.class)))

.submit();}

}

Confidential – Oracle Internal/Restricted/Highly Restricted 17

Page 18: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Close@Overridepublic default void close() {this.closeOperation()

.submit();// submitting a close Operation must satisfy the requirements of// OperationGroup.close()

}

Note: A CloseOperation is never skipped.

18

Page 19: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

SQL Support• All SQL is vendor specific–No escape sequences–No specified parameter markers

• Non vendor specific syntax requires processing by the driver– Adds overhead– Increases code complexity–Minimal benefit as most apps are tied to a specific database regardless

Note: Code examples use parameter markers from a variety of databases including DB2 (:foo), MySQL (?), Oracle Database(:foo), PostgresSQL($1), SQL Server (@foo), and JDBC (?).

19

Page 20: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

SELECT// RowOperationpublic CompletionStage<List<Item>> itemsForAnswer(DataSource ds, int answer) {try (Session session = ds.getSession()) {

return session.<List<Item>>rowOperation("select id, name, answer from tab where answer = :target").set("target", 42, AdbaType.NUMERIC).collect(Collectors.mapping(

row -> new Item(row.at("id").get(Integer.class),row.at("name").get(String.class),row.at("answer").get(Integer.class)),

Collectors.toList())).submit().getCompletionStage();

}}

Confidential – Oracle Internal/Restricted/Highly Restricted 20

Page 21: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Transaction// TransactionCompletion

public void transaction(DataSource ds) {

try (Session session = ds.getSession(t -> System.out.println("ERROR: " + t.toString()))){TransactionCompletion trans = session.transactionCompletion();CompletionStage<Integer> idPromise = session.<Integer>rowOperation("select empno, ename from

emp where ename = :1 for update")

.set("1", "CLARK", AdbaType.VARCHAR)

.collect(Collectors.collectingAndThen(Collectors.mapping(r -> r.at("empno").get(Integer.class),

Collectors.toList()),l -> l.get(0)))

.onError(t -> trans.setRollbackOnly())

.submit()

.getCompletionStage();

Confidential – Oracle Internal/Restricted/Highly Restricted 21

continued

Page 22: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Transaction (continued)session.<Long>rowCountOperation("update emp set deptno = :1 where empno = :2")

.set("1", 50, AdbaType.INTEGER)

.set("2", idPromise, AdbaType.INTEGER)

.apply(c -> {if (c.getCount() != 1L) {trans.setRollbackOnly();throw new RuntimeException("updated wrong number of rows");

}return c.getCount();

}).onError(t -> trans.setRollbackOnly()).submit();

// .getCompletionStage()// .exceptionally( t -> { trans.setRollbackOnly(); return null;}) // incorrectsession.catchErrors();session.commitMaybeRollback(trans);

}}

Confidential – Oracle Internal/Restricted/Highly Restricted 22

Page 23: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

OperationGroupOperations can be grouped• OperationGroup has its own result handling and CompletionStage• Members submitted to group.OperationGroup submitted as a unit• Order of execution– Sequential in order submitted– Parallel, any order

• Conditional or unconditional• Error response– Dependent: remaining group members skipped– Independent: remaining group members unaffected

• Session is an OperationGroup– Sequential, dependent, unconditional by default

23

Page 24: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Parallel UPDATE// Parallel, Independent OperationGrouppublic void updateListParallel(List<Item> list, DataSource ds) {String query = "select id from tab where answer = :answer";String update = "update tab set name = :name where id = :id";try (Session session = ds.getSession();OperationGroup<Object, Object> group = session.operationGroup()

.independent()

.parallel()) {group.submit();for (Item elem : list) {CompletionStage<Integer> idPromise = group.<List<Integer>>rowOperation(query)

.set("answer", elem.answer, AdbaType.NUMERIC)

.collect(Collector.of(() -> new ArrayList<>(),(l, row) -> l.add(row.at("id").get(Integer.class)),(l, r) -> l))

.submit()

.getCompletionStage()

.thenApply(l -> l.get(0));

Confidential – Oracle Internal/Restricted/Highly Restricted 24

continued

Page 25: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Parallel UPDATE (continued)group.rowCountOperation(update)

.set("id", idPromise)

.set("name", "the ultimate question")

.submit()

.getCompletionStage()

.exceptionally(t -> {System.out.println(elem.id);return null;

});}

}}

Confidential – Oracle Internal/Restricted/Highly Restricted 25

Page 26: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Row Publisher// RowPublisherOperationpublic CompletionStage<List<String>> rowSubscriber(DataSource ds) {

String sql = "select empno, ename from emp";CompletableFuture<List<String>> result = new CompletableFuture<>();

Flow.Subscriber<Result.RowColumn> subscriber = new Flow.Subscriber<>() {

Flow.Subscription subscription;List<String> names = new ArrayList<>();int demand = 0;

@Overridepublic void onSubscribe(Flow.Subscription subscription) {this.subscription = subscription;this.subscription.request(10);demand += 10;

}

Confidential – Oracle Internal/Restricted/Highly Restricted 26

continued

Page 27: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Row Publisher (continued)@Override

public void onNext(Result.RowColumn column) {names.add(column.at("ename").get(String.class));if (--demand < 1) {subscription.request(10);demand += 10;

}}

@Overridepublic void onError(Throwable throwable) {result.completeExceptionally(throwable);

}

@Overridepublic void onComplete() {result.complete(names);

}};

Confidential – Oracle Internal/Restricted/Highly Restricted 27

// Subscribercontinued

Page 28: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Row Publisher (continued)try (Session session = ds.getSession()) {return session.<List<String>>rowPublisherOperation(sql)

.subscribe(subscriber, result)

.submit();.getCompletionStage();

}} // fetchEmployees

28

Page 29: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Operation Submission Ratepublic class RecordSubscriber implements Subscriber<byte[]> {

private final Session session;private OperationGroup<Long, Long> group;

public RecordSubscriber(DataSource ds) {session = ds.getSession();

}

@Overridepublic void onSubscribe(Subscription subscription) {group = session.<Long, Long>operationGroup()

.independent()

.collect(Collectors.summingLong(c -> c));group.submit();session.requestHook(subscription::request);

}

continued

29

Page 30: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Operation Submission Rate (continued)@Overridepublic void onNext(byte[] item) {String insert = "insert into tab values (@record)";group.<Long>rowCountOperation(insert)

.set("record", item, AdbaType.VARBINARY)

.apply(c -> c.getCount())

.submit();}

@Overridepublic void onError(Throwable t) {group.close();session.close();

}

@Overridepublic void onComplete() {group.close();session.close();

}}

30

Page 31: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Controlling Session Creation Ratepublic class ItemSubscriber implements Subscriber<Item> {

private final DataSourceFactory factory;private DataSource ds;

public ItemSubscriber(DataSourceFactory f) {factory = f;

}

@Overridepublic void onSubscribe(Subscription subscription) {ds = factory.builder()

.url("//host.oracle.com:5521/example")

.username("scott")

.password("tiger")

.requestHook(subscription::request)

.build();}

continued

31

Page 32: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Controlling Session Creation Rate (continued)@Overridepublic void onNext(Item item) {try (Session s = ds.getSession()) {insertItem(s, item);

}}

@Overridepublic void onError(Throwable t) {ds.close();

}

@Overridepublic void onComplete() {ds.close();

}}

32

Page 33: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Program Agenda

Introduction

Code

Wrap-up

Q&A

1

2

3

4

33

Page 34: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

AoJ – ADBA over JDBC

• Proof-of-concept implementation that uses any standard JDBC driver

• Growing support for ADBA functionality

• Source released under the Apache license• Forked!

• Oracle is updating AoJ to track changes in ADBA

34

Page 35: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Status

• Everything is subject to change (cf our disclaimer)

• Developed through the Java Community Process

• Aiming at open sourcing the API, RI and the TCK

• You can participate via [email protected]

• The draft API is available for download from OpenJDK at http://hg.openjdk.java.net/jdk/sandbox/file/JDK-8188051-branch/src/jdk.incubator.adba/share/classes

• AoJ source available at https://github.com/oracle/oracle-db-examples/tree/master/java/AoJ

35

Page 36: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Program Agenda

Introduction

Code

Wrap-up

Q&A

1

2

3

4

36

Page 37: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Q & A

37

Page 38: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 38

Page 39: ADBA –Asynchronous Database AccessADBA –Asynchronous Database Access Bringing Reactive Programming to RDBMS •What •a Java standard RDBMS access API that never blocks user threads