Skip to main content

ArrowTTC — Connection guide

Everything you can put in front of ArrowTTC to point it at an Oracle database, in one place: the three ways to supply connection details, every option the driver accepts, and the Oracle-specific rules (EZConnect, SID vs service name, TCPS wallets, Oracle Cloud Autonomous Database).

For the wire-level detail of how each authentication method works (O5LOGON, Kerberos, OCI IAM token, OAuth2/Entra ID, proxy, change-password, TLS), see AUTHENTICATION.md. For read throughput and batch sizing, see the README ## Performance / ### Batch Size sections. For the licence, see LICENSING.md.


Three ways to connect

Every driver in the Arpeio family accepts the same three connection forms. They can be mixed; a discrete option always wins over the same field taken from a connection_string or a uri, regardless of the order they are set.

FormOption keyGrammarBest for
Discrete optionsadbc.arrowttc.<field>one option per fieldprogrammatic clients, secrets kept out of a single string
Connection stringadbc.arrowttc.connection_stringADO.NET Key=Value;… (+ Oracle EZConnect in Server)pasting an existing string
Connection URIurioracle://… URLportable tooling, copy-paste from other Oracle ADBC tools
Python
import adbc_driver_manager.dbapi as dbapi

# Discrete options
conn = dbapi.connect(driver="arrowttc", db_kwargs={
"adbc.arrowttc.server": "localhost",
"adbc.arrowttc.port": "1521",
"adbc.arrowttc.service_name": "orclpdb1",
"adbc.arrowttc.username": "scott",
"adbc.arrowttc.password": "tiger",
})

# Connection string (ADO.NET keywords, or Oracle EZConnect in Server)
conn = dbapi.connect(driver="arrowttc", db_kwargs={
"adbc.arrowttc.connection_string":
"Server=localhost:1521/orclpdb1;User ID=scott;Password=tiger",
})

# Connection URI (Oracle URL grammar)
conn = dbapi.connect(driver="arrowttc", db_kwargs={
"uri": "oracle://scott:tiger@localhost:1521/orclpdb1?ssl_mode=verify-full",
})

Precedence is enforced by a per-field bitmask shared between the parsed result and the database handle: a parsed field from connection_string/uri is applied only if no discrete adbc.arrowttc.* option already claimed it. Secrets held transiently on the stack during parsing are scrubbed (OPENSSL_cleanse) on every return path.


Option reference

All options are string-typed and live under the adbc.arrowttc.* namespace. Set them as ADBC database options before the connection is opened. Statement and ingest options are set on the statement — see Statement & ingest options.

Target — where to connect

OptionDefaultMeaning
adbc.arrowttc.serverHost name or IP. Also accepts an Oracle EZConnect descriptor (host:port/service) — see EZConnect.
adbc.arrowttc.port1521TCP port, 1..65535. TCPS listeners conventionally use 2484 — set it explicitly.
adbc.arrowttc.service_nameOracle service name / PDB. The usual way to name a database.
adbc.arrowttc.sidOracle SID. Selects a different CONNECT_DATA form on the wire — mutually exclusive with service_name (giving both is rejected).
adbc.arrowttc.app_namedriver defaultProgram name reported to the server (V$SESSION.PROGRAM).

Authentication

Full method-by-method detail is in AUTHENTICATION.md.

OptionValuesMeaning
adbc.arrowttc.username / .passwordstringOracle credentials (O5LOGON challenge-response — the password is never sent in clear, even without TLS).
adbc.arrowttc.auth_methodpassword (default) / kerberos / token / oauth2Selects the login method. token/oauth2 are auto-selected when their token options are set.
adbc.arrowttc.proxy_userschemaAuthenticate as username, open the session in this user's schema via Oracle CONNECT THROUGH proxy.
adbc.arrowttc.new_passwordstringChange username's password as part of login — the way in past an expired one.
adbc.arrowttc.token_locationdirOCI IAM database token: directory holding the token and its PEM private key (as oci iam db-token get writes). Selects auth_method=token.
adbc.arrowttc.access_tokenJWTOAuth2 / Microsoft Entra ID bearer token, inline. Selects auth_method=oauth2.
adbc.arrowttc.token_filepathSame OAuth2 bearer token, read from a file (inline access_token wins if both are set).
adbc.arrowttc.krb5_cred_modeccache / keytab / passwordKerberos credential source.
adbc.arrowttc.krb5_keytabpathKerberos keytab (service accounts / CI).
adbc.arrowttc.krb5_ccachepathKerberos credential cache (the ambient kinit ticket).
adbc.arrowttc.krb5_principalnameKerberos client principal.
adbc.arrowttc.krb5_passwordstringPassword to obtain a TGT (password-mode Kerberos).
adbc.arrowttc.krb5_spnSPNService principal name of the database (e.g. oracle/db.example.com).
adbc.arrowttc.krb5_realmrealmKerberos realm override.

Encryption / TLS (TCPS)

