JDBC-Proxy

datasqill stellt einen Jdbc-Proxy zur Verfügung, der frei verwendet werden kann.

Der Proxy kann zwischen eine Java Appliaktion und einen beliebigen 3rd Party Jdbc-Treiber geschaltet werden. Anwendungsfälle für einen solchen Proxy sind Messung von Laufzeiten, Logging von Jdbc-Aufrufen oder Vereinheitlichung des Verhaltens von Jdbc-Treibern und Kapselung von spezifischen Eigenheiten dieser Treiber.

Besonderheiten:

Der Proxytreiber liefert statt eines gewöhnlichen CLOB eine DsProxyClob Implementierung.

Sofern man nicht DsProxy Methoden nutzt bei der Verwendung vom CLOB (sondern native), kann man mit getPhysicalClob den nativen CLOB erhalten.

Connection Pooling

Die folgenden Java system properties können gesetzt werden:

de.datasqill.dsproxy.pool.maxOpenConnections default 30 : maximum 30 open connections at the same time de.datasqill.dsproxy.pool.maxConnectionAgeInMinutes default 60 : 1 hour de.datasqill.dsproxy.pool.maxWaitForConnectionInMillis default -1 : wait forever de.datasqill.dsproxy.printSQL false : set to true if every sql execeuted sql statement shall be printed to stdout

Debugging

printOpenObjectsOnClose

wenn man im datasqill Connection String

dboptionlist={printOpenObjectsOnClose=summary}

setzt, dann wird die Anzahl der nicht geschlossenen Datenbankobjekte pro Objekttyp im Log ausgegeben.

Datentyp Konvertierung

In datasqill werden einige Datentypen benötigt. Leider sind nicht alle in den Zieldatenbanken gleich verfügbar.

Um datasqill zu installieren und datasqill gegen eine Datenbank als Repository laufen zu lassen, bietet der Proxy Treiber die Möglichkeit, Datentypen entsprechend der Zieldatenbank zu konvertieren.

Hierbei gibt es Unterschiede bei den folgenden Datentypen:

  • VARCHAR(n) / VARCHAR2(n)
  • VARCHAR / CLOB
  • BIGINT / NUMBER

Zusätzlich werden auch andere Teile des Statements ersetzt:

  • Das MINUS Keywort wird auch konvertiert, wenn die Zieldatenbank nur EXCEPT unterstützt.
  • Das (Oracle) Statement "CREATE LOCAL TEMPORARY TABLE" wird in Postgres durch "CREATE TEMP TABLE" ersetzt

Es sind also gezielte Eingriffe in das SQL, damit datasqill entsprechend der Repository Datenbank agiert.

Dazu setzt man MapDataType in den Connectionproperties. Aus Kompatibilitätsgründen ist es derzeit immer auf "datasqill" gesetzt und man muss es explizit auf "off" setzen um dieses Feature abzuschalten.

wenn man im datasqill Connection String

dboptionlist={MapDataType=datasqill}

setzt, dann ist es angeschaltet.

mit

dboptionlist={MapDataType=off}

kann man es abschalten.

Snowflake

Snowflake hat einige Properties, die man mit übergeben kann. Insbesondere für die Authentifizierung benötigt man folgende:

  • user=
  • warehouse=
  • db=
  • schema=
  • authenticator=SNOWFLAKE_JWT
  • private_key_file=
  • loginTimeout=10
  • disablePlatformDetection=true

Die folgenden zusätzlichen Connectionparameter können gesetzt werden.

  • bulkTempDir: Wo werden Zwischenfiles abgelegt (default is /tmp)
  • bulkStageDir: Wo werden die Dateien in snowflake hochgeladen (default is @stage.stage)
  • printOpenObjectsOnClose: Wenn auf true, dann werden alle geparsten SQL Befehle auf die Konsole ausgegeben
  • printTimings: Wenn auf true, werden an verschiedenen Stellen Zeitstempel ausgegeben

Hierbei gibt man sie im letzten Block im keyfile Eintrag vor dem Kennwort an:

SQTS_DB_XX jdbc:dsproxy:snowflake://<host>/?useArrowResultFormat=false||dboptionlist={user=datasqill,warehouse=<WH>,db=<Database>,schema=<Schema>,authenticator=SNOWFLAKE_JWT,private_key_file=<PATH OF Public Key>,loginTimeout=10,disablePlatformDetection=true,printOpenObjectsOnClose=summary,bulkTempDir=/tmp,bulkStageDir=@stage.migration,printTimings=true}|