Databricks JDBC-Treiber (OSS)
Wichtig
Dieser Treiber befindet sich in der Public Preview und ist noch nicht als Open Source-Treiber verfügbar.
Azure Databricks bietet einen Open Source (OSS) JDBC-Treiber, mit dem Sie Tools, wie DataGrip, DBeaver und SQL Workbench/J über die branchenübliche Spezifikation Java Database Connectivity (JDBC) mit Azure Databricks verbinden können, um auf Datenbankmanagementsysteme zuzugreifen.
In diesem Treiber sind die JDBC (Java Database Connectivity)-APIs implementiert. Er bietet Kernfunktionen wie OAuth und Cloud Fetch sowie Features wie die Unity Catalog-Volumeerfassung. Er führt den nativen Abfragemodus aus, unterstützt native parametrisierte Abfragen und kann mit Anweisungsausführungs-APIs ausgeführt werden, wodurch das nützliche Feature für die Aufbewahrung von Abfrageergebnissen oder Thrift bereitgestellt wird.
Dieser Artikel enthält Informationen zur Installation und Verwendung des Databricks JDBC-Treibers (OSS). Informationen zu nicht-OSS Databricks JDBC-Treibern finden Sie unter Databricks JDBC-Treiber.
Anforderungen
Für die Verwendung des Databricks JDBC-Treibers (OSS) müssen die folgenden Anforderungen erfüllt sein:
- Java Runtime Environment (JRE) 11.0 oder höher CI-Tests werden auf JRE 11, 17 und 21 unterstützt.
Hinweis
Aufgrund einer Änderung in JDK 16, die ein Kompatibilitätsproblem mit der Apache Arrow-Bibliothek verursacht hat, die vom TREIBER ZUR INSTALLATION verwendet wird, können Laufzeitfehler auftreten, wenn sie mit JDK 16 oder höher verwendet werden. Um diese Fehler zu vermeiden, starten Sie Ihre Anwendung oder den Treiber mit der folgenden JVM-Befehlsoption neu:
--add-opens=java.base/java.nio=org.apache.arrow.memory.core ALL-UNNAMED
Installieren des Treibers
Der Databricks JDBC-Treiber (OSS) wird im Maven Repository veröffentlicht. Die neueste Version ist 0.9.6-oss.
Um den Treiber zu installieren, verwenden Sie eine der folgenden Vorgehensweisen:
Bei Maven-Projekten fügen Sie die folgende Abhängigkeit zur
pom.xml
-Datei des Projekts hinzu, um Maven anzuweisen, den JDBC-Treiber automatisch in der angegebenen Version herunterzuladen:<dependency> <groupId>com.databricks</groupId> <artifactId>databricks-jdbc</artifactId> <version>0.9.6-oss</version> <scope>runtime</scope> </dependency>
Bei Gradle-Projekten fügen Sie die folgende Abhängigkeit zur Build-Datei des Projekts hinzu, um Gradle anzuweisen, den JDBC-Treiber mit der angegebenen Version automatisch herunterzuladen:
implementation 'com.databricks:databricks-jdbc:0.9.6-oss'
Die Syntax der Abhängigkeiten für andere Projekttypen und die aktuelle Versionsnummer des Databricks JDBC-Treibers (OSS) finden Sie im Maven Repository.
Konfigurieren der Verbindungs-URL
Um eine Verbindung zu Ihrem Azure Databricks-Arbeitsbereich mit dem JDBC-Treiber herzustellen, müssen Sie eine JDBC-Verbindungs-URL angeben, die verschiedene Verbindungseinstellungen wie den Server-Hostnamen Ihres Azure Databricks-Arbeitsbereichs, die Einstellungen für die Computeressourcen und die Authentifizierungsdaten für die Verbindung zum Arbeitsbereich enthält.
Sie können den Wert dieser Eigenschaften in der JDBC-Verbindungs-URL festlegen, sie festlegen und an die Methode DriverManager.getConnection übergeben oder eine Kombination aus beidem. Lesen Sie in der Dokumentation des Anbieters nach, wie Sie am besten eine Verbindung mit Ihrer spezifischen Anwendung, Ihrem Client, SDK, API oder SQL-Tool herstellen.
Die JDBC-Verbindungs-URL muss folgendes Format aufweisen. Bei Eigenschaften wird die Groß-/Kleinschreibung nicht berücksichtigt.
jdbc:databricks://<server-hostname>:<port>/<schema>;[property1]=[value];[property2]=[value];...
Alternativ können Sie die Einstellungen mithilfe der Klasse java.util.Properties
oder einer Kombination angeben:
String url = "jdbc:databricks://<server-hostname>:<port>/<schema>";
Properties properties = new java.util.Properties();
properties.put("<property1>", "<value1");
properties.put("<property2>", "<value2");
// ...
Connection conn = DriverManager.getConnection(url, properties);
String url = "jdbc:databricks://<server-hostname>:<port>/<schema>;[property1]=[value];[property2]=[value];";
Connection conn = DriverManager.getConnection(url, "token", "12345678901234667890abcdabcd");
Die Elemente der Verbindungs-URL werden in der folgenden Tabelle beschrieben. Weitere Informationen zu zusätzlichen Eigenschaften, einschließlich Authentifizierungseigenschaften, finden Sie in den folgenden Abschnitten. Bei URL-Elementen und -Eigenschaften wird die Groß-/Kleinschreibung nicht beachtet.
URL-Element oder -Eigenschaft | Beschreibung |
---|---|
<server-hostname> |
Der Wert des Hostnamens des Servers der Azure Databricks-Computeressource. |
<port> |
Der Wert des Ports der Azure Databricks-Computeressource. Der Standardwert ist 443 . |
<schema> |
Der Name des Schemas. Die andere Möglichkeit besteht darin, die Eigenschaft ConnSchema zu verwenden. Weitere Informationen finden Sie unter Verbindungseigenschaften. |
httpPath |
Der Wert des HTTP-Pfads der Azure Databricks-Computeressource. Der Connector bildet die HTTP-Adresse, mit der eine Verbindung hergestellt werden soll, indem der Wert httpPath an den Host und Port angefügt wird, die in der Verbindungs-URL angegeben sind. Um beispielsweise eine Verbindung mit der HTTP-Adresse http://localhost:10002/cliservice herzustellen, verwenden Sie die folgende Verbindungs-URL: jdbc:databricks://localhost:10002;httpPath=cliservice |
So rufen Sie die JDBC-Verbindungs-URL für einen Azure Databricks Cluster ab:
- Melden Sie sich bei Ihrem Azure Databricks-Arbeitsbereich an.
- Wählen Sie in der Randleiste Compute und dann den Namen des Zielclusters aus.
- Erweitern Sie auf der Registerkarte Konfiguration die Option Erweiterte Optionen.
- Klicken Sie auf die Registerkarte JDBC/ODBC.
- Kopieren Sie die JDBC-URL, um sie als JDBC-Verbindungs-URL zu verwenden, oder erstellen Sie die URL aus Werten in den Feldern Hostname des Servers, Port und HTTP-Pfad.
So rufen Sie die JDBC-Verbindungs-URL für ein Databricks SQL Warehouse ab:
- Melden Sie sich bei Ihrem Azure Databricks-Arbeitsbereich an.
- Wählen Sie in der Randleiste SQL Warehousesund dann den Namen des Ziel-Warehouse aus.
- Wählen Sie die Registerkarte Verbindungsdetails aus.
- Kopieren Sie die JDBC-URL, um sie als JDBC-Verbindungs-URL zu verwenden, oder erstellen Sie die URL aus Werten in den Feldern Hostname des Servers, Port und HTTP-Pfad.
Authentifizieren des Treibers
Sie können die JDBC-Treiberverbindung mithilfe eines der folgenden Authentifizierungsmechanismen authentifizieren:
- OAuth U2M-Authentifizierung (User-to-Machine) (Empfohlen)
- OAuth-M2M-Authentifizierung
- Persönliches Zugriffstoken für Azure Databricks
OAuth U2M-Authentifizierung (User-to-Machine)
Der JDBC-Treiber unterstützt die OAuth U2M (User-to-Machine)-Authentifizierung für die Echtzeit-Anmeldung von Menschen und die Zustimmung zur Authentifizierung des Databricks-Benutzerkontos. Dies wird auch als browserbasierte OAuth-Authentifizierung bezeichnet.
Azure Databricks hat die OAuth-Client-ID databricks-sql-jdbc
für Kunden erstellt. Dies ist auch die Standard-OAuth-Client-ID, die im JDBC-Treiber verwendet wird. Um die OAuth U2M-Authentifizierung zu konfigurieren, fügen Sie einfach die folgenden Eigenschaften zu Ihrer bestehenden JDBC-Verbindungs-URL oder Ihrem java.util.Properties
-Objekt hinzu:
Eigenschaft | Wert |
---|---|
AuthMech |
11 |
Auth_Flow |
2 |
OAuth-Computer-zu-Computer-Authentifizierung (M2M)
Der JDBC-Treiber unterstützt die OAuth-M2M-Authentifizierung (Machine-to-Machine) mit einem Azure Databricks-Dienstprinzipal. Dies wird auch OAuth 2.0-Authentifizierung mit Clientanmeldeinformationen genannt. Weitere Informationen finden Sie unter Authentifizierung des Zugriffs bei Azure Databricks mit einem Dienstprinzipal unter Verwendung von OAuth (OAuth M2M).
So konfigurieren Sie die OAuth M2M- oder OAuth 2.0-Authentifizierung mit Clientanmeldeinformationen:
Erstellen Sie einen durch Microsoft Entra ID verwalteten Dienstprinzipal, und weisen Sie ihn dann Azure Databricks-Konten und -Arbeitsbereichen zu. Details hierzu finden Sie unter Verwalten von Dienstprinzipalen.
Wichtig
Der Databricks JDBC-Treiber (OSS) unterstützt Azure Databricks-OAuth-Schlüssel für die M2M OAuth-Authentifizierung oder die Authentifizierung mit OAuth 2.0-Clientanmeldeinformationen. Geheime Schlüssel der Microsoft Entra ID werden nicht unterstützt.
Erstellen Sie ein Azure Databricks-OAuth-Geheimnis für den Dienstprinzipal. Weitere Informationen dazu finden Sie unter Manuelles Generieren und Verwenden von Zugriffstoken für die OAuth-M2M-Authentifizierung.
Gewähren Sie dem Dienstprinzipal Zugriff auf Ihren Cluster oder Ihr Warehouse. Weitere Informationen finden Sie unter Compute-Berechtigungen und Verwalten eines SQL-Warehouse.
Fügen Sie die folgenden Eigenschaften zu Ihrer vorhandenen JDBC-Verbindungs-URL oder zu Ihrem java.util.Properties
-Objekt hinzu:
Eigenschaft | Wert |
---|---|
AuthMech |
11 |
Auth_Flow |
1 |
OAuth2ClientID |
Wert der Anwendungs (Client)-ID des Dienstprinzipals |
OAuth2Secret |
Azure Databricks-OAuth-Geheimnis des Dienstprinzipals (Microsoft Entra ID-Geheimnisse werden für die OAuth-M2M-Authentifizierung oder die Authentifizierung mit OAuth 2.0-Clientanmeldeinformationen nicht unterstützt.) |
Persönliches Zugriffstoken für Azure Databricks
Fügen Sie zur Authentifizierung Ihrer Treiberverbindung mithilfe eines persönlichen Azure Databricks Zugriffstokens die folgenden Eigenschaften zu Ihrer URL der JDBC-Verbindungs-URL oder zum java.util.Properties
-Objekt hinzu:
Eigenschaft | Wert |
---|---|
AuthMech |
3 |
user |
Der Wert token als Zeichenfolge. |
PWD oder password |
Der Wert Ihres persönlichen Azure Databricks-Zugriffstokens als Zeichenfolge. |
Verbindungseigenschaften
Die folgenden zusätzlichen Verbindungseigenschaften werden vom JDBC-Treiber unterstützt. Bei Eigenschaften wird die Groß-/Kleinschreibung nicht berücksichtigt.
Eigenschaft | Standardwert | Beschreibung |
---|---|---|
AuthMech |
Erforderlich | Der Authentifizierungsmechanismus, bei dem 3 den Mechanismus angibt, ist ein persönliches Azure Databricks-Zugriffstoken, und 11 gibt an, dass der Mechanismus OAuth 2.0-Token ist. Für jeden Mechanismus sind zusätzliche Eigenschaften erforderlich. Weitere Informationen finden Sie unter Authentifizieren des Treibers. |
Auth_Flow |
0 |
Der OAuth2-Authentifizierungsfluss für die Treiberverbindung. Diese Eigenschaft ist erforderlich, wenn AuthMech 11 ist. |
SSL |
1 |
Gibt an, ob der Connector über einen SSL-fähigen Socket mit dem Spark-Server kommuniziert. |
ConnCatalog oder catalog |
SPARK |
Der Name des zu verwendenden Standardkatalogs. |
ConnSchema oder schema |
default |
Der Name des zu verwendenden Standardschemas. Sie können dies entweder angeben, indem Sie <schema> in der URL durch den Namen des zu verwendenden Schemas ersetzen oder indem Sie die Eigenschaft ConnSchema auf den Namen des zu verwendenden Schemas setzen. |
ProxyAuth |
0 |
Bei Festlegung auf 1 verwendet der Treiber den Benutzernamen und das Kennwort für die Proxyauthentifizierung, dargestellt durch ProxyUID und ProxyPwd . |
ProxyHost |
null |
Eine Zeichenfolge, die den Namen des Proxyhosts darstellt, der verwendet werden soll, wenn UseProxy auch auf 1 festgelegt ist. |
ProxyPort |
null |
Ein Integer, der die Zahl des Proxyports darstellt, der verwendet werden soll, wenn UseProxy auch auf 1 festgelegt ist. |
ProxyUID |
null |
Eine Zeichenfolge, die den Benutzernamen darstellt, der für die Proxyauthentifizierung verwendet werden soll, wenn ProxyAuth und UseProxy auch auf 1 festgelegt sind. |
ProxyPwd |
null |
Eine Zeichenfolge, die das Kennwort darstellt, der für die Proxyauthentifizierung verwendet werden soll, wenn ProxyAuth und UseProxy auch auf 1 festgelegt sind. |
UseProxy |
0 |
Bei Festlegung auf 1 verwendet der Treiber die bereitgestellten Proxyeinstellungen (z. B. ProxyAuth , ProxyHost , ProxyPort , ProxyPwd und ProxyUID ). |
UseSystemProxy |
0 |
Bei Festlegung auf 1 verwendet der Treiber die Proxyeinstellungen, die auf Systemebene festgelegt wurden. Wenn in der Verbindungs-URL zusätzliche Proxy-Eigenschaften festgelegt sind, haben diese zusätzlichen Proxy-Eigenschaften Vorrang vor denen, die auf der Systemebene festgelegt wurden. |
UseCFProxy |
0 |
Bei Festlegung auf 1 , verwendet der Treiber die Cloud-Abrufproxyeinstellungen, falls diese bereitgestellt werden, andernfalls den regulären Proxy. |
CFProxyAuth |
0 |
Bei Festlegung auf 1 verwendet der Treiber den Benutzernamen und das Kennwort für die Proxyauthentifizierung, dargestellt durch CFProxyUID und CFProxyPwd . |
CFProxyHost |
null |
Eine Zeichenfolge, die den Namen des Proxyhosts darstellt, der verwendet werden soll, wenn UseCFProxy auch auf 1 festgelegt ist. |
CFProxyPort |
null |
Ein Integer, der die Zahl des Proxyports darstellt, der verwendet werden soll, wenn UseCFProxy auch auf 1 festgelegt ist. |
CFProxyUID |
null |
Eine Zeichenfolge, die den Benutzernamen darstellt, der für die Proxyauthentifizierung verwendet werden soll, wenn CFProxyAuth und UseCFProxy auch auf 1 festgelegt sind. |
CFProxyPwd |
null |
Eine Zeichenfolge, die das Kennwort darstellt, der für die Proxyauthentifizierung verwendet werden soll, wenn CFProxyAuth und UseCFProxy auch auf 1 festgelegt sind. |
AsyncExecPollInterval |
200 |
Die Zeit in Millisekunden zwischen jeder Abfrage des asynchronen Abfrageausführungsstatus. Asynchron bezieht sich auf die Tatsache, dass der RPC-Aufruf, der zur Ausführung einer Abfrage gegen Spark verwendet wird, asynchron ist. Das bedeutet nicht, dass asynchrone Vorgänge von JDBC unterstützt werden. |
UserAgentEntry |
browser |
Der User-Agent-Eintrag, der in die HTTP-Anforderung aufgenommen werden soll. Der Wert weist folgendes Format auf: [ProductName]/[ProductVersion] [Comment] |
UseThriftClient |
0 |
Ob der JDBC-Treiber den Thrift-Client für die Verbindung zu einem Allzweck-Cluster verwenden soll. Der Standardwert funktioniert für SQL-Warehouses. |
SQL-Konfigurationseigenschaften
Die folgenden SQL-Konfigurationseigenschaften werden vom JDBC-Treiber unterstützt. Diese werden auch unter Konfigurationsparameter beschrieben. Bei Eigenschaften wird die Groß-/Kleinschreibung nicht berücksichtigt.
Eigenschaft | Standardwert | Beschreibung |
---|---|---|
ansi_mode |
TRUE |
Ob das strikte ANSI-SQL-Verhalten für bestimmte Funktionen und Casting-Regeln aktiviert werden soll. |
enable_photo |
TRUE |
Ob die vektorisierte Photon-Abfrage-Engine aktiviert werden soll. |
legacy_time_parser_policy |
EXCEPTION |
Die Methoden zum Parsen und Formatieren von Daten und Zeitstempeln. Gültige Werte sind EXCEPTION , LEGACY und CORRECTED . |
max_file_partition_bytes |
128m |
Die maximale Anzahl von Bytes, die beim Lesen von Dateien in eine einzelne Partition gepackt werden sollen. Als Einstellung kann ein beliebiger Integer verwendet werden und optional eine Maßeinheit wie b (Bytes), k oder kb (1024 Bytes). |
read_only_external_metastore |
false |
Steuert, ob ein externer Metastore schreibgeschützt behandelt wird |
statement_timeout |
172800 |
Legen Sie ein SQL-Anweisungstimeout in Sekunden zwischen 0 und 172800 fest. |
timezone |
UTC |
Legen Sie die lokale Zeitzone fest. Regions-IDs in der Form area/city , z. B. Amerika/Los_Angeles oder Zonenoffsets im Format (+|-)HH, (+|-)HH:mm oder (+|-)HH:mm:ss, z. B. -08, +01:00 oder -13:33:33. Außerdem wird UTC als Alias für +00:00 unterstützt |
use_cached_result |
true |
Ob Databricks SQL Caches und Ergebnisse nach Möglichkeit wiederverwendet. |
Protokolleigenschaften
Die folgenden Protokollierungseigenschaften werden vom JDBC-Treiber unterstützt. Bei Eigenschaften wird die Groß-/Kleinschreibung nicht berücksichtigt.
Eigenschaft | Standardwert | Beschreibung |
---|---|---|
LogLevel |
OFF |
Die Protokollierungsebene. Hierbei handelt es sich um einen Wert von 0 bis 6: – 0: Deaktiviert die gesamte Protokollierung. – 1: Aktiviert die Protokollierung auf der Ebene FATAL. Hierbei werden sehr schwere Fehlerereignisse protokolliert, die dazu führen, dass der Connector abgebrochen wird. – 2: Aktiviert die Protokollierung auf der Ebene ERROR. Damit werden Fehlerereignisse protokolliert, die es dem Connector ermöglichen könnten, weiterzulaufen. – 3: Aktiviert die Protokollierung auf der Ebene WARNING. Damit werden Ereignisse protokolliert, die zu einem Fehler führen können, wenn keine Maßnahmen ergriffen werden. – 4: Aktiviert die Protokollierung auf der Ebene INFO. Damit werden allgemeine Informationen, die den Fortschritt des Connectors beschreiben, protokolliert. – 5: Aktiviert die Protokollierung auf der Ebene DEBUG. Diese protokolliert detaillierte Informationen, die für die Fehlersuche im Connector nützlich sind. – 6: Aktiviert die Protokollierung auf der Ebene TRACE. Damit werden alle Aktivitäten des Connectors protokolliert. Verwenden Sie diese Eigenschaft, um die Protokollierung im Connector zu aktivieren oder zu deaktivieren und um die Menge der in den Protokolldateien enthaltenen Details festzulegen. |
LogPath |
Um den Standardpfad für Protokolle zu ermitteln, verwendet der Treiber den Für diese Systemeigenschaften festgelegten Wert in dieser Prioritätsreihenfolge: 1. user.dir 2. java.io.tmpdir 3. das aktuelle Verzeichnis mit anderen Worten . |
Der vollständige Pfad zu dem Ordner, in dem der Connector Protokolldateien speichert, wenn die Protokollierung aktiviert ist, als Zeichenfolge. Um sicherzustellen, dass die Verbindungs-URL mit allen SHAPES-Anwendungen kompatibel ist, escapeen Sie den umgekehrten Schrägstrich (\ ) in Ihrem Dateipfad, indem Sie einen anderen umgekehrten Schrägstrich eingeben.Wenn der LogPath Wert ungültig ist, sendet der Connector die protokollierten Informationen an den Standardausgabedatenstrom (System.out). |
LogFileSize |
Kein Maximum | Die maximal zulässige Protokolldateigröße, die in MB angegeben ist |
LogFileCount |
Kein Maximum | Die maximale Anzahl zulässiger Protokolldateien |
Aktivierung und Konfiguration der Protokollierung
Der ELEMENTTREIBER UNTERSTÜTZT die Simple Logging Facade for Java (SLF4J) und java.util.logging (JUL) -Frameworks. Der Treiber verwendet standardmäßig das JUL-Protokollierungsframework.
So aktivieren und konfigurieren Sie die Protokollierung für den BROWSERtreiber:
Aktivieren Sie das Protokollierungsframework, das Sie verwenden möchten:
- Legen Sie für die SLF4J-Protokollierung die Systemeigenschaft
-Dcom.databricks.jdbc.loggerImpl=SLF4JLOGGER
fest, und stellen Sie die SLF4J-Bindungsimplementierung (kompatibel mit SLF4J, Version 2.0.13 und höher) und entsprechende Konfigurationsdatei im Klassenpfad bereit. - Legen Sie für die JUL-Protokollierung die Systemeigenschaft
-Dcom.databricks.jdbc.loggerImpl=JDKLOGGER
fest. Dies ist die Standardeinstellung.
- Legen Sie für die SLF4J-Protokollierung die Systemeigenschaft
Legen Sie die
LogLevel
Eigenschaft für die Verbindungszeichenfolge auf die gewünschte Informationsebene fest, die in Protokolldateien eingeschlossen werden soll.Legen Sie die
LogPath
Eigenschaft für die Verbindungszeichenfolge auf den vollständigen Pfad zum Ordner fest, in dem Protokolldateien gespeichert werden sollen.Die folgende Verbindungs-URL ermöglicht beispielsweise die Protokollierungsebene 6 und speichert die Protokolldateien im Ordner "C:temp":
jdbc: databricks://localhost:11000;LogLevel=6;LogPath=C:\\temp
Starten Sie Die DATEI -ANWENDUNG NEU, und stellen Sie die Verbindung mit dem Server wieder her, um die Einstellungen anzuwenden.
Beispiel: Ausführen einer Abfrage mithilfe des JDBC-Treibers
Das folgende Beispiel zeigt, wie Sie den JDBC-Treiber verwenden, um eine Databricks-SQL-Abfrage über eine Azure Databricks Computeressource auszuführen.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Properties;
public class DatabricksJDBCExample {
public static void main(String[] args) {
Class.forName("com.databricks.client.jdbc.Driver");
// Set JDBC URL properties
String jdbcUrl = "jdbc:databricks://dbc-a1b2345c-d6e7.cloud.databricks.com:443";
Properties connectionProperties = new Properties();
connectionProperties.put("httpPath", "sql/protocolv1/o/123456780012345/0123-123450-z000pi22");
connectionProperties.put("ssl", "1");
// Set authentication properties (personal access token)
connectionProperties.put("AuthMech", "3");
connectionProperties.put("user", "token");
connectionProperties.put("password", "12345678901234667890abcdabcd");
// Set logging properties
connectionProperties.put("logPath", "logs/myapplication.log");
// Establish connection and execute query
try (Connection connection = DriverManager.getConnection(jdbcUrl, connectionProperties);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM samples.nyctaxi.trips")) {
// Get metadata and column names
ResultSetMetaData metaData = resultSet.getMetaData();
String[] columns = new String[metaData.getColumnCount()];
for (int i = 0; i < columns.length; i++) {
columns[i] = metaData.getColumnName(i + 1);
}
// Process and print the result set
while (resultSet.next()) {
System.out.print("Row " + resultSet.getRow() + "=[");
for (int i = 0; i < columns.length; i++) {
if (i != 0) {
System.out.print(", ");
}
System.out.print(columns[i] + "='" + resultSet.getObject(i + 1) + "'");
}
System.out.println("]");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}