OptionDefaultMeaning
adbc.arrowttc.ssl_modedisabledisable (plain TCP) / require (encrypt, cert not verified) / verify-ca (chain verified) / verify-full (chain and hostname — use this one).
adbc.arrowttc.ssl_root_certPEM CA bundle for verify-ca/verify-full (else the system trust store).
adbc.arrowttc.wallet_locationDirectory holding ewallet.pem (client key + cert + CAs), python-oracledb-thin layout. This is exactly an unzipped Oracle Cloud ADB wallet.
adbc.arrowttc.wallet_passwordUnlocks an encrypted key inside the wallet.

ssl_mode is disable by default — the connection is plaintext unless you say otherwise. O5LOGON keeps the password off the wire, but SQL text and result data are in clear until you set ssl_mode or Native Network Encryption.

Native Network Encryption (NNE)

Version

Since ArrowTTC v0.1.3.

Oracle's transport-layer encryption, negotiated after ACCEPT — no TCPS required. See AUTHENTICATION.md for the wire detail.

OptionValuesMeaning
adbc.arrowttc.encryptionaccepted (default) / rejected / requested / requiredClient stance for AES-256 payload encryption. required fails the connect if the server will not encrypt.
adbc.arrowttc.data_integritysame four valuesClient stance for the SHA-256 (or SHA-1) integrity checksum.

Only AES-256 and SHA-256/SHA-1 are offered — the legacy ciphers (DES/3DES/RC4) and MD5 are never proposed. accepted leaves an existing plaintext connection byte-for-byte unchanged.

Timeouts & performance

OptionDefaultMeaning
adbc.arrowttc.login_timeoutdriver defaultTCP connect budget in seconds (0 = no limit).
adbc.arrowttc.socket_timeoutdriver defaultPer-socket read timeout in seconds (0 = no limit).
adbc.arrowttc.sdu0 (protocol default)Session Data Unit in bytes — the largest TNS DATA packet the driver offers, negotiated down to the server's own maximum. A larger SDU means fewer packets, and so fewer per-packet AES/MAC operations and syscalls, on a big fetch. 0 keeps the protocol default (8192) and leaves the CONNECT bytes unchanged. Range 512..2097152.
adbc.arrowttc.batch_size32000Rows per streamed Arrow batch (also Buffer Size in a connection string). A memory knob, not a throughput knob — see the README ### Batch Size. Range 1..10000000.
adbc.arrowttc.statement_cache_size20Number of server cursors held open and reused per connection, keyed by SQL text. Reusing a cursor skips the hard parse and prevents the per-statement cursor leak that would otherwise exhaust OPEN_CURSORS on a long-lived connection. 0 disables reuse (cursors are still closed, just not reused). Matches oracledb's stmtcachesize.
Version

adbc.arrowttc.sdu is configurable since ArrowTTC v0.3.0. It is a database option only (no connection-string or URI keyword).

Type rendering (read path)

OptionValuesMeaning
adbc.arrowttc.number_mappingauto (default) / double / decimal:P,SHow Oracle's unconstrained NUMBER maps to Arrow. auto → lossless utf8; doublefloat64 (lossy); decimal:P,Sdecimal128(P,S). See DATA_TYPES.md.

Licence

OptionMeaning
arpeio.adbc.licenseLicence blob, inline.
arpeio.adbc.license_filePath to a .lic file.
arpeio.adbc.license.statusRead-only (GetOption); reports <state>;code=<ARROW_LIC_*>;tier=<tier>;expires=<epoch>.

The driver also reads the shared ARPEIO_ADBC_LICENCE[_FILE] environment variables and an arpeio_adbc.lic file next to the library. Full resolution order in LICENSING.md.

Standard ADBC connection options

These use the ADBC-standard keys (no arrowttc namespace):

OptionValuesMeaning
adbc.connection.autocommittrue/falseAutocommit mode. Connection.Commit / Rollback drive an explicit transaction otherwise.

Statement & ingest options

Set on the statement handle, not the database:

OptionDefaultMeaning
arrowttc.sdo.sridRead path. Force a specific SRID onto every MDSYS.SDO_GEOMETRY (geoarrow.wkb) column in the result, overriding whatever SRID is stored in the geometry, and applied even when the result has no rows to inspect. A non-numeric, zero, negative, or out-of-range value is rejected with ADBC_STATUS_INVALID_ARGUMENT. Without it the driver surfaces each geometry column's own stored SDO_SRID. Since v0.3.1. See Data types.
adbc.ingest.target_tableTarget table for adbc_ingest.
adbc.ingest.modecreatecreate / append / replace / create_append.
adbc.ingest.target_db_schemaTarget schema for ingest.
adbc.ingest.target_catalogOracle reaches one catalog per session; a value that is not the connected service is rejected (NOT_IMPLEMENTED).
adbc.ingest.temporaryfalseIngest into a GLOBAL TEMPORARY table (ON COMMIT PRESERVE ROWS).

