Skip to content

Commit 7d4cd74

Browse files
authored
Use non-batched queries for single executions (#119)
2 parents 62552e4 + f43dce1 commit 7d4cd74

18 files changed

+295
-136
lines changed

jdbc/src/main/java/tech/ydb/jdbc/YdbTracer.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package tech.ydb.jdbc;
22

3-
43
import tech.ydb.jdbc.impl.YdbTracerImpl;
54

65

@@ -10,12 +9,20 @@
109
* @author Aleksandr Gorshenin
1110
*/
1211
public interface YdbTracer {
13-
static void clear() {
14-
YdbTracerImpl.clear();
12+
interface Storage {
13+
YdbTracer get();
14+
15+
default void clear() {
16+
17+
}
1518
}
1619

1720
static YdbTracer current() {
18-
return YdbTracerImpl.current();
21+
return YdbTracerImpl.ENABLED.get();
22+
}
23+
24+
static void clear() {
25+
YdbTracerImpl.ENABLED.clear();
1926
}
2027

2128
void setId(String id);

jdbc/src/main/java/tech/ydb/jdbc/common/TypeDescription.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ private TypeDescription(Type type,
4242
this.isNull = type.getKind() == Type.Kind.NULL || type.getKind() == Type.Kind.VOID;
4343
}
4444

45+
public String toYqlLiteral() {
46+
return type.toString() + (optional ? "?" : "");
47+
}
48+
4549
public boolean isNull() {
4650
return isNull;
4751
}

jdbc/src/main/java/tech/ydb/jdbc/context/BaseYdbExecutor.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,11 @@ public abstract class BaseYdbExecutor implements YdbExecutor {
4040
private final boolean useStreamResultSet;
4141

4242
private final AtomicReference<YdbQueryResult> currResult;
43-
protected final boolean traceEnabled;
4443
protected final String prefixPragma;
4544
protected final YdbTypes types;
4645

4746
public BaseYdbExecutor(YdbContext ctx) {
4847
this.retryCtx = ctx.getRetryCtx();
49-
this.traceEnabled = ctx.isTxTracerEnabled();
5048
this.sessionTimeout = ctx.getOperationProperties().getSessionTimeout();
5149
this.useStreamResultSet = ctx.getOperationProperties().getUseStreamResultSets();
5250
this.tableClient = ctx.getTableClient();

jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import tech.ydb.jdbc.YdbTracer;
2828
import tech.ydb.jdbc.common.YdbTypes;
2929
import tech.ydb.jdbc.exception.ExceptionFactory;
30+
import tech.ydb.jdbc.impl.YdbTracerImpl;
3031
import tech.ydb.jdbc.impl.YdbTracerNone;
3132
import tech.ydb.jdbc.query.QueryType;
3233
import tech.ydb.jdbc.query.YdbPreparedQuery;
@@ -90,6 +91,8 @@ public class YdbContext implements AutoCloseable {
9091
private final boolean autoResizeSessionPool;
9192
private final AtomicInteger connectionsCount = new AtomicInteger();
9293

94+
private YdbTracer.Storage tracerStorage;
95+
9396
private YdbContext(
9497
YdbConfig config,
9598
YdbOperationProperties operationProperties,
@@ -137,12 +140,18 @@ private YdbContext(
137140
prefixPath = transport.getDatabase();
138141
prefixPragma = "";
139142
}
143+
144+
this.tracerStorage = config.isTxTracedEnabled() ? YdbTracerImpl.ENABLED : YdbTracerNone.DISABLED;
140145
}
141146

142147
public YdbTypes getTypes() {
143148
return types;
144149
}
145150

151+
public void setTracerStorage(YdbTracer.Storage storage) {
152+
this.tracerStorage = storage;
153+
}
154+
146155
/**
147156
* Grpc Transport for other API YDB server clients
148157
*
@@ -152,6 +161,10 @@ public GrpcTransport getGrpcTransport() {
152161
return grpcTransport;
153162
}
154163

164+
public YdbTracer getTracer() {
165+
return tracerStorage.get();
166+
}
167+
155168
private String joined(String path1, String path2) {
156169
return path1.endsWith("/") || path2.startsWith("/") ? path1 + path2 : path1 + "/" + path2;
157170
}
@@ -188,14 +201,6 @@ public String getUsername() {
188201
return config.getUsername();
189202
}
190203

191-
public YdbTracer getTracer() {
192-
return config.isTxTracedEnabled() ? YdbTracer.current() : YdbTracerNone.current();
193-
}
194-
195-
public boolean isTxTracerEnabled() {
196-
return config.isTxTracedEnabled();
197-
}
198-
199204
public YdbExecutor createExecutor() throws SQLException {
200205
if (config.isUseQueryService()) {
201206
return new QueryServiceExecutor(this, operationProps.getTransactionLevel(), operationProps.isAutoCommit());
@@ -264,6 +269,8 @@ public void register() {
264269
}
265270

266271
public void deregister() {
272+
tracerStorage.clear();
273+
267274
int actual = connectionsCount.decrementAndGet();
268275
int maxSize = tableClient.sessionPoolStats().getMaxSize();
269276
if (autoResizeSessionPool && maxSize > SESSION_POOL_RESIZE_STEP) {
@@ -409,9 +416,9 @@ public YdbPreparedQuery findOrPrepareParams(YdbQuery query, YdbPrepareMode mode)
409416
String tablePath = joined(getPrefixPath(), query.getYqlBatcher().getTableName());
410417
TableDescription description = tableDescribeCache.getIfPresent(tablePath);
411418
if (description == null) {
412-
YdbTracer tracer = getTracer();
419+
YdbTracer tracer = tracerStorage.get();
413420
tracer.trace("--> describe table");
414-
tracer.query(tablePath);
421+
tracer.trace(tablePath);
415422

416423
DescribeTableSettings settings = withDefaultTimeout(new DescribeTableSettings());
417424
Result<TableDescription> result = retryCtx.supplyResult(
@@ -449,9 +456,9 @@ public YdbPreparedQuery findOrPrepareParams(YdbQuery query, YdbPrepareMode mode)
449456
Map<String, Type> queryTypes = queryParamsCache.getIfPresent(query.getOriginQuery());
450457
if (queryTypes == null) {
451458
String yql = prefixPragma + query.getPreparedYql();
452-
YdbTracer tracer = getTracer();
459+
YdbTracer tracer = tracerStorage.get();
453460
tracer.trace("--> prepare data query");
454-
tracer.query(yql);
461+
tracer.trace(yql);
455462

456463
PrepareDataQuerySettings settings = withDefaultTimeout(new PrepareDataQuerySettings());
457464
Result<DataQuery> result = retryCtx.supplyResult(

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbConnectionImpl.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import tech.ydb.jdbc.YdbPrepareMode;
2727
import tech.ydb.jdbc.YdbPreparedStatement;
2828
import tech.ydb.jdbc.YdbStatement;
29-
import tech.ydb.jdbc.YdbTracer;
3029
import tech.ydb.jdbc.context.YdbContext;
3130
import tech.ydb.jdbc.context.YdbExecutor;
3231
import tech.ydb.jdbc.context.YdbValidator;
@@ -108,7 +107,6 @@ public void close() throws SQLException {
108107
validator.clearWarnings();
109108
executor.close();
110109
ctx.deregister();
111-
YdbTracer.clear();
112110
}
113111

114112
@Override
@@ -218,32 +216,47 @@ public YdbStatement createStatement(int resultSetType, int resultSetConcurrency,
218216
public YdbPreparedStatement prepareStatement(String origSql, int resultSetType, int resultSetConcurrency,
219217
int resultSetHoldability) throws SQLException {
220218
checkStatementParams(resultSetType, resultSetConcurrency, resultSetHoldability);
221-
return prepareStatement(origSql, resultSetType, YdbPrepareMode.AUTO);
219+
return prepareStatement(origSql, resultSetType, null, YdbPrepareMode.AUTO);
222220
}
223221

224222
@Override
225223
public YdbPreparedStatement prepareStatement(String sql, YdbPrepareMode mode) throws SQLException {
226-
return prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, mode);
224+
return prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, null, mode);
227225
}
228226

229227
@Override
230228
public YdbPreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
231-
if (autoGeneratedKeys != Statement.NO_GENERATED_KEYS) {
232-
throw new SQLFeatureNotSupportedException(YdbConst.AUTO_GENERATED_KEYS_UNSUPPORTED);
229+
if (autoGeneratedKeys != Statement.RETURN_GENERATED_KEYS) {
230+
return prepareStatement(sql);
233231
}
234-
return prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
235-
ResultSet.HOLD_CURSORS_OVER_COMMIT);
232+
return prepareStatement(sql, new String[]{"*"});
233+
}
234+
235+
@Override
236+
public YdbPreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
237+
if (columnIndexes != null && columnIndexes.length == 0) {
238+
return prepareStatement(sql);
239+
}
240+
throw new SQLFeatureNotSupportedException(YdbConst.AUTO_GENERATED_KEYS_UNSUPPORTED);
241+
}
242+
243+
@Override
244+
public YdbPreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
245+
if (columnNames == null || columnNames.length == 0) {
246+
return prepareStatement(sql);
247+
}
248+
return prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, columnNames, YdbPrepareMode.AUTO);
236249
}
237250

238-
private YdbPreparedStatement prepareStatement(String sql, int resultSetType, YdbPrepareMode mode)
251+
private YdbPreparedStatement prepareStatement(String sql, int type, String[] columnNames, YdbPrepareMode mode)
239252
throws SQLException {
240253

241254
validator.clearWarnings();
242255
ctx.getTracer().trace("prepare statement");
243256
YdbQuery query = ctx.findOrParseYdbQuery(sql);
244257
YdbPreparedQuery params = ctx.findOrPrepareParams(query, mode);
245258
ctx.getTracer().trace("create prepared statement");
246-
return new YdbPreparedStatementImpl(this, query, params, resultSetType);
259+
return new YdbPreparedStatementImpl(this, query, params, type);
247260
}
248261

249262
@Override
@@ -331,16 +344,6 @@ public CallableStatement prepareCall(String sql, int resultSetType, int resultSe
331344
throw new SQLFeatureNotSupportedException(YdbConst.PREPARED_CALLS_UNSUPPORTED);
332345
}
333346

334-
@Override
335-
public YdbPreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
336-
throw new SQLFeatureNotSupportedException(YdbConst.AUTO_GENERATED_KEYS_UNSUPPORTED);
337-
}
338-
339-
@Override
340-
public YdbPreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
341-
throw new SQLFeatureNotSupportedException(YdbConst.AUTO_GENERATED_KEYS_UNSUPPORTED);
342-
}
343-
344347
@Override
345348
public Clob createClob() throws SQLException {
346349
throw new SQLFeatureNotSupportedException(YdbConst.CLOB_UNSUPPORTED);

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbPreparedStatementImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public int[] executeBatch() throws SQLException {
9696
executeBulkUpsert(query, bulk.getTablePath(), bulk.getBatchedBulk());
9797
} else {
9898
for (Params prm: prepared.getBatchParams()) {
99-
executeDataQuery(query, prepared.getQueryText(prm), prm);
99+
executeDataQuery(query, prepared.getBatchText(prm), prm);
100100
}
101101
}
102102
} finally {

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbTracerImpl.java

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,34 @@
1616
*/
1717
public class YdbTracerImpl implements YdbTracer {
1818
private static final Logger LOGGER = Logger.getLogger(YdbTracer.class.getName());
19-
private static final ThreadLocal<YdbTracerImpl> LOCAL = new ThreadLocal<>();
19+
private static final ThreadLocal<YdbTracer> LOCAL = new ThreadLocal<>();
2020
private static final AtomicLong ANONYMOUS_COUNTER = new AtomicLong(0);
2121

22+
public static final Storage ENABLED = new Storage() {
23+
@Override
24+
public YdbTracer get() {
25+
YdbTracer tracer = LOCAL.get();
26+
if (tracer == null) {
27+
tracer = new YdbTracerImpl();
28+
LOCAL.set(tracer);
29+
}
30+
31+
return tracer;
32+
}
33+
34+
@Override
35+
public void clear() {
36+
LOCAL.remove();
37+
}
38+
};
39+
2240
private final Date startDate = new Date();
2341
private final long startedAt = System.currentTimeMillis();
2442
private final List<Record> records = new ArrayList<>();
2543

2644
private String txID = null;
2745
private String label = null;
2846
private boolean isMarked = false;
29-
private boolean isClosed = false;
3047

3148
private class Record {
3249
private final long executedAt = System.currentTimeMillis();
@@ -39,20 +56,6 @@ private class Record {
3956
}
4057
}
4158

42-
public static void clear() {
43-
LOCAL.remove();
44-
}
45-
46-
public static YdbTracer current() {
47-
YdbTracerImpl tracer = LOCAL.get();
48-
if (tracer == null || tracer.isClosed) {
49-
tracer = new YdbTracerImpl();
50-
LOCAL.set(tracer);
51-
}
52-
53-
return tracer;
54-
}
55-
5659
@Override
5760
public void trace(String message) {
5861
records.add(new Record(message, false));
@@ -82,8 +85,6 @@ public void markToPrint(String label) {
8285

8386
@Override
8487
public void close() {
85-
isClosed = true;
86-
8788
LOCAL.remove();
8889

8990
final Level level = isMarked ? Level.INFO : Level.FINE;

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbTracerNone.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,8 @@
77
* @author Aleksandr Gorshenin
88
*/
99
public class YdbTracerNone implements YdbTracer {
10-
private static final YdbTracerNone INSTANCE = new YdbTracerNone();
11-
12-
public static YdbTracer current() {
13-
return INSTANCE;
14-
}
10+
private static final YdbTracer NONE = new YdbTracerNone();
11+
public static final YdbTracer.Storage DISABLED = () -> NONE;
1512

1613
@Override
1714
public void trace(String message) { }

jdbc/src/main/java/tech/ydb/jdbc/query/ParamDescription.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package tech.ydb.jdbc.query;
22

3+
import tech.ydb.jdbc.YdbConst;
34
import tech.ydb.jdbc.common.TypeDescription;
45

56
/**
@@ -18,7 +19,7 @@ public ParamDescription(String name, String displayName, TypeDescription type) {
1819
}
1920

2021
public ParamDescription(String name, TypeDescription type) {
21-
this(name, name, type);
22+
this(name, YdbConst.VARIABLE_PARAMETER_PREFIX + name, type);
2223
}
2324

2425
public String name() {

jdbc/src/main/java/tech/ydb/jdbc/query/YdbPreparedQuery.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515
public interface YdbPreparedQuery {
1616
String getQueryText(Params prms) throws SQLException;
17+
String getBatchText(Params prms) throws SQLException;
1718

1819
void clearParameters();
1920

0 commit comments

Comments
 (0)