-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathStatement.java
More file actions
670 lines (621 loc) · 27.5 KB
/
Copy pathStatement.java
File metadata and controls
670 lines (621 loc) · 27.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.sql;
/**
* Interface used for executing static SQL statements to retrieve query results.
* The resulting table rows are returned as {@code ResultSet}s. For any given
* {@code Statement} object, only one {@code ResultSet} can be opened at one
* time. A call to any of the execution methods of {@code Statement} will cause
* any previously created {@code ResultSet} object for that {@code Statement} to
* be closed implicitly.
* <p>
* To have multiple {@code ResultSet} objects opened concurrently, multiple
* {@code Statement} objects must be created and then executed.
* <p>
* To obtain such an executable statement one needs to invoke {@code
* Connection#createStatement}.
*
* @see ResultSet
* @see Connection#createStatement
*/
public interface Statement extends Wrapper {
/**
* Passing this constant to {@link #getMoreResults} implies that all {@code
* ResultSet} objects previously kept open should be closed.
*/
public static final int CLOSE_ALL_RESULTS = 3;
/**
* Passing this constant to {@link #getMoreResults} implies that the current
* {@code ResultSet} object should be closed.
*/
public static final int CLOSE_CURRENT_RESULT = 1;
/**
* Indicates that an error was encountered during execution of a batch
* statement.
*/
public static final int EXECUTE_FAILED = -3;
/**
* Passing this constant to <i>getMoreResults</i> implies that the current
* {@code ResultSet} object should not be closed.
*/
public static final int KEEP_CURRENT_RESULT = 2;
/**
* Indicates that generated keys should not be accessible for retrieval.
*/
public static final int NO_GENERATED_KEYS = 2;
/**
* Indicates that generated keys should be accessible for retrieval.
*/
public static final int RETURN_GENERATED_KEYS = 1;
/**
* Indicates that a batch statement was executed with a successful result,
* but a count of the number of rows it affected is unavailable.
*/
public static final int SUCCESS_NO_INFO = -2;
/**
* Adds a specified SQL command to the list of commands for this {@code
* Statement}.
* <p>
* The list of commands is executed by invoking the {@code executeBatch}
* method.
*
* @param sql
* the SQL command as a String. Typically an {@code INSERT} or
* {@code UPDATE} statement.
* @throws SQLException
* if an error occurs accessing the database or the database
* does not support batch updates.
*/
public void addBatch(String sql) throws SQLException;
/**
* Cancels this statement's execution if both the database and the JDBC
* driver support aborting an SQL statement in flight. This method can be
* used by one thread to stop a statement that is executed on another
* thread.
*
* @throws SQLException
* if an error occurs accessing the database.
*/
public void cancel() throws SQLException;
/**
* Clears the current list of SQL commands for this statement.
*
* @throws SQLException
* if an error occurs accessing the database or the database
* does not support batch updates.
*/
public void clearBatch() throws SQLException;
/**
* Clears all {@code SQLWarnings} from this statement.
*
* @throws SQLException
* if an error occurs accessing the database.
*/
public void clearWarnings() throws SQLException;
/**
* Releases this statement's database and JDBC driver resources.
* <p>
* Using this method to release these resources as soon as possible is
* strongly recommended.
* <p>
* One should not rely on the resources being automatically released when
* finalized during garbage collection. Doing so can result in unpredictable
* behavior for the application.
*
* @throws SQLException
* if an error occurs accessing the database.
*/
public void close() throws SQLException;
/**
* Executes a supplied SQL statement. This may return multiple {@code
* ResultSet}s.
* <p>
* Use the {@code getResultSet} or {@code getUpdateCount} methods to get the
* first result and {@code getMoreResults} to get any subsequent results.
*
* @param sql
* the SQL statement to execute
* @return {@code true} if the first result is a {@code ResultSet}, {@code
* false} if the first result is an update count or if there is no
* result.
* @throws SQLException
* if an error occurs accessing the database.
*/
public boolean execute(String sql) throws SQLException;
/**
* Executes a supplied SQL statement. This may return multiple {@code
* ResultSet}s. This method allows control of whether auto-generated Keys
* should be made available for retrieval, if the SQL statement is an
* {@code INSERT} statement.
* <p>
* Use the {@code getResultSet} or {@code getUpdateCount} methods to get the
* first result and {@code getMoreResults} to get any subsequent results.
*
* @param sql
* the SQL statement to execute.
* @param autoGeneratedKeys
* a flag indicating whether to make auto generated keys
* available for retrieval. This parameter must be one of {@code
* Statement.NO_GENERATED_KEYS} or {@code
* Statement.RETURN_GENERATED_KEYS}.
* @return {@code true} if results exists and the first result is a {@code
* ResultSet}, {@code false} if the first result is an update count
* or if there is no result.
* @throws SQLException
* if an error occurs accessing the database.
*/
public boolean execute(String sql, int autoGeneratedKeys)
throws SQLException;
/**
* Executes the supplied SQL statement. This may return multiple {@code
* ResultSet}s. This method allows retrieval of auto generated keys
* specified by the supplied array of column indexes, if the SQL statement
* is an {@code INSERT} statement.
* <p>
* Use the {@code getResultSet} or {@code getUpdateCount} methods to get the
* first result and {@code getMoreResults} to get any subsequent results.
*
* @param sql
* the SQL statement to execute.
* @param columnIndexes
* an array of indexes of the columns in the inserted row which
* should be made available for retrieval via the {@code
* getGeneratedKeys} method.
* @return {@code true} if the first result is a {@code ResultSet}, {@code
* false} if the first result is an update count or if there is no
* result.
* @throws SQLException
* if an error occurs accessing the database.
*/
public boolean execute(String sql, int[] columnIndexes) throws SQLException;
/**
* Executes the supplied SQL statement. This may return multiple {@code
* ResultSet}s. This method allows retrieval of auto generated keys
* specified by the supplied array of column indexes, if the SQL statement
* is an {@code INSERT} statement.
* <p>
* Use the {@code getResultSet} or {@code getUpdateCount} methods to get the
* first result and {@code getMoreResults} to get any subsequent results.
*
* @param sql
* the SQL statement to execute.
* @param columnNames
* an array of column names in the inserted row which should be
* made available for retrieval via the {@code getGeneratedKeys}
* method.
* @return {@code true} if the first result is a {@code ResultSet}, {@code
* false} if the first result is an update count or if there is no
* result
* @throws SQLException
* if an error occurs accessing the database.
*/
public boolean execute(String sql, String[] columnNames)
throws SQLException;
/**
* Submits a batch of SQL commands to the database. Returns an array of
* update counts, if all the commands execute successfully.
* <p>
* If one of the commands in the batch fails, this method can throw a
* {@link BatchUpdateException} and the JDBC driver may or may not process
* the remaining commands. The JDBC driver must behave consistently with the
* underlying database, following the "all or nothing" principle. If the
* driver continues processing, the array of results returned contains the
* same number of elements as there are commands in the batch, with a
* minimum of one of the elements having the {@code EXECUTE_FAILED} value.
*
* @return an array of update counts, with one entry for each command in the
* batch. The elements are ordered according to the order in which
* the commands were added to the batch.
* <p>
* <ol>
* <li>If the value of an element is ≥ 0, the corresponding
* command completed successfully and the value is the <i>update
* count</i> (the number of rows in the database affected by the
* command) for that command.</li>
* <li>If the value is {@code SUCCESS_NO_INFO}, the command
* completed successfully but the number of rows affected is
* unknown.
* <li>
* <li>If the value is {@code EXECUTE_FAILED}, the command failed.
* </ol>
* @throws SQLException
* if an error occurs accessing the database.
*/
public int[] executeBatch() throws SQLException;
/**
* Executes a supplied SQL statement. Returns a single {@code ResultSet}.
*
* @param sql
* an SQL statement to execute. Typically a {@code SELECT}
* statement
* @return a {@code ResultSet} containing the data produced by the SQL
* statement. Never null.
* @throws SQLException
* if an error occurs accessing the database or if the statement
* produces anything other than a single {@code ResultSet}.
*/
public ResultSet executeQuery(String sql) throws SQLException;
/**
* Executes the supplied SQL statement. The statement may be an {@code
* INSERT}, {@code UPDATE} or {@code DELETE} statement or a statement which
* returns nothing.
*
* @param sql
* an SQL statement to execute - an SQL {@code INSERT}, {@code
* UPDATE}, {@code DELETE} or a statement which returns nothing
* @return the count of updated rows, or 0 for a statement that returns
* nothing.
* @throws SQLException
* if an error occurs accessing the database or if the statement
* produces a {@code ResultSet}.
*/
public int executeUpdate(String sql) throws SQLException;
/**
* Executes the supplied SQL statement. This method allows control of
* whether auto-generated Keys should be made available for retrieval.
*
* @param sql
* an SQL statement to execute - an SQL {@code INSERT}, {@code
* UPDATE}, {@code DELETE} or a statement which does not return
* anything.
* @param autoGeneratedKeys
* a flag that indicates whether to allow retrieval of auto
* generated keys. Parameter must be one of {@code
* Statement.RETURN_GENERATED_KEYS} or {@code
* Statement.NO_GENERATED_KEYS}
* @return the number of updated rows, or 0 if the statement returns
* nothing.
* @throws SQLException
* if an error occurs accessing the database or if the statement
* produces a {@code ResultSet}.
*/
public int executeUpdate(String sql, int autoGeneratedKeys)
throws SQLException;
/**
* Executes the supplied SQL statement. This method allows retrieval of auto
* generated keys specified by the supplied array of column indexes.
*
* @param sql
* an SQL statement to execute - an SQL {@code INSERT}, {@code
* UPDATE}, {@code DELETE} or a statement which returns nothing
* @param columnIndexes
* an array of indexes of the columns in the inserted row which
* should be made available for retrieval via the {@code
* getGeneratedKeys} method.
* @return the count of updated rows, or 0 for a statement that returns
* nothing.
* @throws SQLException
* if an error occurs accessing the database or if the statement
* produces a {@code ResultSet}.
*/
public int executeUpdate(String sql, int[] columnIndexes)
throws SQLException;
/**
* Executes the supplied SQL statement. This method allows retrieval of auto
* generated keys specified by the supplied array of column names.
*
* @param sql
* an SQL statement to execute - an SQL {@code INSERT}, {@code
* UPDATE}, {@code DELETE} or a statement which returns nothing
* @param columnNames
* an array of column names in the inserted row which should be
* made available for retrieval via the {@code getGeneratedKeys}
* method.
* @return the count of updated rows, or 0 for a statement that returns
* nothing.
* @throws SQLException
* if an error occurs accessing the database or if the statement
* produces a {@code ResultSet}.
*/
public int executeUpdate(String sql, String[] columnNames)
throws SQLException;
/**
* Gets the {@code Connection} object which created this statement.
*
* @return the {@code Connection} through which this statement is
* transmitted to the database.
* @throws SQLException
* if an error occurs accessing the database.
*/
public Connection getConnection() throws SQLException;
/**
* Gets the default direction for fetching rows for {@code ResultSet}s
* generated from this statement.
*
* @return the default fetch direction, one of:
* <ul>
* <li>ResultSet.FETCH_FORWARD</li> <li>ResultSet.FETCH_REVERSE</li>
* <li>ResultSet.FETCH_UNKNOWN</li>
* </ul>
* @throws SQLException
* if an error occurs accessing the database.
*/
public int getFetchDirection() throws SQLException;
/**
* Gets the default number of rows for a fetch for the {@code ResultSet}
* objects returned from this statement.
*
* @return the default fetch size for {@code ResultSet}s produced by this
* statement.
* @throws SQLException
* if an error occurs accessing the database.
*/
public int getFetchSize() throws SQLException;
/**
* Returns auto generated keys created by executing this statement.
*
* @return a {@code ResultSet} containing the auto generated keys - empty if
* no keys are generated by this statement.
* @throws SQLException
* if an error occurs accessing the database.
*/
public ResultSet getGeneratedKeys() throws SQLException;
/**
* Gets the maximum number of bytes which can be returned as values from
* character and binary type columns in a {@code ResultSet} derived from this
* statement. This limit applies to {@code BINARY}, {@code VARBINARY},
* {@code LONGVARBINARY}, {@code CHAR}, {@code VARCHAR}, and {@code
* LONGVARCHAR} types. Any data exceeding the maximum size is abandoned
* without announcement.
*
* @return the current size limit, where {@code 0} means that there is no
* limit.
* @throws SQLException
* if an error occurs accessing the database.
*/
public int getMaxFieldSize() throws SQLException;
/**
* Gets the maximum number of rows that a {@code ResultSet} can contain when
* produced from this statement. If the limit is exceeded, the excess rows
* are discarded silently.
*
* @return the current row limit, where {@code 0} means that there is no
* limit.
* @throws SQLException
* if an error occurs accessing the database.
*/
public int getMaxRows() throws SQLException;
/**
* Moves to this statement's next result. Returns {@code true} if it is a
* {@code ResultSet}. Any current {@code ResultSet} objects previously
* obtained with {@code getResultSet()} are closed implicitly.
*
* @return {@code true} if the next result is a {@code ResultSet}, {@code
* false} if the next result is not a {@code ResultSet} or if there
* are no more results. Note that if there is no more data, this
* method will return {@code false} and {@code getUpdateCount} will
* return -1.
* @throws SQLException
* if an error occurs accessing the database.
*/
public boolean getMoreResults() throws SQLException;
/**
* Moves to this statement's next result. Returns {@code true} if the next
* result is a {@code ResultSet}. Any current {@code ResultSet} objects
* previously obtained with {@code getResultSet()} are handled as indicated
* by a supplied Flag parameter.
*
* @param current
* a flag indicating what to do with existing {@code ResultSet}s.
* This parameter must be one of {@code
* Statement.CLOSE_ALL_RESULTS}, {@code
* Statement.CLOSE_CURRENT_RESULT} or {@code
* Statement.KEEP_CURRENT_RESULT}.
* @return {@code true} if the next result exists and is a {@code ResultSet}
* , {@code false} if the next result is not a {@code ResultSet} or
* if there are no more results. Note that if there is no more data,
* this method will return {@code false} and {@code getUpdateCount}
* will return -1.
* @throws SQLException
* if an error occurs accessing the database.
*/
public boolean getMoreResults(int current) throws SQLException;
/**
* Gets the timeout value for the statement's execution time. The JDBC
* driver will wait up to this value for the execution to complete - after
* the limit is exceeded an SQL {@code Exception} is thrown.
*
* @return the current query timeout value, where {@code 0} indicates that
* there is no current timeout.
* @throws SQLException
* if an error occurs accessing the database.
*/
public int getQueryTimeout() throws SQLException;
/**
* Gets the current result. Should only be called once per result.
*
* @return the {@code ResultSet} for the current result. {@code null} if the
* result is an update count or if there are no more results.
* @throws SQLException
* if an error occurs accessing the database.
*/
public ResultSet getResultSet() throws SQLException;
/**
* Gets the concurrency setting for {@code ResultSet} objects generated by
* this statement.
*
* @return {@code ResultSet.CONCUR_READ_ONLY} or {@code
* ResultSet.CONCUR_UPDATABLE}.
* @throws SQLException
* if an error occurs accessing the database.
*/
public int getResultSetConcurrency() throws SQLException;
/**
* Gets the cursor hold setting for {@code ResultSet} objects generated by
* this statement.
*
* @return {@code ResultSet.HOLD_CURSORS_OVER_COMMIT} or {@code
* ResultSet.CLOSE_CURSORS_AT_COMMIT}
* @throws SQLException
* if there is an error while accessing the database.
*/
public int getResultSetHoldability() throws SQLException;
/**
* Gets the {@code ResultSet} type setting for {@code ResultSet}s derived
* from this statement.
*
* @return {@code ResultSet.TYPE_FORWARD_ONLY} for a {@code ResultSet} where
* the cursor can only move forwards, {@code
* ResultSet.TYPE_SCROLL_INSENSITIVE} for a {@code ResultSet} which
* is scrollable but is not sensitive to changes made by others,
* {@code ResultSet.TYPE_SCROLL_SENSITIVE} for a {@code ResultSet}
* which is scrollable but is sensitive to changes made by others.
* @throws SQLException
* if there is an error accessing the database.
*/
public int getResultSetType() throws SQLException;
/**
* Gets an update count for the current result if it is not a {@code
* ResultSet}.
*
* @return the current result as an update count. {@code -1} if the current
* result is a {@code ResultSet} or if there are no more results.
* @throws SQLException
* if an error occurs accessing the database.
*/
public int getUpdateCount() throws SQLException;
/**
* Retrieves the first {@code SQLWarning} reported by calls on this
* statement. If there are multiple warnings, subsequent warnings are
* chained to the first one. The chain of warnings is cleared each time the
* statement is executed.
* <p>
* Warnings associated with reads from the {@code ResultSet} returned from
* executing the statement will be attached to the {@code ResultSet}, not the
* statement object.
*
* @return an SQLWarning, null if there are no warnings
* @throws SQLException
* if an error occurs accessing the database.
*/
public SQLWarning getWarnings() throws SQLException;
/**
* Sets the SQL cursor name. This name is used by subsequent statement
* execute methods.
* <p>
* Cursor names must be unique within one Connection.
* <p>
* With the cursor name set, it can then be used in SQL positioned
* update or delete statements to determine the current row in a {@code
* ResultSet} generated from this statement. The positioned update or delete
* must be done with a different statement than this one.
*
* @param name
* the Cursor name as a string,
* @throws SQLException
* if an error occurs accessing the database.
*/
public void setCursorName(String name) throws SQLException;
/**
* Sets Escape Processing mode.
* <p>
* If Escape Processing is on, the JDBC driver will do escape substitution
* on an SQL statement before sending it for execution. This does not apply
* to {@link PreparedStatement}s since they are processed when created,
* before this method can be called.
*
* @param enable
* {@code true} to set escape processing mode <i>on</i>, {@code
* false} to turn it <i>off</i>.
* @throws SQLException
* if an error occurs accessing the database.
*/
public void setEscapeProcessing(boolean enable) throws SQLException;
/**
* Sets the fetch direction - a hint to the JDBC driver about the direction
* of processing of rows in {@code ResultSet}s created by this statement.
* The default fetch direction is {@code FETCH_FORWARD}.
*
* @param direction
* which fetch direction to use. This parameter should be one of
* <ul>
* <li>{@code ResultSet.FETCH_UNKNOWN}</li>
* <li>{@code ResultSet.FETCH_FORWARD}</li>
* <li>{@code ResultSet.FETCH_REVERSE}</li>
* </ul>
* @throws SQLException
* if there is an error while accessing the database or if the
* fetch direction is unrecognized.
*/
public void setFetchDirection(int direction) throws SQLException;
/**
* Sets the fetch size. This is a hint to the JDBC driver about how many
* rows should be fetched from the database when more are required by
* application processing.
*
* @param rows
* the number of rows that should be fetched. {@code 0} tells the driver
* to ignore the hint. Should be less than {@code getMaxRows} for
* this statement. Should not be negative.
* @throws SQLException
* if an error occurs accessing the database, or if the rows
* parameter is out of range.
*/
public void setFetchSize(int rows) throws SQLException;
/**
* Sets the maximum number of bytes for {@code ResultSet} columns that
* contain character or binary values. This applies to {@code BINARY},
* {@code VARBINARY}, {@code LONGVARBINARY}, {@code CHAR}, {@code VARCHAR},
* and {@code LONGVARCHAR} fields. Any data exceeding the maximum size is
* abandoned without announcement.
*
* @param max
* the maximum field size in bytes. {@code 0} means "no limit".
* @throws SQLException
* if an error occurs accessing the database or the {@code max}
* value is < {@code 0}.
*/
public void setMaxFieldSize(int max) throws SQLException;
/**
* Sets the maximum number of rows that any {@code ResultSet} can contain.
* If the number of rows exceeds this value, the additional rows are
* silently discarded.
*
* @param max
* the maximum number of rows. {@code 0} means "no limit".
* @throws SQLException
* if an error occurs accessing the database or if max < {@code
* 0}.
*/
public void setMaxRows(int max) throws SQLException;
/**
* Sets the timeout, in seconds, for queries - how long the driver will
* allow for completion of a statement execution. If the timeout is
* exceeded, the query will throw an {@code SQLException}.
*
* @param seconds
* timeout in seconds. 0 means no timeout ("wait forever")
* @throws SQLException
* if an error occurs accessing the database or if seconds <
* {@code 0}.
*/
public void setQueryTimeout(int seconds) throws SQLException;
/**
* Returns true if this statement has been closed, false otherwise.
*/
public boolean isClosed() throws SQLException;
/**
* Hints whether this statement should be pooled. Defaults to false for {@code Statement},
* but true for {@code CallableStatement} and {@code PreparedStatement}. Pool manager
* implementations may or may not honor this hint.
*/
public void setPoolable(boolean poolable) throws SQLException;
/**
* Returns true if this statement is poolable, false otherwise.
*/
public boolean isPoolable() throws SQLException;
}