JDBC Drivers — Official Catalog and Governance
Downloading a database driver from a dubious website, finding out about the incompatibility only in production and never knowing whether that JAR carries a known vulnerability: that was the invisible cost of connecting each new source. DATTA removes that risk with an official catalog of 39 JDBC drivers and a security validation pipeline that every JAR goes through — downloaded automatically or uploaded by you — before it becomes available to any connection.
Management lives in , restricted to administrators. This guide covers your responsibilities over the catalog: initial installation, manual upload, validation, lifecycle and monitoring.
Who does what
| Moment | Who runs it | What happens |
|---|---|---|
| Platform installation | The setup-datta.sh script (Phase 7) | Downloads, validates and registers the open-license drivers |
| Driver with a click-through license | Administrator | Downloads it from the vendor's site and uploads it through the screen |
| After installation | Administrator, through the screen | Approves, deprecates, quarantines, removes, re-validates |
The platform no longer performs an automatic bootstrap in the backend — all initialization was moved to setup-datta.sh (commit 277661e, "refactor: move all initial setup from backend to setup-datta.sh"). Once installed, drivers are managed at runtime through the screen and the administration API.
What already ships in the catalog (39 drivers)
- Open-source relational: PostgreSQL, MySQL, MariaDB, SQLite, H2, HSQLDB, Apache Derby, CockroachDB (uses the PostgreSQL driver) and TimescaleDB (same).
- Analytical / columnar: DuckDB, ClickHouse, Apache Druid (via Avatica), Apache Pinot, Apache Doris and StarRocks (both MySQL-compatible).
- Data warehouse / cloud: Snowflake, Amazon Redshift, Azure Synapse (SQL Server-compatible), Databricks (manual download), IBM Db2.
- Enterprise: Oracle (manual), Microsoft SQL Server, SAP HANA, Teradata (manual), IBM Informix (manual), SAP ASE jConnect (manual), Firebird (Jaybird), Vertica, Exasol.
- Query engines: Trino, PrestoDB, Apache Spark Thrift (via Hive JDBC), Apache Hive, Apache Impala (Cloudera, manual), Apache Phoenix, Apache Drill.
- Time-series: QuestDB (PostgreSQL-compatible), Apache IoTDB, InfluxDB 3.x (via Flight SQL).
That is 39 entries in the official catalog, versioned by a version tag the developer increments on every structural change (new field, license change).
SQL dialects: you write it once, the platform translates
Every driver in the catalog has a matching dialect registered in the platform's dialect library — today 39 dialects, some of them shared (CockroachDB reuses the PostgreSQL one, Synapse the SQL Server one). The dialect absorbs each vendor's differences:
- catalog introspection (
ALL_TABLESversusinformation_schema); - case sensitivity (Oracle works in upper case);
- identifier quoting;
- pagination (LIMIT/OFFSET, FETCH or ROWNUM);
- date types (TIMESTAMP, DATETIME2, TIMESTAMPTZ);
- MERGE/UPSERT syntax.
Architecture rule: vendor-specific logic lives in the dialect and nowhere else.
Initial installation (Phase 7 of setup-datta.sh)
When the operator runs ./setup-datta.sh, Phase 7 — "Download and upload of the official JDBC drivers" — does the following, in order:
- Authenticates as an administrator to obtain the session credentials.
- For each catalog driver that is neither an alias nor requires a manual download: downloads the JAR from the vendor's official URL into the installation's log directory and uploads it to the platform along with the metadata (key, version, vendor). The driver upload endpoint is described in the API reference.
- The validation pipeline runs on the spot; if it passes, the driver is registered as Pendente (pending) and waits for your approval. The exception is the Neo4j JDBC driver, which the installation then approves through the official catalog when the vulnerability scan completes without a blocking finding (section Installation from the official catalog). If it stays pending, the installation ends with the warning "driver Neo4j JDBC pendente de aprovação" and the example Database Agents over CNPJ are not registered: approve the driver (Revalidar and Aprovar) and run again the agent registration that the warning points to.
- Click-through license drivers are skipped with a warning — it is up to you to download and upload them through the screen (next section).
The --skip-drivers flag skips Phase 7 entirely: use it when you need to run the setup again without redoing the downloads.
Manual download: drivers with click-through licenses
Some vendors require explicit license acceptance on their own site. For those, the automatic download is skipped and the driver shows up in the table with the Download manual badge and a direct link to the official page:
| Driver | Official page | Notes |
|---|---|---|
| Oracle (OTN) | <https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html> | Accept the OTN License Agreement |
| Databricks | <https://www.databricks.com/spark/jdbc-drivers-download> | Databricks login + EULA |
| Teradata | <https://downloads.teradata.com/download/connectivity/jdbc-driver> | Portal registration |
| Cloudera Impala | <https://www.cloudera.com/downloads/connectors/impala/jdbc.html> | Cloudera login + commercial license |
| IBM Informix | <https://www.ibm.com/support/pages/download-information-informix-jdbc-driver-version-4> | IBM ID + IPLA |
| SAP ASE (Sybase) | <https://help.sap.com/docs/SAPASEJCONNECT> | Part of the SAP ASE client |
| BigQuery (Simba) | <https://cloud.google.com/bigquery/docs/reference/odbc-jdbc-drivers> | Only if you require JDBC — DATTA uses a native connector |
Step by step: uploading the Oracle driver
- Open the official page from the link on the driver's row and download the JAR, accepting the OTN license.
- In , click Adicionar driver.
- Select the
.jarfile and fill in the name, vendor, version and driver class. - Confirm the upload. The validation pipeline runs on the spot; if it passes, the driver enters as Pendente (pending). Check the outcome in the driver's details and click Aprovar (approve): from then on it can be used in new connections.
If the same JAR has been uploaded before, the platform recognizes it by the SHA-256 hash and reuses the existing record instead of creating a duplicate — the event is recorded as DRIVER.UPLOAD_DEDUP.
Security validation: no JAR gets in without the pipeline
Every JAR — from the setup or uploaded by you — goes through five stages in sequence:
- Static bytecode analysis: classes with dangerous calls (
Runtime.exec,ProcessBuilder,System.loadLibrary) are rejected, and so are JARs too small to be a real driver. - Vulnerability scan against the local CVE database (Trivy / Grype): an unmitigated HIGH or CRITICAL finding blocks the driver.
- Digital signature verification, when the vendor publishes an
.ascor a.sha256hash. - Isolated load test: the driver class is loaded in an isolated class loader, to guarantee it comes up without an unhandled exception before any real connection.
- Safe JAR extraction and metadata inference, which complete the driver's record.
Failed at any stage? The validation outcome is recorded with the reason and the driver goes to Quarentena (quarantined) — it is never exposed for use.
When the vulnerability scan does not complete
The scan may not complete: the scanning tool is unavailable, the CVE database could not be downloaded, the scan was interrupted or returned a report outside the expected format. This is not treated as a clean scan:
- the driver stays Pendente (pending), with a warning from the scan stage in the validation outcome, and is never approved automatically;
- the severity recorded on the driver is
SCAN_FAILED("no scan"), with no CVE count and no scan date; - a Revalidar (re-validate) that does not complete either is recorded as an attempt in the driver's CVE report, but does not erase the last valid result: a driver with a critical CVE keeps showing the critical one.
To release the driver, click Revalidar in its details; with a valid scan and no blocking finding, click Aprovar (approve).
Installation without internet. In the installation from the offline package, the CVE database is not included and the scanner has nowhere to download it from: every scan ends without completing, and Revalidar does not help. In this mode, only manual approval (Aprovar) takes a driver out of Pendente — check the JAR first, because the platform could not scan it.
Scan deadline and a queue of one scan at a time
Each vulnerability scan has a 180-second deadline. This value was measured: the first scan after the drivers service restarts downloads the CVE database and takes about 50 seconds on the on-premises profile and about 100 seconds on the minimum profile (half a core and 1 GB of memory); with the database already downloaded, a scan takes a few seconds. A scan that goes past the deadline is stopped and counts as a scan that did not complete (previous section), with the warning "A varredura de vulnerabilidades excedeu o prazo de 180 s" (the scan exceeded the 180 s deadline).
The CVE database lives in a temporary volume of its own in the drivers service, capped at 4 GB, outside the JAR volume and therefore outside the drivers backup. It survives a restart of the service, but not its re-creation: after a version release, the first scan downloads it again.
Only one scan runs at a time. Uploads, Revalidar (re-validate) and installation from the catalog join a queue, in order of arrival; the download and the other pipeline stages keep running in parallel. A request that waits too long in the queue gets the message "O verificador de vulnerabilidades está ocupado. Tente novamente em alguns minutos." (the vulnerability scanner is busy, try again in a few minutes). In that case nothing is recorded: the upload does not create the driver, Revalidar changes neither the report nor the status, and installation from the catalog marks the entry as failed, to be retried on the next installation. A driver never stays Pendente (pending) because of the queue.
How to read the Security column
The Segurança (security) column of the driver list and the header of the driver details show the summary of the driver's last valid scan:
| What you see | Meaning |
|---|---|
| sem CVE (no CVE, green) | The scan completed and found no CVE |
Severity and count, for example HIGH · 3 | The scan completed; the highest severity found and how many CVEs the JAR has. CRITICAL and HIGH show in red, MEDIUM in amber, LOW in grey |
| sem scan (no scan, grey) | The driver has no valid scan: it never ran or never completed (previous section). It does not mean the JAR is clean |
The Segurança tab of the details lists the CVEs of the last valid scan, with the identifier, the affected component, the summary and the fixing version, and its title shows the scanner and its version (for example, trivy 0.56.2). When the tab says "Lista de CVEs ainda não registrada — use Revalidar" (CVE list not recorded yet — use re-validate), the driver has the summary (the column shows severity and count), but the detailed list was not stored yet: that is the case of drivers scanned before this platform version. A Revalidar stores the list. This message never means "no CVE".
The findings of the static analysis and of the other pipeline stages are not stored: the tab shows them after a Revalidar, until you close the details. When it finishes, Revalidar reports the severity and count found, or that the scan could not run because the JAR could not be analyzed.
Lifecycle and governance
The four statuses
| Status | Meaning |
|---|---|
| Pendente | Registered and validated, waiting for approval; cannot be used in connections yet |
| Aprovado | In use, available to the whole platform |
| Descontinuado | Still loads, but is not recommended; the screen shows the badge |
| Quarentena | Blocked — any attempt to use it raises an error and an audit record |
A driver you upload that passes validation enters as Pendente and is only used after Aprovar (approve); a validation failure goes straight to Quarentena. The list's status filter shows each group: pick "Pendentes" to see what is waiting for approval, or "Todos os status" to see every driver.
Installation from the official catalog
The Popular drivers oficiais button (and the Instalar button on each catalog card) downloads the vendor's JAR, runs it through the same pipeline and approves the driver automatically only when all of these hold:
- validation recorded no error;
- the JAR is signed, when the platform policy requires a signature;
- the vulnerability scan completed;
- the scan found no CVE of blocking severity.
If any of them is missing, the driver stays Pendente, the catalog card shows Aguardando aprovação (awaiting approval) instead of "Instalado", and the installation log explains the reason. If the downloaded JAR was already registered as Pendente (for example, uploaded earlier through the screen), the platform scans it again before deciding, with the same rule — it never approves based on an old result.
A catalog driver that stayed Pendente is not re-evaluated by another Popular drivers oficiais: for the installation it is already installed. To release it, open it through the "Pendentes" filter, click Revalidar and, with a valid scan, Aprovar.
A Descontinuado (deprecated) driver is your decision and is respected: Popular drivers oficiais does not reinstall it (the log records skipped_deprecated) and never brings it back to Aprovado. If the driver's file disappeared from storage, the installation restores it, and the driver stays deprecated.
Only one catalog installation runs at a time. While one is in progress, a new Popular drivers oficiais, Instalar or Atualizar (in this or another tab) shows "Já existe um bootstrap de drivers em andamento. Aguarde a conclusão." (a bootstrap is already running; wait for it to finish) and does not start. Closing the tab interrupts the installation in progress; wait a few moments before retrying.
Catalog card badges
Each card under "Drivers oficiais disponíveis" shows one badge, evaluated in this order (the first one that applies wins):
| Badge | When it shows | Button |
|---|---|---|
| Aguardando aprovação (awaiting approval) | the catalog version is installed, but pending | none |
| Instalado (installed) | the catalog version is registered, not deprecated, and its JAR file is in storage | none |
| Descontinuado and Arquivo ausente | the catalog version exists only as deprecated, and the file is gone | Reinstalar |
| Descontinuado (deprecated) | the catalog version exists only as deprecated | none |
| Arquivo ausente (file missing) | the catalog version is registered, but its JAR file is not in storage | Reinstalar |
| Nova versão disponível (new version available) | this entry has a driver only in another version | Atualizar |
Reinstalar (reinstall) downloads the JAR again and restores it on the existing driver without changing its status: a deprecated driver stays deprecated. The card of a deprecated driver has no button on purpose — bringing it back is your decision, with Reativar in the driver detail, and it is recorded in the audit trail. Atualizar (update) installs the new catalog version as a new driver, without touching the old one.
The "instalados" (installed) count at the top of the catalog counts only the cards with Instalado: deprecated drivers and drivers without a file are not included.
Administrator actions
| Action | Effect |
|---|---|
| Approve | Shown in the details of a pending driver: promotes it to approved, and the approval stays in the audit trail with who approved it |
| Deprecate | Marks the driver as deprecated; new connections start receiving a Portuguese warning discouraging its use |
| Reactivate (Reativar) | Shown in the details of a deprecated driver: brings it back to approved and clears the deprecation date |
| Quarantine | Blocks the driver. If there are active connections, the audit records the impact and you have 48 hours to migrate or revoke |
| Remove | Permanent deletion, allowed only with no active connections: while any connection uses the driver, the removal is refused. The driver's CVE report goes with it, including the CVE list from the last scan; the same JAR uploaded again starts without a report and gets one on its first scan |
| Revalidar (re-validate) | Runs the validation pipeline again over an already installed driver — do this whenever the local CVE database is updated. It does not change the driver's status; a scan that does not complete does not erase the last valid result |
Vendor documentation for the Copilot
The platform reindexes each driver's vendor documentation to feed the answers about that source. The ingestion runs in the background: the request answers immediately and progress is polled afterwards (RUNNING / COMPLETED / FAILED) — both endpoints are in the API reference. The crawl downloads same-level pages in parallel, controlled by datta.doc-ingest.crawl-concurrency (default 6), with a global time ceiling in datta.doc-ingest.crawl-timeout-seconds (default 120).
Audit trail
Every governance action emits an event:
| Event | When |
|---|---|
DRIVER.UPLOAD | JAR uploaded and validated |
DRIVER.UPLOAD_DEDUP | JAR identical to one already installed (SHA-256 hash matches) |
DRIVER.APPROVE | Promoted to approved (including through the Reactivate button) |
DRIVER.AUTO_APPROVE | Approved automatically during installation from the official catalog |
DRIVER.AUTO_APPROVE_SKIPPED | Installation from the catalog that did not approve; the motivo field says why: SCAN_FAILED (scan did not complete), CVE_BLOQUEANTE (blocking CVE), VALIDACAO_COM_ERRO (validation error), NAO_ASSINADO (unsigned) or DEPRECATED (deprecated driver) |
DRIVER.DEPRECATE | Marked as deprecated |
DRIVER.QUARANTINE | Blocked |
DRIVER.DELETE | Physically removed |
DRIVER.FETCH_DOCS | Vendor documentation reindexed |
DRIVER.FETCH_DOCS_FAILED | Documentation ingestion failed (with URL and error) |
DRIVER.RESCAN | Pipeline run again over an existing driver; scanFailed tells that the scan did not complete |
Where the JAR is stored
The driver file lives on its own persistent volume (datta-drivers-pvc, 5 GB by default), separate from the driver record. They are two different things: the record holds name, version, hash and status; the file is what the services download in order to run queries.
If that volume is ephemeral, the symptom shows up far from the cause: after any restart — and every release is a restart — the catalog still lists the drivers as approved, and every database-agent query fails with Download falhou (HTTP 404) para driver <id>. Uploading the file again fixes it until the next release.
With more than one replica of the driver service, the volume must accept simultaneous read and write (ReadWriteMany): one replica writes the uploaded file and all the others must read it.
Monitoring
The drivers service publishes the datta.drivers.varredura.duracao metric: the duration of each vulnerability scan, including the wait in the queue, with the result in the outcome tag — ok (the scan completed), timeout (it went past the deadline), falha (it did not complete for another reason) and ocupado (it gave up on the queue). The latency of the other pipeline stages shows up in the service's HTTP request metrics.
Four signals deserve an alert:
| Signal | What it usually means |
|---|---|
outcome=timeout or outcome=ocupado above zero | Scans are slow for the deadline (large CVE database, service CPU at its limit) or there are more simultaneous uploads than the queue holds — compare the duration with the 180-second deadline |
Spike of DRIVER.QUARANTINE in a short window | A newly published CVE affecting already installed dependencies — re-validate the estate |
DRIVER.DELETE during operation | Should be rare; check in the audit trail who removed it and why |
No DRIVER.UPLOAD for many days while the catalog expects a new entry | Likely failure in Phase 7 of setup-datta.sh |
Native sources stay out of the JDBC catalog
Sources with capabilities a generic JDBC driver cannot reach use the native connectors of the platform's execution engine — on purpose. Shipping a JDBC wrapper for them would trade the best of each engine for a lowest common denominator:
| Source | Native connector | Capability that JDBC would lose |
|---|---|---|
| Neo4j | org.neo4j:neo4j-java-driver | Variable-length paths, graph algorithms (GDS) — see the exception below |
| Apache Cassandra | com.datastax.oss:java-driver-core | Async paging, token-aware balancing |
| MongoDB | org.mongodb:mongodb-driver-sync | Aggregation pipeline, change streams |
| BigQuery | google-cloud-bigquery + Storage Read API | 10–100x faster reads, dry-run cost estimation |
| OpenSearch | org.opensearch.client:opensearch-java | Vector search (KNN), highlight, scripting |
| Elasticsearch | official client | Top-level KNN, ApiKey authentication |
| Kafka / Pulsar | native clients | Continuous streaming and change data capture (CDC) |
JDBC drivers for these sources do not enter the official catalog.
Named exception — Neo4j (Cypher, read-only). Neo4j's official JDBC driver is back in the catalog for a single use: the sample Database Agent that queries the CNPJ registry loaded into the platform itself, in Cypher and in a read session. The entry is deliberately narrow — SQL translation off, no GDS, writes refused — and it is not the data-integration path to Neo4j, which remains the native connector. See Database Agents in the user guide.
For developers: adding a driver to the catalog
Adding a new driver to the official catalog is a code change, made in the platform's official driver list:
- Declare the entry with the driver's key.
- Fill in name, vendor, version, driver class, source page, documentation URL, license type, sample JDBC URL, default port and tags.
- If the JAR can be downloaded directly (Maven Central, for example), set the download URL; when the vendor publishes a
.sha256, record the expected hash. - Click-through license: mark the driver as manual download and as requiring license acceptance.
- Alias: point it at the base key (CockroachDB points at
postgresql). - Register the matching dialect in the dialect library, if it does not exist yet.
- Increment the catalog's version tag.
- Adjust Phase 7 of
setup-datta.shonly if the driver requires special handling — the generic loop covers the normal case. - Whenever possible, add a validation pipeline test.
Download host allowlist for the catalog
When a catalog driver is downloaded by the platform (catalog bootstrap through the administration API), the download is only accepted over HTTPS and from a host listed in datta.drivers.bootstrap.allowed-hosts, in the driver service's application.yml. The comparison ignores case, and the bootstrap does not follow redirects: a URL that answers 3xx fails. At boot, the service log reports how many hosts were loaded; an empty list logs a warning and turns the host check off.
To extend the list, add the vendor host to application.yml in the same change that adds the driver: the catalog test fails the build when a direct download uses a host outside it. You can also set the environment variable DATTA_DRIVERS_BOOTSTRAP_ALLOWEDHOSTS (comma-separated hosts), but it replaces the whole list instead of adding to it: repeat every host, including repo1.maven.org.
References
- Streaming runbook (Kafka/Debezium): Runbook — Streaming (F9).
- Connection operations, including credential backup and re-encryption: Runbook — Connection Management.
- Driver catalog, upload and documentation endpoints: API reference.