1717import java .util .Map ;
1818import java .util .Properties ;
1919import java .util .concurrent .Executor ;
20+ import java .util .concurrent .atomic .AtomicReference ;
2021import java .util .logging .Level ;
2122import java .util .logging .Logger ;
2223
@@ -38,6 +39,7 @@ public class YdbConnectionImpl implements YdbConnection {
3839 private final YdbContext ctx ;
3940 private final YdbValidator validator ;
4041 private final YdbExecutor executor ;
42+ private final AtomicReference <YdbStatement > currState = new AtomicReference <>();
4143
4244 public YdbConnectionImpl (YdbContext context ) throws SQLException {
4345 this .ctx = context ;
@@ -83,18 +85,35 @@ public void setAutoCommit(boolean autoCommit) throws SQLException {
8385 executor .setAutoCommit (autoCommit );
8486 }
8587
88+ private <T extends YdbStatement > T updateStatement (T statement ) throws SQLException {
89+ Statement prev = currState .getAndSet (statement );
90+ if (prev != null ) {
91+ prev .close ();
92+ }
93+ return statement ;
94+ }
95+
96+ private void waitStatementReady () throws SQLException {
97+ YdbStatement curr = currState .get ();
98+ if (curr != null ) {
99+ curr .waitReady ();
100+ }
101+ }
102+
86103 @ Override
87104 public boolean getAutoCommit () throws SQLException {
88105 return executor .isAutoCommit ();
89106 }
90107
91108 @ Override
92109 public void commit () throws SQLException {
110+ waitStatementReady ();
93111 executor .commit (ctx , validator );
94112 }
95113
96114 @ Override
97115 public void rollback () throws SQLException {
116+ waitStatementReady ();
98117 executor .rollback (ctx , validator );
99118 }
100119
@@ -167,6 +186,8 @@ public SQLWarning getWarnings() throws SQLException {
167186 @ Override
168187 public void clearWarnings () throws SQLException {
169188 executor .ensureOpened ();
189+
190+ waitStatementReady ();
170191 validator .clearWarnings ();
171192 }
172193
@@ -210,7 +231,7 @@ public YdbStatement createStatement(int resultSetType, int resultSetConcurrency,
210231 int resultSetHoldability ) throws SQLException {
211232 executor .ensureOpened ();
212233 checkStatementParams (resultSetType , resultSetConcurrency , resultSetHoldability );
213- return new YdbStatementImpl (this , resultSetType );
234+ return updateStatement ( new YdbStatementImpl (this , resultSetType ) );
214235 }
215236
216237 @ Override
@@ -242,7 +263,7 @@ private YdbPreparedStatement prepareStatement(String sql, int resultSetType, Ydb
242263 YdbQuery query = ctx .findOrParseYdbQuery (sql );
243264
244265 YdbPreparedQuery params = ctx .findOrPrepareParams (query , mode );
245- return new YdbPreparedStatementImpl (this , query , params , resultSetType );
266+ return updateStatement ( new YdbPreparedStatementImpl (this , query , params , resultSetType ) );
246267 }
247268
248269 @ Override
@@ -287,7 +308,8 @@ public int getNetworkTimeout() throws SQLException {
287308 }
288309
289310 @ Override
290- public String getYdbTxId () {
311+ public String getYdbTxId () throws SQLException {
312+ waitStatementReady ();
291313 return executor .txID ();
292314 }
293315
0 commit comments