Skip to content

Commit c556376

Browse files
committed
fixed by index perf. added using ImmutableMap
1 parent f64b139 commit c556376

File tree

5 files changed

+75
-11
lines changed

5 files changed

+75
-11
lines changed

client-v2/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@
8282
<scope>compile</scope>
8383
</dependency>
8484

85+
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
86+
<dependency>
87+
<groupId>com.google.guava</groupId>
88+
<artifactId>guava</artifactId>
89+
<version>${guava.version}</version>
90+
</dependency>
8591

8692
<!-- Test Dependencies -->
8793
<dependency>

client-v2/src/main/java/com/clickhouse/client/api/metadata/TableSchema.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.clickhouse.client.api.metadata;
22

3-
import com.clickhouse.client.api.ClientException;
43
import com.clickhouse.data.ClickHouseColumn;
4+
import com.google.common.collect.ImmutableMap;
55

66
import java.util.ArrayList;
77
import java.util.Collections;
@@ -91,6 +91,15 @@ public ClickHouseColumn getColumnByName(String name) {
9191
return columns.get(nameToIndex(name));
9292
}
9393

94+
/**
95+
* Returns column by index. Index starts with 1.
96+
* @param colIndex - column index;
97+
* @return
98+
*/
99+
public ClickHouseColumn getColumnByIndex(int colIndex) {
100+
return columns.get(colIndex - 1);
101+
}
102+
94103
/**
95104
* Takes absolute index (starting from 0) and returns corresponding column.
96105
*
@@ -120,8 +129,13 @@ public int nameToColumnIndex(String name) {
120129
return nameToIndex(name) + 1;
121130
}
122131

132+
private ImmutableMap<String, Integer> colIndexes = null;
133+
123134
public int nameToIndex(String name) {
124-
Integer index = colIndex.get(name);
135+
if (colIndexes == null) {
136+
colIndexes = ImmutableMap.copyOf(colIndex);
137+
}
138+
Integer index = colIndexes.get(name);
125139
if (index == null) {
126140
throw new NoSuchColumnException("Result has no column with name '" + name + "'");
127141
}

jdbc-v2/src/main/java/com/clickhouse/jdbc/ResultSetImpl.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ public ResultSetMetaData getMetaData() throws SQLException {
431431

432432
@Override
433433
public Object getObject(int columnIndex) throws SQLException {
434-
return getObject(columnIndexToName(columnIndex));
434+
return getObject(columnIndex, JdbcUtils.convertToJavaClass(getSchema().getColumnByIndex(columnIndex).getDataType()));
435435
}
436436

437437
@Override
@@ -959,7 +959,7 @@ public Statement getStatement() throws SQLException {
959959

960960
@Override
961961
public Object getObject(int columnIndex, Map<String, Class<?>> map) throws SQLException {
962-
return getObject(columnIndexToName(columnIndex), map);
962+
return getObject(columnIndex, map.get(JdbcUtils.convertToSqlType(getSchema().getColumnByIndex(columnIndex).getDataType())));
963963
}
964964

965965
@Override
@@ -1493,7 +1493,24 @@ public void updateNClob(String columnLabel, Reader reader) throws SQLException {
14931493

14941494
@Override
14951495
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
1496-
return getObject(columnIndexToName(columnIndex), type);
1496+
checkClosed();
1497+
try {
1498+
if (reader.hasValue(columnIndex)) {
1499+
wasNull = false;
1500+
if (type == null) {//As a fallback, try to get the value as is
1501+
return reader.readValue(columnIndex);
1502+
}
1503+
1504+
return (T) JdbcUtils.convert(reader.readValue(columnIndex), type);
1505+
} else {
1506+
wasNull = true;
1507+
return null;
1508+
}
1509+
} catch (Exception e) {
1510+
throw ExceptionUtils.toSqlState(String.format("Method: getObject(\"%s\", %s) encountered an exception.",
1511+
reader.getSchema().columnIndexToName(columnIndex), type),
1512+
String.format("SQL: [%s]", parentStatement.getLastSql()), e);
1513+
}
14971514
}
14981515

14991516
@Override

performance/src/test/com/clickhouse/benchmark/clients/JDBCQuery.java

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.clickhouse.benchmark.clients;
22

3+
import com.clickhouse.data.ClickHouseColumn;
34
import org.openjdk.jmh.annotations.Benchmark;
45
import org.openjdk.jmh.infra.Blackhole;
56
import org.slf4j.Logger;
@@ -9,19 +10,22 @@
910
import java.sql.ResultSet;
1011
import java.sql.SQLException;
1112
import java.sql.Statement;
13+
import java.util.List;
14+
import java.util.stream.Collectors;
1215

1316
import static com.clickhouse.benchmark.BenchmarkRunner.getSelectQuery;
1417

1518
public class JDBCQuery extends BenchmarkBase {
1619
private static final Logger LOGGER = LoggerFactory.getLogger(JDBCQuery.class);
20+
1721
void selectData(Connection connection, DataState dataState, Blackhole blackhole) throws SQLException {
1822
String sql = getSelectQuery(dataState.tableNameFilled);
19-
try (Statement stmt = connection.createStatement()) {
20-
try (ResultSet rs = stmt.executeQuery(sql)) {
21-
while (rs.next()) {
22-
for (int i = 1; i <= dataState.dataSet.getSchema().getColumns().size(); i++) {
23-
blackhole.consume(rs.getObject(i));
24-
}
23+
try (Statement stmt = connection.createStatement();
24+
ResultSet rs = stmt.executeQuery(sql)) {
25+
int nCol = dataState.dataSet.getSchema().getColumns().size();
26+
while (rs.next()) {
27+
for (int i = 1; i <= nCol; i++) {
28+
blackhole.consume(rs.getObject(i));
2529
}
2630
}
2731
}
@@ -37,4 +41,26 @@ public void selectJDBCV2(DataState dataState, Blackhole blackhole) throws SQLExc
3741
selectData(jdbcV2, dataState, blackhole);
3842
}
3943

44+
void selectDataUseNames(Connection connection, DataState dataState, Blackhole blackhole) throws SQLException {
45+
String sql = getSelectQuery(dataState.tableNameFilled);
46+
List<String> columnNames = dataState.dataSet.getSchema().getColumns().stream().map(ClickHouseColumn::getColumnName).collect(Collectors.toList());
47+
try (Statement stmt = connection.createStatement();
48+
ResultSet rs = stmt.executeQuery(sql)) {
49+
while (rs.next()) {
50+
for (int i = 0; i < columnNames.size(); i++) {
51+
blackhole.consume(rs.getObject(columnNames.get(i)));
52+
}
53+
}
54+
}
55+
}
56+
57+
@Benchmark
58+
public void selectJDBCV1UseNames(DataState dataState, Blackhole blackhole) throws SQLException {
59+
selectDataUseNames(jdbcV1, dataState, blackhole);
60+
}
61+
62+
@Benchmark
63+
public void selectJDBCV2UseName(DataState dataState, Blackhole blackhole) throws SQLException {
64+
selectDataUseNames(jdbcV2, dataState, blackhole);
65+
}
4066
}

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
<versions-plugin.version>2.16.0</versions-plugin.version>
145145
<resource-plugin.version>3.3.1</resource-plugin.version>
146146
<jmh.version>1.37</jmh.version>
147+
<guava.version>33.4.6-jre</guava.version>
147148

148149
<minJdk>1.8</minJdk>
149150
<skipTests>false</skipTests>

0 commit comments

Comments
 (0)