Connection string (ADO.NET form)

adbc.arrowttc.connection_string accepts the ADO.NET Key=Value;… grammar: case-insensitive keywords, quoted values, doubled-quote escapes. The Server keyword additionally accepts an Oracle EZConnect descriptor (see below).

Keyword(s)Option
Server, Data Source, Host, Address, Addrserver (+ EZConnect host:port/service)
Portport
Service Name, ServiceName, Database, Initial Catalogservice_name
SIDsid
User ID, UID, User, Usernameusername
Password, PWDpassword
Application Name, Appapp_name
Connection Timeout, Connect Timeout, Timeoutlogin_timeout
Socket Timeoutsocket_timeout
Buffer Sizebatch_size
Number Mappingnumber_mapping
SSL Mode, sslmodessl_mode
SSL Root Cert, sslrootcertssl_root_cert
Wallet Locationwallet_location
Wallet Passwordwallet_password
Proxy Userproxy_user
New Passwordnew_password
Encryptionencryption
Data Integritydata_integrity
Auth Methodauth_method
Kerberos Cred Mode, Kerberos Keytab, Kerberos Cache, Kerberos SPN, Kerberos Realm, Kerberos Principal, Kerberos Passwordthe matching krb5_* option
Server=localhost:1521/orclpdb1;User ID=scott;Password=tiger;sslmode=verify-full

Database / Initial Catalog map to the service name — Oracle's unit of connection is a service (or a PDB), and callers coming from the sibling drivers reach for Database first. SID and Service Name are mutually exclusive.


Connection URI

The standard ADBC uri option takes an Oracle-style URL, so a string copied from other Oracle ADBC tooling works unchanged.

<scheme>://[user[:password]@]host[:port][/service_name][?key=value&…]
  • Schemes (case-insensitive, equivalent): oracle:// and the branded arrowttc://. The scheme only selects the URL grammar — it never picks the driver, so oracle:// never collides with another Oracle ADBC driver installed alongside this one.
  • The path segment is the Oracle service name. Use ?sid=<SID> for the SID CONNECT_DATA form instead; giving both a service name (path or ?service_name=) and a ?sid= is rejected.
  • userinfo, host, and query values are percent-decoded; query values treat + as a space. Bracketed IPv6 hosts use [::1]:1521.
  • For the ADO.NET key=value; form, use connection_string, not uri (a uri without a scheme:// is rejected with a pointer to connection_string).

Query parameters (unknown or repeated parameters are rejected):

Parameter(s)Option
userusername
passwordpassword
service_nameservice_name
sidsid
ssl_modessl_mode
ssl_root_certssl_root_cert
wallet_locationwallet_location
wallet_passwordwallet_password
encryptionencryption
data_integritydata_integrity
connect_timeoutlogin_timeout
application_name, app_nameapp_name
number_mappingnumber_mapping
proxy_userproxy_user
oracle://scott:tiger@dbhost:2484/orclpdb1?ssl_mode=verify-full&wallet_location=/etc/oracle/wallet
oracle://scott:tiger@dbhost:1521/?sid=ORCL

EZConnect

Oracle lets a whole connect descriptor be written as host:port/service, and it is what most users reach for. ArrowTTC accepts it wherever a Server is given (discrete server, the Server connection-string keyword):

Server=dbhost                       # host only, service/SID given separately
Server=dbhost:1521/orclpdb1 # host:port/service
Server=//dbhost:1521/orclpdb1 # optional leading //
Server=dbhost,1521 # ADO.NET host,port form (cross-driver muscle memory)
  • The /service suffix sets the service name (use_sid=false).
  • A bare IPv6 literal is rejected rather than mis-parsed — give the host and Port as separate keywords, or use the bracketed [::1] form in a uri.

Oracle Cloud Autonomous Database (ADB)

Version

Since ArrowTTC v0.2.0.

A downloaded ADB instance wallet works as-is (mutual TLS). Point wallet_location at the unzipped wallet directory (which contains ewallet.pem), set wallet_password, use ssl_mode=verify-full, and connect to one of the wallet's _low / _tp / … services on port 1522:

Python
db_kwargs = {
"adbc.arrowttc.server": "adb.<region>.oraclecloud.com",
"adbc.arrowttc.port": "1522",
"adbc.arrowttc.service_name": "<svc>_low.adb.oraclecloud.com",
"adbc.arrowttc.username": "scott",
"adbc.arrowttc.password": "tiger",
"adbc.arrowttc.ssl_mode": "verify-full",
"adbc.arrowttc.wallet_location": "/home/you/wallet",
"adbc.arrowttc.wallet_password": "<wallet-pw>",
}

Oracle's cwallet.sso cannot be read — convert it with orapki wallet pkcs12_to_pem -wallet <dir> to produce ewallet.pem. ADB also accepts OCI IAM token and OAuth2 / Entra ID login instead of a password (both still require the wallet for mutual TLS) — see AUTHENTICATION.md.


See also