adba –asynchronous database access · •what: java standard database access api that never...
TRANSCRIPT
![Page 1: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/1.jpg)
![Page 2: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/2.jpg)
Copyright © 2018, Oracle and/or its affiliates. All rights reserved. |
ADBA – Asynchronous Database AccessA new asynchronous API for connecting to a database
Douglas Surber Kuassi MensahJDBC Architect Director, Product Management Database Server TechnologiesJuly 18, 2018
![Page 3: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/3.jpg)
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 Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/4.jpg)
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 Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/5.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
ADBA – Asynchronous Database Access
• What: Java standard database access API that never blocks user threads• Who: Developed by the JDBC Community, JDBC Expert Group and Oracle• When: Targeted for a near future release, Java 12 perhaps• Why: async apps have better throughput– Fewer threads means less thread scheduling, less thread contention– Database access is slow so blocked threads leave resources idle for a long time
5
![Page 6: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/6.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
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 on the Java SE class library
6
![Page 7: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/7.jpg)
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 Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/8.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
What About …?
There are already multiple async Java and JavaScript APIs
• Streams– Java streams are inherently synchronous
• ReactiveStreams– ADBA uses java.util.concurrent.Flow where appropriate
• NodeJS
• ADBCJ
8
![Page 9: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/9.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Program Agenda
Introduction
Code
Wrap-up
Q&A
1
2
3
4
9
![Page 10: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/10.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Trivial Insert
public void trivialInsert(DataSource ds) {String sql = "insert into tab values (:id, :name, :answer)";try (Session session = ds.getSession()) {session.rowCountOperation(sql)
.set("id", 1, AdbaType.NUMERIC)
.set("name", "Deep Thought", AdbaType.VARCHAR)
.set("answer", 42, AdbaType.NUMERIC)
.submit();}
}
10
![Page 11: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/11.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
CompletionStage• Java representation of a computational monad• Mechanism for asynchronous programming– Event based: push model -> higher scalability– Brings reactive programming to Java• Best mechanism for composing asynchronous tasks in the Java class library.
– Supports lambda expressions and fluent programming
• More @ http://bit.ly/2nnLqa0
11
![Page 12: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/12.jpg)
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
12
![Page 13: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/13.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
getDataSourcepublic DataSource getDataSource(String url, String user, String pass) {return DataSourceFactory.newFactory("com.oracle.database.adba")
.builder()
.url("//javaone.oracle.com:5521/javaone")
.username("scott")
.password("tiger")
.connectionProperty(JdbcConnectionProperty.TRANSACTION_ISOLATION,TransactionIsolation.SERIALIZABLE)
.build();}
13
![Page 14: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/14.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Getting a SessionDefault method in DataSource:
public default Sesion getSession() {return builder().build().attach();
}
Default method in Session:
public default Connection attach() {holdForMoreMembers();submit();attachOperation().submit();return this;
}
14
![Page 15: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/15.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Trivial Selectpublic void trivialSelect(DataSource ds, List<Integer> result) {String sql = "select id, name, answer from tab where id = :target";try (Session session = ds.getSession()) {session.<List<Integer>>rowOperation(sql)
.set("target", 42, AdbaType.NUMERIC)
.collect(() -> result, (list, row) -> list.add(row.at("answer").get(Integer.class)) )
.submit();}
}
15
![Page 16: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/16.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Closepublic default void close() {closeOperation().submit();releaseProhibitingMoreMembers();
}
Note: A CloseOperation is never skipped.
16
![Page 17: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/17.jpg)
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 (?).
17
![Page 18: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/18.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
SELECTpublic CompletionStage<List<Item>> selectIdForAnswer(DataSource ds, int answer) {String sql = "select id, name, answer from tab where answer = @target";try (Session session = ds.getSession()) {return session.<List<Item>>rowOperation(sql)
.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();
}}
18
![Page 19: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/19.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Transactionpublic void transaction(DataSource ds) {try (Session session = ds.getSession(t -> System.out.println("ERROR: " + t))) {String sql = "select empno, ename from emp where ename = ? for update";TransactionCompletion trans = session.transactionCompletion();CompletionStage<Integer> idPromise = session.<Integer>rowOperation(sql)
.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();
continued
19
![Page 20: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/20.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Transaction (continued)
session.<Long>rowCountOperation("update emp set deptno = ? where empno = ?").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; } ) // NO
session.catchErrors();session.commitMaybeRollback(trans);
} }
20
![Page 21: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/21.jpg)
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
21
![Page 22: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/22.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Parallel UPDATEpublic void updateListParallel(List<Item> list, DataSource ds) {String query = "select id from tabone where answer = :answer";String update = "update tabone set name = :name where id = :id";try (Session session = ds.getSession()) {OperationGroup<Object, Object> group = session.operationGroup()
.independent()
.parallel();group.submitHoldingForMoreMembers();for (Item elem : list) {CompletionStage<Integer> idPromise= group.<List<Integer>>rowOperation(query)
.set("answer", elem.answer, AdbaType.NUMERIC)
.collect(() -> new ArrayList<>(),(l, row) -> { l.add( row.at("id").get(Integer.class) ); },
).submit().getCompletionStage().thenApply( l -> l.get(0) );
continued
22
![Page 23: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/23.jpg)
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;
});}group.releaseProhibitingMoreMembers();
}}
23
![Page 24: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/24.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Row Publisherpublic CompletionStage<List<Employee>> fetchEmployees(DataSource ds) {
String sql = "select empno, ename from emp";
CompletableFuture<List<Employee>> result = new CompletableFuture<>();
Flow.Subscriber<Result.RowColumn> subscriber = new Flow.Subscriber<>() {
Flow.Subscription subscription;List<Employee> employees = new ArrayList<>();int demand = 0;
public void onSubscribe(Flow.Subscription subscription) {this.subscription = subscription;this.subscription.request(10);this.demand += 10;
}
continued
24
![Page 25: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/25.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Row Publisher (continued)
public void onNext(Result.RowColumn column) {names.add(new Employee(column.at("ename").get(String.class),
column.next().get(String.class)));if (--demand < 1) {subscription.request(10);demand += 10;
}}
public void onError(Throwable throwable) {result.completeExceptionally(throwable);
}
public void onComplete() {result.complete(employees);
}}; // Subscriber
continued
25
![Page 26: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/26.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Row Publisher (continued)
try (Session session = ds.getSession()) {return session.<List<Employee>>rowPublisherOperation(sql)
.subscribe(subscriber, result)
.submit();}
} // fetchEmployees
26
![Page 27: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/27.jpg)
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.submitHoldingForMoreMembers();session.requestHook(subscription::request);
}
continued
27
![Page 28: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/28.jpg)
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.releaseProhibitingMoreMembers();session.close();
}
@Overridepublic void onComplete() {group.releaseProhibitingMoreMembers();session.close();
}}
28
![Page 29: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/29.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
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
29
![Page 30: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/30.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
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();
}}
30
![Page 31: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/31.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Program Agenda
Introduction
Code
Wrap-up
Q&A
1
2
3
4
31
![Page 32: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/32.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
AoJ – ADBA over JDBC• Proof-of-concept implementation that uses any standard JDBC driver• Very limited functionality• Source released under the Apache license• Oracle is updating AoJ to track changes in ADBA
32
![Page 33: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/33.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Status
• Everything is subject to change
• Developed through the Java Community Process
• You can participate via [email protected]
• The 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
• Targeted for a near future release, Java 12 perhaps
33
![Page 34: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/34.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Program Agenda
Introduction
Code
Wrap-up
Q&A
1
2
3
4
34
![Page 35: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/35.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Q & A
35
![Page 36: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/36.jpg)
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 36
![Page 37: ADBA –Asynchronous Database Access · •What: Java standard database access API that never blocks user threads •Who: Developed by the JDBC Community, JDBC Expert Group and Oracle](https://reader030.vdocument.in/reader030/viewer/2022040611/5ed9bf8e29c0430b7932b27f/html5/thumbnails/37.jpg)