DataFieldMaxValueIncrementer that increments the maximum value of a given MySQL table
with the equivalent of an auto-increment column.Note
If you use this class, your MySQL key column should NOT be auto-increment, as the sequence table does the job.
The sequence is kept in a table; there should be one sequence table per table that needs an auto-generated key. The storage engine used by the sequence table can be MYISAM or INNODB since the sequences are allocated using a separate connection without being affected by any other transactions that might be in progress.
Example:
create table tab (id int unsigned not null primary key, text varchar(100)); create table tab_sequence (value int not null); insert into tab_sequence values(0);
If cacheSize is set, the intermediate values are served without querying the
database. If the server or your application is stopped or crashes or a transaction
is rolled back, the unused values will never be served. The maximum hole size in
numbering is consequently the value of cacheSize.
It is possible to avoid acquiring a new connection for the incrementer by setting the "useNewConnection" property to false. In this case you MUST use a non-transactional storage engine like MYISAM when defining the incrementer table.
As of Spring Framework 5.3.7, MySQLMaxValueIncrementer is compatible with
MySQL safe updates mode.
| Modifier and Type | Field and Description |
|---|---|
| private long | maxId
The max id to serve. |
| private long | nextId
The next id to serve. |
| private boolean | useNewConnection
Whether to use a new connection for the incrementer. |
| private static final String | VALUE_SQL
The SQL string for retrieving the new sequence value. |
| Access | Constructor and Description |
|---|---|
| public | |
| public | MySQLMaxValueIncrementer(DataSource
the DataSource to use dataSource, String the name of the sequence table to use incrementerName, String the name of the column in the sequence table to use columnName)Convenience constructor. |
| Modifier and Type | Method and Description |
|---|---|
| protected synchronized long | getNextKey()
Implements abstract org. Determine the next key to use, as a long. |
| public void | setUseNewConnection(boolean useNewConnection)
Set whether to use a new connection for the incrementer. |
| maxId | back to summary |
|---|---|
| private long maxId The max id to serve. | |
| nextId | back to summary |
|---|---|
| private long nextId The next id to serve. | |
| useNewConnection | back to summary |
|---|---|
| private boolean useNewConnection Whether to use a new connection for the incrementer. | |
| VALUE_SQL | back to summary |
|---|---|
| private static final String VALUE_SQL The SQL string for retrieving the new sequence value. | |
| MySQLMaxValueIncrementer | back to summary |
|---|---|
| public MySQLMaxValueIncrementer() Default constructor for bean property style usage.
| |
| MySQLMaxValueIncrementer | back to summary |
|---|---|
| public MySQLMaxValueIncrementer(DataSource dataSource, String incrementerName, String columnName) Convenience constructor.
| |
| getNextKey | back to summary |
|---|---|
| protected synchronized long getNextKey() throws DataAccessException Implements abstract org. Doc from org. Determine the next key to use, as a long.
| |
| setUseNewConnection | back to summary |
|---|---|
| public void setUseNewConnection(boolean useNewConnection) Set whether to use a new connection for the incrementer.
Default is
| |