What is the difference between Arrow Flight SQL JDBC Driver and ADBC JDBC Driver?

Hello, I’m kind of new to Dremio and Arrow data in general and currently doing some research about connecting to Dremio datasets in Java. I’m reading about these two different JDBC drivers:
https://arrow.apache.org/docs/java/flight_sql_jdbc_driver.html
and
https://arrow.apache.org/adbc/0.5.1/faq.html#and-then-what-is-the-adbc-jdbc-driver

and I’m having some trouble understanding the differences between them and which would be better to use in terms of scalability, performance, etc.

Am I correct in understanding that they’re more or less the same thing, except that the ADBC driver can support databases that either don’t support returning Arrow data, or support Arrow data through a protocol besides Flight SQL (as written in the docs). Because of that it could be used with other databases and not only Dremio. They both still use Flight Sql wire protocol, right? Are there any other benefits of using the ADBC JDBC Driver over the Arrow Flight SQL JDBC Driver for Dremio?

Flight SQL is server wire protocol that’s Arrow native.
ADBC is JDBC “alternative” that’s Arrow native. (ex. Snowflake or GBQ doesn’t have Flight SQL, but do have a proprietary Arrow API)

You want Arrow native if you want to work with columnar data from end to end.

Any Flight SQL server returns Arrow columns over wire. JDBC has row-based API, so it must do transposition before it gives you the data. That’s a waste of CPU power. Especially, if you later use the data for some late DataFrame analytics.

“ADBC JDBC driver” is the worst of both worlds, but may be necessary for some app wiring. One part of app uses ADBC, second JDBC etc.

1 Like