Skip to content

Commit 72e5508

Browse files
authored
fix(bqjdbc): lazily instantiate Statement in BigQueryDatabaseMetaData (#12752)
[b/501419313](https://b.corp.google.com/501419313) - Remove pre-emptive BigQueryStatement object creation in BigQueryDatabaseMetData constructor. - Make DataBaseMetadata field in BigQueryConnection class static.
1 parent 050187d commit 72e5508

File tree

3 files changed

+40
-35
lines changed

3 files changed

+40
-35
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
drivers/**
2-
target-it/**
2+
target-it/**
3+
*logs/**

java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
138138
Long connectionPoolSize;
139139
Long listenerPoolSize;
140140
String partnerToken;
141+
private static DatabaseMetaData databaseMetaData;
141142

142143
BigQueryConnection(String url) throws IOException {
143144
this(url, DataSource.fromUrl(url));
@@ -771,7 +772,10 @@ public void rollback() throws SQLException {
771772

772773
@Override
773774
public DatabaseMetaData getMetaData() throws SQLException {
774-
return new BigQueryDatabaseMetaData(this);
775+
if (databaseMetaData == null) {
776+
databaseMetaData = new BigQueryDatabaseMetaData(this);
777+
}
778+
return databaseMetaData;
775779
}
776780

777781
@Override

java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import java.sql.ResultSet;
5252
import java.sql.RowIdLifetime;
5353
import java.sql.SQLException;
54+
import java.sql.Statement;
5455
import java.sql.Types;
5556
import java.util.ArrayList;
5657
import java.util.Arrays;
@@ -138,7 +139,6 @@ class BigQueryDatabaseMetaData implements DatabaseMetaData {
138139

139140
String URL;
140141
BigQueryConnection connection;
141-
private final BigQueryStatement statement;
142142
private final BigQuery bigquery;
143143
private final int metadataFetchThreadCount;
144144
private static final AtomicReference<String> parsedDriverVersion = new AtomicReference<>(null);
@@ -150,7 +150,6 @@ class BigQueryDatabaseMetaData implements DatabaseMetaData {
150150
BigQueryDatabaseMetaData(BigQueryConnection connection) throws SQLException {
151151
this.URL = connection.getConnectionUrl();
152152
this.connection = connection;
153-
this.statement = connection.createStatement().unwrap(BigQueryStatement.class);
154153
this.bigquery = connection.getBigQuery();
155154
this.metadataFetchThreadCount = connection.getMetadataFetchThreadCount();
156155
loadDriverVersionProperties();
@@ -944,8 +943,7 @@ public ResultSet getProcedures(
944943

945944
Thread fetcherThread = new Thread(procedureFetcher, "getProcedures-fetcher-" + catalog);
946945
BigQueryJsonResultSet resultSet =
947-
BigQueryJsonResultSet.of(
948-
resultSchema, -1, queue, this.statement, new Thread[] {fetcherThread});
946+
BigQueryJsonResultSet.of(resultSchema, -1, queue, null, new Thread[] {fetcherThread});
949947

950948
fetcherThread.start();
951949
LOG.info("Started background thread for getProcedures");
@@ -1207,8 +1205,7 @@ public ResultSet getProcedureColumns(
12071205
Thread fetcherThread =
12081206
new Thread(procedureColumnFetcher, "getProcedureColumns-fetcher-" + catalog);
12091207
BigQueryJsonResultSet resultSet =
1210-
BigQueryJsonResultSet.of(
1211-
resultSchema, -1, queue, this.statement, new Thread[] {fetcherThread});
1208+
BigQueryJsonResultSet.of(resultSchema, -1, queue, null, new Thread[] {fetcherThread});
12121209

12131210
fetcherThread.start();
12141211
LOG.info("Started background thread for getProcedureColumns for catalog: " + catalog);
@@ -1869,8 +1866,7 @@ public ResultSet getTables(
18691866

18701867
Thread fetcherThread = new Thread(tableFetcher, "getTables-fetcher-" + effectiveCatalog);
18711868
BigQueryJsonResultSet resultSet =
1872-
BigQueryJsonResultSet.of(
1873-
resultSchema, -1, queue, this.statement, new Thread[] {fetcherThread});
1869+
BigQueryJsonResultSet.of(resultSchema, -1, queue, null, new Thread[] {fetcherThread});
18741870

18751871
fetcherThread.start();
18761872
LOG.info("Started background thread for getTables");
@@ -2010,8 +2006,7 @@ public ResultSet getCatalogs() {
20102006
populateQueue(catalogRows, queue, schemaFields);
20112007
signalEndOfData(queue, schemaFields);
20122008

2013-
return BigQueryJsonResultSet.of(
2014-
catalogsSchema, catalogRows.size(), queue, this.statement, new Thread[0]);
2009+
return BigQueryJsonResultSet.of(catalogsSchema, catalogRows.size(), queue, null, new Thread[0]);
20152010
}
20162011

20172012
Schema defineGetCatalogsSchema() {
@@ -2043,7 +2038,7 @@ public ResultSet getTableTypes() {
20432038
signalEndOfData(queue, tableTypesSchema.getFields());
20442039

20452040
return BigQueryJsonResultSet.of(
2046-
tableTypesSchema, tableTypeRows.size(), queue, this.statement, new Thread[0]);
2041+
tableTypesSchema, tableTypeRows.size(), queue, null, new Thread[0]);
20472042
}
20482043

20492044
static Schema defineGetTableTypesSchema() {
@@ -2495,7 +2490,7 @@ public ResultSet getColumnPrivileges(
24952490
final BlockingQueue<BigQueryFieldValueListWrapper> queue = new LinkedBlockingQueue<>(1);
24962491
signalEndOfData(queue, resultSchemaFields);
24972492

2498-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
2493+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
24992494
}
25002495

25012496
Schema defineGetColumnPrivilegesSchema() {
@@ -2523,7 +2518,7 @@ public ResultSet getTablePrivileges(
25232518
final BlockingQueue<BigQueryFieldValueListWrapper> queue = new LinkedBlockingQueue<>(1);
25242519
signalEndOfData(queue, resultSchemaFields);
25252520

2526-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
2521+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
25272522
}
25282523

25292524
Schema defineGetTablePrivilegesSchema() {
@@ -2545,7 +2540,7 @@ public ResultSet getBestRowIdentifier(
25452540
final BlockingQueue<BigQueryFieldValueListWrapper> queue = new LinkedBlockingQueue<>(1);
25462541
signalEndOfData(queue, resultSchemaFields);
25472542

2548-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
2543+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
25492544
}
25502545

25512546
Schema defineGetBestRowIdentifierSchema() {
@@ -2595,7 +2590,7 @@ public ResultSet getVersionColumns(String catalog, String schema, String table)
25952590
final BlockingQueue<BigQueryFieldValueListWrapper> queue = new LinkedBlockingQueue<>(1);
25962591
signalEndOfData(queue, resultSchemaFields);
25972592

2598-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
2593+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
25992594
}
26002595

26012596
Schema defineGetVersionColumnsSchema() {
@@ -2637,8 +2632,10 @@ Schema defineGetVersionColumnsSchema() {
26372632
public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException {
26382633
String sql = readSqlFromFile(GET_PRIMARY_KEYS_SQL);
26392634
try {
2635+
Statement stmt = this.connection.createStatement();
2636+
stmt.closeOnCompletion();
26402637
String formattedSql = replaceSqlParameters(sql, catalog, schema, table);
2641-
return this.statement.executeQuery(formattedSql);
2638+
return stmt.executeQuery(formattedSql);
26422639
} catch (SQLException e) {
26432640
throw new BigQueryJdbcException(e);
26442641
}
@@ -2649,8 +2646,10 @@ public ResultSet getImportedKeys(String catalog, String schema, String table)
26492646
throws SQLException {
26502647
String sql = readSqlFromFile(GET_IMPORTED_KEYS_SQL);
26512648
try {
2649+
Statement stmt = this.connection.createStatement();
2650+
stmt.closeOnCompletion();
26522651
String formattedSql = replaceSqlParameters(sql, catalog, schema, table);
2653-
return this.statement.executeQuery(formattedSql);
2652+
return stmt.executeQuery(formattedSql);
26542653
} catch (SQLException e) {
26552654
throw new BigQueryJdbcException(e);
26562655
}
@@ -2661,8 +2660,10 @@ public ResultSet getExportedKeys(String catalog, String schema, String table)
26612660
throws SQLException {
26622661
String sql = readSqlFromFile(GET_EXPORTED_KEYS_SQL);
26632662
try {
2663+
Statement stmt = this.connection.createStatement();
2664+
stmt.closeOnCompletion();
26642665
String formattedSql = replaceSqlParameters(sql, catalog, schema, table);
2665-
return this.statement.executeQuery(formattedSql);
2666+
return stmt.executeQuery(formattedSql);
26662667
} catch (SQLException e) {
26672668
throw new BigQueryJdbcException(e);
26682669
}
@@ -2679,6 +2680,8 @@ public ResultSet getCrossReference(
26792680
throws SQLException {
26802681
String sql = readSqlFromFile(GET_CROSS_REFERENCE_SQL);
26812682
try {
2683+
Statement stmt = this.connection.createStatement();
2684+
stmt.closeOnCompletion();
26822685
String formattedSql =
26832686
replaceSqlParameters(
26842687
sql,
@@ -2688,7 +2691,7 @@ public ResultSet getCrossReference(
26882691
foreignCatalog,
26892692
foreignSchema,
26902693
foreignTable);
2691-
return this.statement.executeQuery(formattedSql);
2694+
return stmt.executeQuery(formattedSql);
26922695
} catch (SQLException e) {
26932696
throw new BigQueryJdbcException(e);
26942697
}
@@ -2710,7 +2713,7 @@ public ResultSet getTypeInfo() {
27102713
populateQueue(typeInfoRows, queue, schemaFields);
27112714
signalEndOfData(queue, schemaFields);
27122715
return BigQueryJsonResultSet.of(
2713-
typeInfoSchema, typeInfoRows.size(), queue, this.statement, new Thread[0]);
2716+
typeInfoSchema, typeInfoRows.size(), queue, null, new Thread[0]);
27142717
}
27152718

27162719
Schema defineGetTypeInfoSchema() {
@@ -3172,7 +3175,7 @@ public ResultSet getIndexInfo(
31723175
final BlockingQueue<BigQueryFieldValueListWrapper> queue = new LinkedBlockingQueue<>(1);
31733176
signalEndOfData(queue, resultSchemaFields);
31743177

3175-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
3178+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
31763179
}
31773180

31783181
Schema defineGetIndexInfoSchema() {
@@ -3303,7 +3306,7 @@ public ResultSet getUDTs(
33033306
final BlockingQueue<BigQueryFieldValueListWrapper> queue = new LinkedBlockingQueue<>(1);
33043307
signalEndOfData(queue, resultSchemaFields);
33053308

3306-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
3309+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
33073310
}
33083311

33093312
Schema defineGetUDTsSchema() {
@@ -3377,7 +3380,7 @@ public ResultSet getSuperTables(String catalog, String schemaPattern, String tab
33773380

33783381
signalEndOfData(queue, resultSchemaFields);
33793382

3380-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
3383+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
33813384
}
33823385

33833386
Schema defineGetSuperTablesSchema() {
@@ -3414,7 +3417,7 @@ public ResultSet getSuperTypes(String catalog, String schemaPattern, String type
34143417

34153418
signalEndOfData(queue, resultSchemaFields);
34163419

3417-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
3420+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
34183421
}
34193422

34203423
Schema defineGetSuperTypesSchema() {
@@ -3460,7 +3463,7 @@ public ResultSet getAttributes(
34603463
final BlockingQueue<BigQueryFieldValueListWrapper> queue = new LinkedBlockingQueue<>(1);
34613464
signalEndOfData(queue, resultSchemaFields);
34623465

3463-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
3466+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
34643467
}
34653468

34663469
Schema defineGetAttributesSchema() {
@@ -3705,8 +3708,7 @@ public ResultSet getSchemas(String catalog, String schemaPattern) {
37053708

37063709
Thread fetcherThread = new Thread(schemaFetcher, "getSchemas-fetcher-" + catalog);
37073710
BigQueryJsonResultSet resultSet =
3708-
BigQueryJsonResultSet.of(
3709-
resultSchema, -1, queue, this.statement, new Thread[] {fetcherThread});
3711+
BigQueryJsonResultSet.of(resultSchema, -1, queue, null, new Thread[] {fetcherThread});
37103712

37113713
fetcherThread.start();
37123714
LOG.info("Started background thread for getSchemas");
@@ -3825,7 +3827,7 @@ public ResultSet getClientInfoProperties() {
38253827
signalEndOfData(queue, resultSchemaFields);
38263828
}
38273829
return BigQueryJsonResultSet.of(
3828-
resultSchema, collectedResults.size(), queue, this.statement, new Thread[0]);
3830+
resultSchema, collectedResults.size(), queue, null, new Thread[0]);
38293831
}
38303832

38313833
Schema defineGetClientInfoPropertiesSchema() {
@@ -4000,8 +4002,7 @@ public ResultSet getFunctions(String catalog, String schemaPattern, String funct
40004002

40014003
Thread fetcherThread = new Thread(functionFetcher, "getFunctions-fetcher-" + catalog);
40024004
BigQueryJsonResultSet resultSet =
4003-
BigQueryJsonResultSet.of(
4004-
resultSchema, -1, queue, this.statement, new Thread[] {fetcherThread});
4005+
BigQueryJsonResultSet.of(resultSchema, -1, queue, null, new Thread[] {fetcherThread});
40054006

40064007
fetcherThread.start();
40074008
LOG.info("Started background thread for getFunctions");
@@ -4255,8 +4256,7 @@ public ResultSet getFunctionColumns(
42554256
Thread fetcherThread =
42564257
new Thread(functionColumnFetcher, "getFunctionColumns-fetcher-" + catalog);
42574258
BigQueryJsonResultSet resultSet =
4258-
BigQueryJsonResultSet.of(
4259-
resultSchema, -1, queue, this.statement, new Thread[] {fetcherThread});
4259+
BigQueryJsonResultSet.of(resultSchema, -1, queue, null, new Thread[] {fetcherThread});
42604260

42614261
fetcherThread.start();
42624262
LOG.info("Started background thread for getFunctionColumns for catalog: " + catalog);
@@ -4663,7 +4663,7 @@ public ResultSet getPseudoColumns(
46634663
final BlockingQueue<BigQueryFieldValueListWrapper> queue = new LinkedBlockingQueue<>(1);
46644664
signalEndOfData(queue, resultSchemaFields);
46654665

4666-
return BigQueryJsonResultSet.of(resultSchema, 0, queue, this.statement, null);
4666+
return BigQueryJsonResultSet.of(resultSchema, 0, queue, null, null);
46674667
}
46684668

46694669
Schema defineGetPseudoColumnsSchema() {

0 commit comments

Comments
 (0)