Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions jdbc/src/main/java/tech/ydb/jdbc/YdbTracer.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package tech.ydb.jdbc;


import tech.ydb.jdbc.impl.YdbTracerImpl;


Expand All @@ -10,12 +9,20 @@
* @author Aleksandr Gorshenin
*/
public interface YdbTracer {
static void clear() {
YdbTracerImpl.clear();
interface Storage {
YdbTracer get();

default void clear() {

}
}

static YdbTracer current() {
return YdbTracerImpl.current();
return YdbTracerImpl.ENABLED.get();
}

static void clear() {
YdbTracerImpl.ENABLED.clear();
}

void setId(String id);
Expand Down
4 changes: 4 additions & 0 deletions jdbc/src/main/java/tech/ydb/jdbc/common/TypeDescription.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ private TypeDescription(Type type,
this.isNull = type.getKind() == Type.Kind.NULL || type.getKind() == Type.Kind.VOID;
}

public String toYqlLiteral() {
return type.toString() + (optional ? "?" : "");
}

public boolean isNull() {
return isNull;
}
Expand Down
2 changes: 0 additions & 2 deletions jdbc/src/main/java/tech/ydb/jdbc/context/BaseYdbExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,11 @@ public abstract class BaseYdbExecutor implements YdbExecutor {
private final boolean useStreamResultSet;

private final AtomicReference<YdbQueryResult> currResult;
protected final boolean traceEnabled;
protected final String prefixPragma;
protected final YdbTypes types;

public BaseYdbExecutor(YdbContext ctx) {
this.retryCtx = ctx.getRetryCtx();
this.traceEnabled = ctx.isTxTracerEnabled();
this.sessionTimeout = ctx.getOperationProperties().getSessionTimeout();
this.useStreamResultSet = ctx.getOperationProperties().getUseStreamResultSets();
this.tableClient = ctx.getTableClient();
Expand Down
31 changes: 19 additions & 12 deletions jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import tech.ydb.jdbc.YdbTracer;
import tech.ydb.jdbc.common.YdbTypes;
import tech.ydb.jdbc.exception.ExceptionFactory;
import tech.ydb.jdbc.impl.YdbTracerImpl;
import tech.ydb.jdbc.impl.YdbTracerNone;
import tech.ydb.jdbc.query.QueryType;
import tech.ydb.jdbc.query.YdbPreparedQuery;
Expand Down Expand Up @@ -90,6 +91,8 @@ public class YdbContext implements AutoCloseable {
private final boolean autoResizeSessionPool;
private final AtomicInteger connectionsCount = new AtomicInteger();

private YdbTracer.Storage tracerStorage;

private YdbContext(
YdbConfig config,
YdbOperationProperties operationProperties,
Expand Down Expand Up @@ -137,12 +140,18 @@ private YdbContext(
prefixPath = transport.getDatabase();
prefixPragma = "";
}

this.tracerStorage = config.isTxTracedEnabled() ? YdbTracerImpl.ENABLED : YdbTracerNone.DISABLED;
}

public YdbTypes getTypes() {
return types;
}

public void setTracerStorage(YdbTracer.Storage storage) {
this.tracerStorage = storage;
}

/**
* Grpc Transport for other API YDB server clients
*
Expand All @@ -152,6 +161,10 @@ public GrpcTransport getGrpcTransport() {
return grpcTransport;
}

public YdbTracer getTracer() {
return tracerStorage.get();
}

private String joined(String path1, String path2) {
return path1.endsWith("/") || path2.startsWith("/") ? path1 + path2 : path1 + "/" + path2;
}
Expand Down Expand Up @@ -188,14 +201,6 @@ public String getUsername() {
return config.getUsername();
}

public YdbTracer getTracer() {
return config.isTxTracedEnabled() ? YdbTracer.current() : YdbTracerNone.current();
}

public boolean isTxTracerEnabled() {
return config.isTxTracedEnabled();
}

public YdbExecutor createExecutor() throws SQLException {
if (config.isUseQueryService()) {
return new QueryServiceExecutor(this, operationProps.getTransactionLevel(), operationProps.isAutoCommit());
Expand Down Expand Up @@ -264,6 +269,8 @@ public void register() {
}

public void deregister() {
tracerStorage.clear();

int actual = connectionsCount.decrementAndGet();
int maxSize = tableClient.sessionPoolStats().getMaxSize();
if (autoResizeSessionPool && maxSize > SESSION_POOL_RESIZE_STEP) {
Expand Down Expand Up @@ -409,9 +416,9 @@ public YdbPreparedQuery findOrPrepareParams(YdbQuery query, YdbPrepareMode mode)
String tablePath = joined(getPrefixPath(), query.getYqlBatcher().getTableName());
TableDescription description = tableDescribeCache.getIfPresent(tablePath);
if (description == null) {
YdbTracer tracer = getTracer();
YdbTracer tracer = tracerStorage.get();
tracer.trace("--> describe table");
tracer.query(tablePath);
tracer.trace(tablePath);

DescribeTableSettings settings = withDefaultTimeout(new DescribeTableSettings());
Result<TableDescription> result = retryCtx.supplyResult(
Expand Down Expand Up @@ -449,9 +456,9 @@ public YdbPreparedQuery findOrPrepareParams(YdbQuery query, YdbPrepareMode mode)
Map<String, Type> queryTypes = queryParamsCache.getIfPresent(query.getOriginQuery());
if (queryTypes == null) {
String yql = prefixPragma + query.getPreparedYql();
YdbTracer tracer = getTracer();
YdbTracer tracer = tracerStorage.get();
tracer.trace("--> prepare data query");
tracer.query(yql);
tracer.trace(yql);

PrepareDataQuerySettings settings = withDefaultTimeout(new PrepareDataQuerySettings());
Result<DataQuery> result = retryCtx.supplyResult(
Expand Down
43 changes: 23 additions & 20 deletions jdbc/src/main/java/tech/ydb/jdbc/impl/YdbConnectionImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import tech.ydb.jdbc.YdbPrepareMode;
import tech.ydb.jdbc.YdbPreparedStatement;
import tech.ydb.jdbc.YdbStatement;
import tech.ydb.jdbc.YdbTracer;
import tech.ydb.jdbc.context.YdbContext;
import tech.ydb.jdbc.context.YdbExecutor;
import tech.ydb.jdbc.context.YdbValidator;
Expand Down Expand Up @@ -108,7 +107,6 @@ public void close() throws SQLException {
validator.clearWarnings();
executor.close();
ctx.deregister();
YdbTracer.clear();
}

@Override
Expand Down Expand Up @@ -218,32 +216,47 @@ public YdbStatement createStatement(int resultSetType, int resultSetConcurrency,
public YdbPreparedStatement prepareStatement(String origSql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException {
checkStatementParams(resultSetType, resultSetConcurrency, resultSetHoldability);
return prepareStatement(origSql, resultSetType, YdbPrepareMode.AUTO);
return prepareStatement(origSql, resultSetType, null, YdbPrepareMode.AUTO);
}

@Override
public YdbPreparedStatement prepareStatement(String sql, YdbPrepareMode mode) throws SQLException {
return prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, mode);
return prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, null, mode);
}

@Override
public YdbPreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
if (autoGeneratedKeys != Statement.NO_GENERATED_KEYS) {
throw new SQLFeatureNotSupportedException(YdbConst.AUTO_GENERATED_KEYS_UNSUPPORTED);
if (autoGeneratedKeys != Statement.RETURN_GENERATED_KEYS) {
return prepareStatement(sql);
}
return prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
return prepareStatement(sql, new String[]{"*"});
}

@Override
public YdbPreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
if (columnIndexes != null && columnIndexes.length == 0) {
return prepareStatement(sql);
}
throw new SQLFeatureNotSupportedException(YdbConst.AUTO_GENERATED_KEYS_UNSUPPORTED);
}

@Override
public YdbPreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
if (columnNames == null || columnNames.length == 0) {
return prepareStatement(sql);
}
return prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, columnNames, YdbPrepareMode.AUTO);
}

private YdbPreparedStatement prepareStatement(String sql, int resultSetType, YdbPrepareMode mode)
private YdbPreparedStatement prepareStatement(String sql, int type, String[] columnNames, YdbPrepareMode mode)
throws SQLException {

validator.clearWarnings();
ctx.getTracer().trace("prepare statement");
YdbQuery query = ctx.findOrParseYdbQuery(sql);
YdbPreparedQuery params = ctx.findOrPrepareParams(query, mode);
ctx.getTracer().trace("create prepared statement");
return new YdbPreparedStatementImpl(this, query, params, resultSetType);
return new YdbPreparedStatementImpl(this, query, params, type);
}

@Override
Expand Down Expand Up @@ -331,16 +344,6 @@ public CallableStatement prepareCall(String sql, int resultSetType, int resultSe
throw new SQLFeatureNotSupportedException(YdbConst.PREPARED_CALLS_UNSUPPORTED);
}

@Override
public YdbPreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
throw new SQLFeatureNotSupportedException(YdbConst.AUTO_GENERATED_KEYS_UNSUPPORTED);
}

@Override
public YdbPreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
throw new SQLFeatureNotSupportedException(YdbConst.AUTO_GENERATED_KEYS_UNSUPPORTED);
}

@Override
public Clob createClob() throws SQLException {
throw new SQLFeatureNotSupportedException(YdbConst.CLOB_UNSUPPORTED);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public int[] executeBatch() throws SQLException {
executeBulkUpsert(query, bulk.getTablePath(), bulk.getBatchedBulk());
} else {
for (Params prm: prepared.getBatchParams()) {
executeDataQuery(query, prepared.getQueryText(prm), prm);
executeDataQuery(query, prepared.getBatchText(prm), prm);
}
}
} finally {
Expand Down
37 changes: 19 additions & 18 deletions jdbc/src/main/java/tech/ydb/jdbc/impl/YdbTracerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,34 @@
*/
public class YdbTracerImpl implements YdbTracer {
private static final Logger LOGGER = Logger.getLogger(YdbTracer.class.getName());
private static final ThreadLocal<YdbTracerImpl> LOCAL = new ThreadLocal<>();
private static final ThreadLocal<YdbTracer> LOCAL = new ThreadLocal<>();
private static final AtomicLong ANONYMOUS_COUNTER = new AtomicLong(0);

public static final Storage ENABLED = new Storage() {
@Override
public YdbTracer get() {
YdbTracer tracer = LOCAL.get();
if (tracer == null) {
tracer = new YdbTracerImpl();
LOCAL.set(tracer);
}

return tracer;
}

@Override
public void clear() {
LOCAL.remove();
}
};

private final Date startDate = new Date();
private final long startedAt = System.currentTimeMillis();
private final List<Record> records = new ArrayList<>();

private String txID = null;
private String label = null;
private boolean isMarked = false;
private boolean isClosed = false;

private class Record {
private final long executedAt = System.currentTimeMillis();
Expand All @@ -39,20 +56,6 @@ private class Record {
}
}

public static void clear() {
LOCAL.remove();
}

public static YdbTracer current() {
YdbTracerImpl tracer = LOCAL.get();
if (tracer == null || tracer.isClosed) {
tracer = new YdbTracerImpl();
LOCAL.set(tracer);
}

return tracer;
}

@Override
public void trace(String message) {
records.add(new Record(message, false));
Expand Down Expand Up @@ -82,8 +85,6 @@ public void markToPrint(String label) {

@Override
public void close() {
isClosed = true;

LOCAL.remove();

final Level level = isMarked ? Level.INFO : Level.FINE;
Expand Down
7 changes: 2 additions & 5 deletions jdbc/src/main/java/tech/ydb/jdbc/impl/YdbTracerNone.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,8 @@
* @author Aleksandr Gorshenin
*/
public class YdbTracerNone implements YdbTracer {
private static final YdbTracerNone INSTANCE = new YdbTracerNone();

public static YdbTracer current() {
return INSTANCE;
}
private static final YdbTracer NONE = new YdbTracerNone();
public static final YdbTracer.Storage DISABLED = () -> NONE;

@Override
public void trace(String message) { }
Expand Down
3 changes: 2 additions & 1 deletion jdbc/src/main/java/tech/ydb/jdbc/query/ParamDescription.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package tech.ydb.jdbc.query;

import tech.ydb.jdbc.YdbConst;
import tech.ydb.jdbc.common.TypeDescription;

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

public ParamDescription(String name, TypeDescription type) {
this(name, name, type);
this(name, YdbConst.VARIABLE_PARAMETER_PREFIX + name, type);
}

public String name() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
*/
public interface YdbPreparedQuery {
String getQueryText(Params prms) throws SQLException;
String getBatchText(Params prms) throws SQLException;

void clearParameters();

Expand Down
Loading