56380
|
1 |
/*
|
|
2 |
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
4 |
*
|
|
5 |
* This code is free software; you can redistribute it and/or modify it
|
|
6 |
* under the terms of the GNU General Public License version 2 only, as
|
|
7 |
* published by the Free Software Foundation. Oracle designates this
|
|
8 |
* particular file as subject to the "Classpath" exception as provided
|
|
9 |
* by Oracle in the LICENSE file that accompanied this code.
|
|
10 |
*
|
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that
|
|
15 |
* accompanied this code).
|
|
16 |
*
|
|
17 |
* You should have received a copy of the GNU General Public License version
|
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20 |
*
|
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
22 |
* or visit www.oracle.com if you need additional information or have any
|
|
23 |
* questions.
|
|
24 |
*/
|
|
25 |
package jdk.incubator.sql2;
|
|
26 |
|
|
27 |
import java.time.Duration;
|
|
28 |
import java.util.Map;
|
|
29 |
import java.util.concurrent.CompletionStage;
|
|
30 |
import java.util.function.BiConsumer;
|
|
31 |
import java.util.function.Consumer;
|
|
32 |
import java.util.function.Function;
|
|
33 |
|
|
34 |
/**
|
|
35 |
* A {@link Connection} is an abstraction of a connection to a SQL database and
|
|
36 |
* a group of {@link Operation}s to be executed by that SQL database. No method
|
|
37 |
* on {@link Connection} or any of its dependent objects ({@link RowOperation}
|
|
38 |
* etc) blocks with the exception of those few methods with "Wait" in their
|
|
39 |
* name. Any other method that might block must execute any potentially blocking
|
|
40 |
* action in a thread other than the calling thread.
|
|
41 |
*
|
|
42 |
* All methods inherited from OperationGroup throw IllegalStateException if the
|
|
43 |
* the connection is not active.
|
|
44 |
*/
|
|
45 |
public interface Connection extends AutoCloseable, OperationGroup<Object, Object> {
|
|
46 |
|
|
47 |
/**
|
|
48 |
* Identifies the operational state of a {@link Connection}.
|
|
49 |
*/
|
|
50 |
public enum Lifecycle {
|
|
51 |
/**
|
|
52 |
* unconnected. When a connect {@link Operation} is completed successfully
|
|
53 |
* -> {@link OPEN}. If {@link deactivate} is called ->
|
|
54 |
* {@link NEW_INACTIVE}. If {@link abort} is called -> {@link ABORTING}.
|
|
55 |
* No {@link Operation}s other than connect and close will be performed. A
|
|
56 |
* Connection in this state is both 'open' and 'active'.
|
|
57 |
*/
|
|
58 |
NEW,
|
|
59 |
/**
|
|
60 |
* Unconnected and inactive. Any queued connect or close {@link Operation}
|
|
61 |
* is performed. No work can be submitted. If the {@link activate} method is
|
|
62 |
* called -> {@link NEW}. If a connect {@link Operation} completes ->
|
|
63 |
* {@link INACTIVE}. If a close {@link Operation} is executed ->
|
|
64 |
* {@link CLOSING}. If {@link abort} is called -> {@link ABORTING}. A
|
|
65 |
* Connection in this state is 'open'.
|
|
66 |
*/
|
|
67 |
NEW_INACTIVE,
|
|
68 |
/**
|
|
69 |
* fully operational. Work is queued and performed. If {@link deactivate} is
|
|
70 |
* called -> {@link INACTIVE}. If a close {@link Operation} is executed
|
|
71 |
* -> {@link CLOSING}. If {@link abort} is called -> {@link ABORTING}.
|
|
72 |
* A Connection in this state is both 'open' and 'active'.
|
|
73 |
*/
|
|
74 |
OPEN,
|
|
75 |
/**
|
|
76 |
* Not available for new work. Queued work is performed. No work can be
|
|
77 |
* submitted. If the {@link activate} method is called -> {@link OPEN}.
|
|
78 |
* If a close {@link Operation} is executed -> {@link CLOSING}. If
|
|
79 |
* {@link abort} is called -> {@link ABORTING}. A {@link Connection} in
|
|
80 |
* this state is 'open'.
|
|
81 |
*/
|
|
82 |
INACTIVE,
|
|
83 |
/**
|
|
84 |
* Work in progress is completed but no additional work is started or
|
|
85 |
* queued. Attempting to queue work throws {@link IllegalStateException}.
|
|
86 |
* When the currently executing {@link Operation}s are completed ->
|
|
87 |
* {@link CLOSED}. All other queued Operations are completed exceptionally
|
|
88 |
* with SqlSkippedException. A Connection in this state is 'closed'.
|
|
89 |
*/
|
|
90 |
CLOSING,
|
|
91 |
/**
|
|
92 |
* Work is neither queued nor performed. The currently executing
|
|
93 |
* {@link Operation}s, if any, are terminated, exceptionally if necessary.
|
|
94 |
* Any queued {@link Operation}s are terminated exceptionally with
|
|
95 |
* {@link SqlSkippedException}. Attempting to queue work throws
|
|
96 |
* {@link IllegalStateException}. When the queue is empty -<
|
|
97 |
* {@link CLOSED}. A Connection in this state is 'closed'.
|
|
98 |
*/
|
|
99 |
ABORTING,
|
|
100 |
/**
|
|
101 |
* Work is neither queued nor performed. Attempting to queue work throws
|
|
102 |
* {@link IllegalStateException}. A Connection in this state is 'closed'.
|
|
103 |
*/
|
|
104 |
CLOSED;
|
|
105 |
|
|
106 |
static {
|
|
107 |
NEW.init(true, true, NEW, NEW_INACTIVE, OPEN, ABORTING, CLOSING, CLOSED);
|
|
108 |
NEW_INACTIVE.init(true, false, NEW, NEW_INACTIVE, INACTIVE, ABORTING, CLOSING, CLOSED);
|
|
109 |
OPEN.init(true, true, OPEN, INACTIVE, OPEN, ABORTING, CLOSING, CLOSED);
|
|
110 |
INACTIVE.init(true, false, OPEN, INACTIVE, INACTIVE, ABORTING, INACTIVE, INACTIVE);
|
|
111 |
CLOSING.init(false, true, CLOSING, CLOSING, CLOSING, ABORTING, CLOSING, CLOSED);
|
|
112 |
ABORTING.init(false, true, ABORTING, ABORTING, ABORTING, ABORTING, ABORTING, CLOSED);
|
|
113 |
CLOSED.init(false, true, CLOSED, CLOSED, CLOSED, CLOSED, CLOSED, CLOSED);
|
|
114 |
}
|
|
115 |
|
|
116 |
private boolean isOpen;
|
|
117 |
private boolean isActive;
|
|
118 |
private Lifecycle onActivate;
|
|
119 |
private Lifecycle onDeactivate;
|
|
120 |
private Lifecycle onConnect;
|
|
121 |
private Lifecycle onAbort;
|
|
122 |
private Lifecycle onClose;
|
|
123 |
private Lifecycle onClosed;
|
|
124 |
|
|
125 |
private void init(boolean io, boolean ia, Lifecycle ac, Lifecycle da, Lifecycle cn, Lifecycle ab, Lifecycle cl, Lifecycle cd) {
|
|
126 |
isOpen = io;
|
|
127 |
isActive = ia;
|
|
128 |
onActivate = ac;
|
|
129 |
onDeactivate = da;
|
|
130 |
onConnect = cn;
|
|
131 |
onAbort = ab;
|
|
132 |
onClose = cl;
|
|
133 |
onClosed = cd;
|
|
134 |
}
|
|
135 |
public boolean isOpen() {
|
|
136 |
return isOpen;
|
|
137 |
}
|
|
138 |
|
|
139 |
public boolean isActive() {
|
|
140 |
return isActive;
|
|
141 |
}
|
|
142 |
|
|
143 |
public Lifecycle activate() {
|
|
144 |
return onActivate;
|
|
145 |
}
|
|
146 |
|
|
147 |
public Lifecycle deactivate() {
|
|
148 |
return onDeactivate;
|
|
149 |
}
|
|
150 |
|
|
151 |
public Lifecycle connect() {
|
|
152 |
return onConnect;
|
|
153 |
}
|
|
154 |
|
|
155 |
public Lifecycle abort() {
|
|
156 |
return onAbort;
|
|
157 |
}
|
|
158 |
|
|
159 |
public Lifecycle close() {
|
|
160 |
return onClose;
|
|
161 |
}
|
|
162 |
|
|
163 |
public Lifecycle closed() {
|
|
164 |
return onClosed;
|
|
165 |
}
|
|
166 |
|
|
167 |
}
|
|
168 |
|
|
169 |
/**
|
|
170 |
* Specifiers for how much effort to put into validating a {@link Connection}.
|
|
171 |
* The amount of effort put into checking should be non-decreasing from NONE
|
|
172 |
* (least effort) to COMPLETE (most effort). Exactly what is checked is
|
|
173 |
* implementation dependent. For example, a memory resident database driver
|
|
174 |
* might implement SOCKET and NETWORK to be the same as LOCAL. SERVER might
|
|
175 |
* verify that a database manager thread is running and COMPLETE might trigger
|
|
176 |
* the database manager thread to run a deadlock detection algorithm.
|
|
177 |
*/
|
|
178 |
public enum Validation {
|
|
179 |
/**
|
|
180 |
* isValid fails only if the {@link Connection} is closed.
|
|
181 |
*/
|
|
182 |
NONE,
|
|
183 |
/**
|
|
184 |
* {@link NONE} plus check local resources
|
|
185 |
*/
|
|
186 |
LOCAL,
|
|
187 |
/**
|
|
188 |
* {@link LOCAL} plus the server isn't obviously unreachable (dead socket)
|
|
189 |
*/
|
|
190 |
SOCKET,
|
|
191 |
/**
|
|
192 |
* {@link SOCKET} plus the network is intact (network PING)
|
|
193 |
*/
|
|
194 |
NETWORK,
|
|
195 |
/**
|
|
196 |
* {@link NETWORK} plus significant server processes are running
|
|
197 |
*/
|
|
198 |
SERVER,
|
|
199 |
/**
|
|
200 |
* everything that can be checked is working. At least {@link SERVER}.
|
|
201 |
*/
|
|
202 |
COMPLETE;
|
|
203 |
}
|
|
204 |
|
|
205 |
/**
|
|
206 |
* A Listener that is notified of changes in a Connection's lifecycle.
|
|
207 |
*/
|
|
208 |
public interface ConnectionLifecycleListener extends java.util.EventListener {
|
|
209 |
|
|
210 |
/**
|
|
211 |
* If this {@link java.util.EventListener} is registered with a
|
|
212 |
* {@link Connection} this method is called whenever that
|
|
213 |
* {@link Connection}'s lifecycle changes. Note that the lifecycle may have
|
|
214 |
* changed again by the time this method is called so the
|
|
215 |
* {@link Connection}'s current lifecycle may be different from the value of
|
|
216 |
* {@code current}.
|
|
217 |
*
|
|
218 |
* @param conn the {@link Connection}
|
|
219 |
* @param previous the previous value of the lifecycle
|
|
220 |
* @param current the new value of the lifecycle
|
|
221 |
*/
|
|
222 |
public void lifecycleEvent(Connection conn, Lifecycle previous, Lifecycle current);
|
|
223 |
}
|
|
224 |
|
|
225 |
/**
|
|
226 |
* A {@link Connection} builder. A {@link Connection} is initially in the
|
|
227 |
* {@link Connection.Lifecycle#NEW} lifecycle state. It transitions to the
|
|
228 |
* {@link Connection.Lifecycle#OPEN} lifecycle state when fully initialized or
|
|
229 |
* to {@link Connection.Lifecycle#CLOSED} if initialization fails.
|
|
230 |
*
|
|
231 |
*/
|
|
232 |
public interface Builder {
|
|
233 |
|
|
234 |
/**
|
|
235 |
* Specify a property and its value for the built {@link Connection}.
|
|
236 |
*
|
|
237 |
* @param p {@link ConnectionProperty} to set. Not {@code null}.
|
|
238 |
* @param v value for the property
|
|
239 |
* @return this {@link Builder}
|
|
240 |
* @throws IllegalArgumentException if {@code p.validate(v)} does not return
|
|
241 |
* true or if this method has already been called with the property
|
|
242 |
* {@code p}.
|
|
243 |
*/
|
|
244 |
public Builder property(ConnectionProperty p, Object v);
|
|
245 |
|
|
246 |
/**
|
|
247 |
* Return a {@link Connection} with the attributes specified. Note that the
|
|
248 |
* {@link Connection} may not be connected to a server. Call one of the
|
|
249 |
* {@link connect} convenience methods to connect the {@link Connection} to
|
|
250 |
* a server. The lifecycle of the new {@link Connection} is {@link Lifecycle#NEW}.
|
|
251 |
*
|
|
252 |
* @return a {@link Connection}
|
|
253 |
* @throws IllegalStateException if this method has already been called.
|
|
254 |
*/
|
|
255 |
public Connection build();
|
|
256 |
}
|
|
257 |
|
|
258 |
/**
|
|
259 |
* Returns an {@link Operation} that connects this {@link Connection} to a
|
|
260 |
* server. If the Operation completes successfully and the lifecycle is
|
|
261 |
* {@link Lifecycle#NEW} -> {@link Lifecycle#OPEN}. If lifecycle is
|
|
262 |
* {@link Lifecycle#NEW_INACTIVE} -> {@link Lifecycle#INACTIVE}. If the
|
|
263 |
* {@link Operation} completes exceptionally the lifecycle ->
|
|
264 |
* {@link Lifecycle#CLOSED}. The lifecycle must be {@link Lifecycle#NEW} or
|
|
265 |
* {@link Lifecycle#NEW_INACTIVE} when the {@link Operation} is executed.
|
|
266 |
* Otherwise the {@link Operation} will complete exceptionally with
|
|
267 |
* {@link SqlException}.
|
|
268 |
*
|
|
269 |
* Note: It is highly recommended to use the {@link connect()} convenience
|
|
270 |
* method or to use {@link DataSource#getConnection} which itself calls
|
|
271 |
* {@link connect()}. Unless there is a specific need, do not call this method
|
|
272 |
* directly.
|
|
273 |
*
|
|
274 |
* This method exists partially to clearly explain that while creating a
|
|
275 |
* {@link Connection} is non-blocking, the act of connecting to the server may
|
|
276 |
* block and so is executed asynchronously. We could write a bunch of text
|
|
277 |
* saying this but defining this method is more explicit. Given the
|
|
278 |
* {@link connect()} convenience methods there's probably not much reason to
|
|
279 |
* use this method, but on the other hand, who knows, so here it is.
|
|
280 |
*
|
|
281 |
* @return an {@link Operation} that connects this {@link Connection} to a
|
|
282 |
* server.
|
|
283 |
* @throws IllegalStateException if this {@link Connection} is in a lifecycle
|
|
284 |
* state other than {@link Lifecycle#NEW}.
|
|
285 |
*/
|
|
286 |
public Operation<Void> connectOperation();
|
|
287 |
|
|
288 |
/**
|
|
289 |
* Convenience method that supports the fluent style of the builder needed by
|
|
290 |
* try with resources.
|
|
291 |
*
|
|
292 |
* Note: A {@link Connection} is an {@link OperationGroup} and so has some
|
|
293 |
* advanced features that most users do not need. Management of these features
|
|
294 |
* is encapsulated in this method and the corresponding {@link close()}
|
|
295 |
* convenience method. The vast majority of users should just use these
|
|
296 |
* methods and not worry about the advanced features. The convenience methods
|
|
297 |
* do the right thing for the overwhelming majority of use cases. A tiny
|
|
298 |
* number of users might want to take advantage of the advanced features that
|
|
299 |
* {@link OperationGroup} brings to {@link Connection} and so would call
|
|
300 |
* {@link connectOperation} directly.
|
|
301 |
*
|
|
302 |
* @return this Connection
|
|
303 |
* @throws IllegalStateException if this {@link Connection} is in a lifecycle
|
|
304 |
* state other than {@link Lifecycle#NEW}.
|
|
305 |
*/
|
|
306 |
public default Connection connect() {
|
|
307 |
this.submitHoldingForMoreMembers();
|
|
308 |
this.connectOperation()
|
|
309 |
.submit();
|
|
310 |
return this;
|
|
311 |
}
|
|
312 |
|
|
313 |
/**
|
|
314 |
* Convenience method that supports the fluent style of the builder needed by
|
|
315 |
* try with resources.
|
|
316 |
*
|
|
317 |
* @param onError an Exception handler that is called if the connect
|
|
318 |
* {@link Operation} completes exceptionally.
|
|
319 |
* @return this {@link Connection}
|
|
320 |
* @throws IllegalStateException if this {@link Connection} is in a lifecycle
|
|
321 |
* state other than {@link Lifecycle#NEW}.
|
|
322 |
*/
|
|
323 |
public default Connection connect(Consumer<Throwable> onError) {
|
|
324 |
this.submitHoldingForMoreMembers();
|
|
325 |
this.connectOperation()
|
|
326 |
.submit()
|
|
327 |
.getCompletionStage()
|
|
328 |
.exceptionally(t -> { onError.accept(t); return null; } );
|
|
329 |
return this;
|
|
330 |
}
|
|
331 |
|
|
332 |
/**
|
|
333 |
* Returns an {@link Operation} that verifies that the resources are available
|
|
334 |
* and operational. Successful completion of that {@link Operation} implies
|
|
335 |
* that at some point between the beginning and end of the {@link Operation}
|
|
336 |
* the Connection was working properly to the extent specified by {@code depth}.
|
|
337 |
* There is no guarantee that the {@link Connection} is still working after
|
|
338 |
* completion.
|
|
339 |
*
|
|
340 |
* @param depth how completely to check that resources are available and
|
|
341 |
* operational. Not {@code null}.
|
|
342 |
* @return an {@link Operation} that will validate this {@link Connection}
|
|
343 |
* @throws IllegalStateException if this Connection is not active
|
|
344 |
*/
|
|
345 |
public Operation<Void> validationOperation(Validation depth);
|
|
346 |
|
|
347 |
/**
|
|
348 |
* Convenience method to validate a {@link Connection}.
|
|
349 |
*
|
|
350 |
* @param depth how completely to check that resources are available and
|
|
351 |
* operational. Not {@code null}.
|
|
352 |
* @param minTime how long to wait. If 0, wait forever
|
|
353 |
* @param onError called if validation fails or times out. May be
|
|
354 |
* {@code null}.
|
|
355 |
* @return this {@link Connection}
|
|
356 |
* @throws IllegalArgumentException if {@code milliseconds} < 0 or
|
|
357 |
* {@code depth} is {@code null}.
|
|
358 |
* @throws IllegalStateException if this Connection is not active
|
|
359 |
*/
|
|
360 |
public default Connection validate(Validation depth,
|
|
361 |
Duration minTime,
|
|
362 |
Function<Throwable, Void> onError) {
|
|
363 |
this.validationOperation(depth)
|
|
364 |
.timeout(minTime)
|
|
365 |
.submit()
|
|
366 |
.getCompletionStage()
|
|
367 |
.exceptionally(onError);
|
|
368 |
return this;
|
|
369 |
}
|
|
370 |
|
|
371 |
/**
|
|
372 |
* Create an {@link Operation} to close this {@link Connection}. When the
|
|
373 |
* {@link Operation} is executed, if this {@link Connection} is open ->
|
|
374 |
* {@link Lifecycle#CLOSING}. If this {@link Connection} is closed executing
|
|
375 |
* the returned {@link Operation} is a no-op. When the queue is empty and all
|
|
376 |
* resources released -> {@link Lifecycle#CLOSED}.
|
|
377 |
*
|
|
378 |
* A close {@link Operation} is never skipped. Even when the
|
|
379 |
* {@link Connection} is dependent, the default, and an {@link Operation}
|
|
380 |
* completes exceptionally, a close {@link Operation} is still executed. If
|
|
381 |
* the {@link Connection} is parallel, a close {@link Operation} is not
|
|
382 |
* executed so long as there are other {@link Operation}s or the
|
|
383 |
* {@link Connection} is held; for more {@link Operation}s.
|
|
384 |
*
|
|
385 |
* Note: It is highly recommended to use try with resources or the
|
|
386 |
* {@link close()} convenience method. Unless there is a specific need, do not
|
|
387 |
* call this method directly.
|
|
388 |
*
|
|
389 |
* @return an {@link Operation} that will close this {@link Connection}.
|
|
390 |
* @throws IllegalStateException if the Connection is not active
|
|
391 |
*/
|
|
392 |
public Operation<Void> closeOperation();
|
|
393 |
|
|
394 |
/**
|
|
395 |
* Create and submit an {@link Operation} to close this {@link Connection}.
|
|
396 |
* Convenience method.
|
|
397 |
*
|
|
398 |
* Note: A {@link Connection} is an {@link OperationGroup} and so has some
|
|
399 |
* advanced features; that most users do not need. Management of these
|
|
400 |
* features is encapsulated in this method and the corresponding
|
|
401 |
* {@link connect()} convenience method. The vast majority of users should
|
|
402 |
* just use these methods and not worry about the advanced features. The
|
|
403 |
* convenience methods do the right thing for the overwhelming majority of use
|
|
404 |
* cases. A tiny number of user might want to take advantage of the advanced
|
|
405 |
* features that {@link OperationGroup} brings to {@link Connection} and so
|
|
406 |
* would call {@link closeOperation} directly.
|
|
407 |
*
|
|
408 |
* @throws IllegalStateException if the Connection is not active
|
|
409 |
*/
|
|
410 |
@Override
|
|
411 |
public default void close() {
|
|
412 |
this.closeOperation()
|
|
413 |
.submit();
|
|
414 |
this.releaseProhibitingMoreMembers();
|
|
415 |
}
|
|
416 |
|
|
417 |
/**
|
|
418 |
* Create a new {@link OperationGroup} for this {@link Connection}.
|
|
419 |
*
|
|
420 |
* @param <S> the result type of the member {@link Operation}s of the returned
|
|
421 |
* {@link OperationGroup}
|
|
422 |
* @param <T> the result type of the collected results of the member
|
|
423 |
* {@link Operation}s
|
|
424 |
* @return a new {@link OperationGroup}.
|
|
425 |
* @throws IllegalStateException if this Connection is not active
|
|
426 |
*/
|
|
427 |
public <S, T> OperationGroup<S, T> operationGroup();
|
|
428 |
|
|
429 |
/**
|
|
430 |
* Returns a new {@link Transaction} that can be used as an argument to a
|
|
431 |
* commit Operation.
|
|
432 |
*
|
|
433 |
* It is most likely an error to call this within an error handler, or any
|
|
434 |
* handler as it is very likely that when the handler is executed the next
|
|
435 |
* submitted endTransaction {@link Operation} will have been created with a different
|
|
436 |
* Transaction.
|
|
437 |
*
|
|
438 |
* ISSUE: Should this be moved to OperationGroup?
|
|
439 |
*
|
|
440 |
* @return a new {@link Transaction}. Not retained.
|
|
441 |
* @throws IllegalStateException if this Connection is not active
|
|
442 |
*/
|
|
443 |
public Transaction transaction();
|
|
444 |
|
|
445 |
/**
|
|
446 |
* Convenience method that submits an endTransaction {@link Operation}. This
|
|
447 |
* {@link Operation} will always attempt to commit the transaction.
|
|
448 |
* When this method is used there is no way to cause the transaction to be ended
|
|
449 |
* with a rollback.
|
|
450 |
*
|
|
451 |
* @return this {@link Connection}
|
|
452 |
*/
|
|
453 |
public default CompletionStage<TransactionOutcome> commit() {
|
|
454 |
return this.commitMaybeRollback(transaction());
|
|
455 |
}
|
|
456 |
|
|
457 |
/**
|
|
458 |
* Create an endTransaction {@link Operation}, set it to rollback only,
|
|
459 |
* and submit it. Convenience method.
|
|
460 |
*
|
|
461 |
* @return this {@link OperationGroup}
|
|
462 |
*/
|
|
463 |
public default CompletionStage<TransactionOutcome> rollback() {
|
|
464 |
Transaction t = transaction();
|
|
465 |
t.setRollbackOnly();
|
|
466 |
return this.endTransactionOperation(t).submit().getCompletionStage();
|
|
467 |
}
|
|
468 |
|
|
469 |
/**
|
|
470 |
* Register a listener that will be called whenever there is a change in the
|
|
471 |
* lifecycle of this {@link Connection}.If the listener is already registered
|
|
472 |
this is a no-op. ISSUE: Should lifecycleListener be a ConnectionProperty so that it is
|
|
473 |
always reestablished on Connection.activate?
|
|
474 |
*
|
|
475 |
* @param listener Not {@code null}.
|
|
476 |
* @return this Connection
|
|
477 |
* @throws IllegalStateException if this Connection is not active
|
|
478 |
*/
|
|
479 |
public Connection registerLifecycleListener(ConnectionLifecycleListener listener);
|
|
480 |
|
|
481 |
/**
|
|
482 |
* Removes a listener that was registered by calling
|
|
483 |
* registerLifecycleListener.Sometime after this method is called the listener
|
|
484 |
* will stop receiving lifecycle events. If the listener is not registered,
|
|
485 |
* this is a no-op.
|
|
486 |
*
|
|
487 |
* @param listener Not {@code null}.
|
|
488 |
* @return this Connection
|
|
489 |
* @throws IllegalStateException if this Connection is not active
|
|
490 |
*/
|
|
491 |
public Connection deregisterLifecycleListener(ConnectionLifecycleListener listener);
|
|
492 |
|
|
493 |
/**
|
|
494 |
* Return the current lifecycle of this {@link Connection}.
|
|
495 |
*
|
|
496 |
* @return the current lifecycle of this {@link Connection}.
|
|
497 |
*/
|
|
498 |
public Lifecycle getConnectionLifecycle();
|
|
499 |
|
|
500 |
/**
|
|
501 |
* Terminate this {@link Connection}. If lifecycle is
|
|
502 |
* {@link Lifecycle#NEW}, {@link Lifecycle#OPEN}, {@link Lifecycle#INACTIVE}
|
|
503 |
* or {@link Lifecycle#CLOSING} -> {@link Lifecycle#ABORTING} If lifecycle
|
|
504 |
* is {@link Lifecycle#ABORTING} or {@link Lifecycle#CLOSED} this is a no-op.
|
|
505 |
* If an {@link Operation} is currently executing, terminate it immediately.
|
|
506 |
* Remove all remaining {@link Operation}s from the queue. {@link Operation}s
|
|
507 |
* are not skipped. They are just removed from the queue.
|
|
508 |
*
|
|
509 |
* @return this {@link Connection}
|
|
510 |
*/
|
|
511 |
public Connection abort();
|
|
512 |
|
|
513 |
/**
|
|
514 |
* Return the set of properties configured on this {@link Connection}
|
|
515 |
* excepting any sensitive properties. Neither the key nor the value for
|
|
516 |
* sensitive properties are included in the result. Properties (other than
|
|
517 |
* sensitive properties) that have default values are included even when not
|
|
518 |
* explicitly set. Properties that have no default value and are not set
|
|
519 |
* explicitly are not included.
|
|
520 |
*
|
|
521 |
* @return a {@link Map} of property, value. Not modifiable. May be retained.
|
|
522 |
* Not {@code null}.
|
|
523 |
* @throws IllegalStateException if this Connection is not active
|
|
524 |
*/
|
|
525 |
public Map<ConnectionProperty, Object> getProperties();
|
|
526 |
|
|
527 |
/**
|
|
528 |
*
|
|
529 |
* @return a {@link ShardingKey.Builder} for this {@link Connection}
|
|
530 |
* @throws IllegalStateException if this Connection is not active
|
|
531 |
*/
|
|
532 |
public ShardingKey.Builder shardingKeyBuilder();
|
|
533 |
|
|
534 |
/**
|
|
535 |
* Make this {@link Connection} ready for use. A newly created
|
|
536 |
* {@link Connection} is active. Calling this method on a {@link Connection}
|
|
537 |
* that is active is a no-op. If the lifecycle is {@link Lifecycle#INACTIVE}
|
|
538 |
* -> {@link Lifecycle#OPEN}. If the lifecycle is
|
|
539 |
* {@link Lifecycle#NEW_INACTIVE} -> {@link Lifecycle#NEW}.
|
|
540 |
*
|
|
541 |
* @return this {@link Connection}
|
|
542 |
* @throws IllegalStateException if this {@link Connection} is closed.
|
|
543 |
*/
|
|
544 |
public Connection activate();
|
|
545 |
|
|
546 |
/**
|
|
547 |
* Makes this {@link Connection} inactive. After a call to this method
|
|
548 |
* previously submitted Operations will be executed normally. If the lifecycle
|
|
549 |
* is {@link Lifecycle#NEW} -> {@link Lifecycle#NEW_INACTIVE}. if the
|
|
550 |
* lifecycle is {@link Lifecycle#OPEN} -> {@link Lifecycle#INACTIVE}. If
|
|
551 |
* the lifecycle is {@link Lifecycle#INACTIVE} or
|
|
552 |
* {@link Lifecycle#NEW_INACTIVE} this method is a no-op. After calling this
|
|
553 |
* method or calling any method other than {@link deactivate}, {@link activate},
|
|
554 |
* {@link abort}, or {@link getConnectionLifecycle} will throw
|
|
555 |
* {@link IllegalStateException}. Local {@link Connection} state not created
|
|
556 |
* by {@link Connection.Builder} may not be preserved.
|
|
557 |
*
|
|
558 |
* Any implementation of a {@link Connection} pool is by default required to
|
|
559 |
* call {@code deactivate} when putting a {@link Connection} into a pool. The
|
|
560 |
* implementation is required to call {@code activate} when removing a
|
|
561 |
* {@link Connection} from a pool so the {@link Connection} can be used. An
|
|
562 |
* implementation of a {@link Connection} pool may have an optional mode where
|
|
563 |
* it does not call {@code deactivate}/{@code activate} as required above. The
|
|
564 |
* behavior of the pool and {@link Connection}s cached in the pool in such a
|
|
565 |
* mode is entirely implementation dependent.
|
|
566 |
*
|
|
567 |
* @return this {@link Connection}
|
|
568 |
* @throws IllegalStateException if this {@link Connection} is closed
|
|
569 |
*/
|
|
570 |
public Connection deactivate();
|
|
571 |
|
|
572 |
}
|