|
40 | 40 | import org.springframework.core.serializer.support.DeserializingConverter;
|
41 | 41 | import org.springframework.core.serializer.support.SerializingConverter;
|
42 | 42 | import org.springframework.dao.DataAccessException;
|
| 43 | +import org.springframework.dao.DataIntegrityViolationException; |
| 44 | +import org.springframework.dao.DuplicateKeyException; |
43 | 45 | import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
44 | 46 | import org.springframework.jdbc.core.JdbcOperations;
|
45 | 47 | import org.springframework.jdbc.core.ResultSetExtractor;
|
@@ -139,55 +141,64 @@ public class JdbcIndexedSessionRepository
|
139 | 141 | private static final String SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
|
140 | 142 |
|
141 | 143 | // @formatter:off
|
142 |
| - private static final String CREATE_SESSION_QUERY = "INSERT INTO %TABLE_NAME%(PRIMARY_ID, SESSION_ID, CREATION_TIME, LAST_ACCESS_TIME, MAX_INACTIVE_INTERVAL, EXPIRY_TIME, PRINCIPAL_NAME) " |
| 144 | + private static final String CREATE_SESSION_QUERY = "" |
| 145 | + + "INSERT INTO %TABLE_NAME% (PRIMARY_ID, SESSION_ID, CREATION_TIME, LAST_ACCESS_TIME, MAX_INACTIVE_INTERVAL, EXPIRY_TIME, PRINCIPAL_NAME) " |
143 | 146 | + "VALUES (?, ?, ?, ?, ?, ?, ?)";
|
144 | 147 | // @formatter:on
|
145 | 148 |
|
146 | 149 | // @formatter:off
|
147 |
| - private static final String CREATE_SESSION_ATTRIBUTE_QUERY = "INSERT INTO %TABLE_NAME%_ATTRIBUTES(SESSION_PRIMARY_ID, ATTRIBUTE_NAME, ATTRIBUTE_BYTES) " |
148 |
| - + "SELECT PRIMARY_ID, ?, ? " |
149 |
| - + "FROM %TABLE_NAME% " |
150 |
| - + "WHERE SESSION_ID = ?"; |
| 150 | + private static final String CREATE_SESSION_ATTRIBUTE_QUERY = "" |
| 151 | + + "INSERT INTO %TABLE_NAME%_ATTRIBUTES (SESSION_PRIMARY_ID, ATTRIBUTE_NAME, ATTRIBUTE_BYTES) " |
| 152 | + + "VALUES (?, ?, ?)"; |
151 | 153 | // @formatter:on
|
152 | 154 |
|
153 | 155 | // @formatter:off
|
154 |
| - private static final String GET_SESSION_QUERY = "SELECT S.PRIMARY_ID, S.SESSION_ID, S.CREATION_TIME, S.LAST_ACCESS_TIME, S.MAX_INACTIVE_INTERVAL, SA.ATTRIBUTE_NAME, SA.ATTRIBUTE_BYTES " |
| 156 | + private static final String GET_SESSION_QUERY = "" |
| 157 | + + "SELECT S.PRIMARY_ID, S.SESSION_ID, S.CREATION_TIME, S.LAST_ACCESS_TIME, S.MAX_INACTIVE_INTERVAL, SA.ATTRIBUTE_NAME, SA.ATTRIBUTE_BYTES " |
155 | 158 | + "FROM %TABLE_NAME% S "
|
156 |
| - + "LEFT OUTER JOIN %TABLE_NAME%_ATTRIBUTES SA ON S.PRIMARY_ID = SA.SESSION_PRIMARY_ID " |
| 159 | + + "LEFT JOIN %TABLE_NAME%_ATTRIBUTES SA ON S.PRIMARY_ID = SA.SESSION_PRIMARY_ID " |
157 | 160 | + "WHERE S.SESSION_ID = ?";
|
158 | 161 | // @formatter:on
|
159 | 162 |
|
160 | 163 | // @formatter:off
|
161 |
| - private static final String UPDATE_SESSION_QUERY = "UPDATE %TABLE_NAME% SET SESSION_ID = ?, LAST_ACCESS_TIME = ?, MAX_INACTIVE_INTERVAL = ?, EXPIRY_TIME = ?, PRINCIPAL_NAME = ? " |
| 164 | + private static final String UPDATE_SESSION_QUERY = "" |
| 165 | + + "UPDATE %TABLE_NAME% " |
| 166 | + + "SET SESSION_ID = ?, LAST_ACCESS_TIME = ?, MAX_INACTIVE_INTERVAL = ?, EXPIRY_TIME = ?, PRINCIPAL_NAME = ? " |
162 | 167 | + "WHERE PRIMARY_ID = ?";
|
163 | 168 | // @formatter:on
|
164 | 169 |
|
165 | 170 | // @formatter:off
|
166 |
| - private static final String UPDATE_SESSION_ATTRIBUTE_QUERY = "UPDATE %TABLE_NAME%_ATTRIBUTES SET ATTRIBUTE_BYTES = ? " |
| 171 | + private static final String UPDATE_SESSION_ATTRIBUTE_QUERY = "" |
| 172 | + + "UPDATE %TABLE_NAME%_ATTRIBUTES " |
| 173 | + + "SET ATTRIBUTE_BYTES = ? " |
167 | 174 | + "WHERE SESSION_PRIMARY_ID = ? "
|
168 | 175 | + "AND ATTRIBUTE_NAME = ?";
|
169 | 176 | // @formatter:on
|
170 | 177 |
|
171 | 178 | // @formatter:off
|
172 |
| - private static final String DELETE_SESSION_ATTRIBUTE_QUERY = "DELETE FROM %TABLE_NAME%_ATTRIBUTES " |
| 179 | + private static final String DELETE_SESSION_ATTRIBUTE_QUERY = "" |
| 180 | + + "DELETE FROM %TABLE_NAME%_ATTRIBUTES " |
173 | 181 | + "WHERE SESSION_PRIMARY_ID = ? "
|
174 | 182 | + "AND ATTRIBUTE_NAME = ?";
|
175 | 183 | // @formatter:on
|
176 | 184 |
|
177 | 185 | // @formatter:off
|
178 |
| - private static final String DELETE_SESSION_QUERY = "DELETE FROM %TABLE_NAME% " |
| 186 | + private static final String DELETE_SESSION_QUERY = "" |
| 187 | + + "DELETE FROM %TABLE_NAME% " |
179 | 188 | + "WHERE SESSION_ID = ?";
|
180 | 189 | // @formatter:on
|
181 | 190 |
|
182 | 191 | // @formatter:off
|
183 |
| - private static final String LIST_SESSIONS_BY_PRINCIPAL_NAME_QUERY = "SELECT S.PRIMARY_ID, S.SESSION_ID, S.CREATION_TIME, S.LAST_ACCESS_TIME, S.MAX_INACTIVE_INTERVAL, SA.ATTRIBUTE_NAME, SA.ATTRIBUTE_BYTES " |
| 192 | + private static final String LIST_SESSIONS_BY_PRINCIPAL_NAME_QUERY = "" |
| 193 | + + "SELECT S.PRIMARY_ID, S.SESSION_ID, S.CREATION_TIME, S.LAST_ACCESS_TIME, S.MAX_INACTIVE_INTERVAL, SA.ATTRIBUTE_NAME, SA.ATTRIBUTE_BYTES " |
184 | 194 | + "FROM %TABLE_NAME% S "
|
185 |
| - + "LEFT OUTER JOIN %TABLE_NAME%_ATTRIBUTES SA ON S.PRIMARY_ID = SA.SESSION_PRIMARY_ID " |
| 195 | + + "LEFT JOIN %TABLE_NAME%_ATTRIBUTES SA ON S.PRIMARY_ID = SA.SESSION_PRIMARY_ID " |
186 | 196 | + "WHERE S.PRINCIPAL_NAME = ?";
|
187 | 197 | // @formatter:on
|
188 | 198 |
|
189 | 199 | // @formatter:off
|
190 |
| - private static final String DELETE_SESSIONS_BY_EXPIRY_TIME_QUERY = "DELETE FROM %TABLE_NAME% " |
| 200 | + private static final String DELETE_SESSIONS_BY_EXPIRY_TIME_QUERY = "" |
| 201 | + + "DELETE FROM %TABLE_NAME% " |
191 | 202 | + "WHERE EXPIRY_TIME < ?";
|
192 | 203 | // @formatter:on
|
193 | 204 |
|
@@ -463,30 +474,49 @@ private void insertSessionAttributes(JdbcSession session, List<String> attribute
|
463 | 474 | Assert.notEmpty(attributeNames, "attributeNames must not be null or empty");
|
464 | 475 | try (LobCreator lobCreator = this.lobHandler.getLobCreator()) {
|
465 | 476 | if (attributeNames.size() > 1) {
|
466 |
| - this.jdbcOperations.batchUpdate(this.createSessionAttributeQuery, new BatchPreparedStatementSetter() { |
467 |
| - |
468 |
| - @Override |
469 |
| - public void setValues(PreparedStatement ps, int i) throws SQLException { |
470 |
| - String attributeName = attributeNames.get(i); |
471 |
| - ps.setString(1, attributeName); |
472 |
| - lobCreator.setBlobAsBytes(ps, 2, serialize(session.getAttribute(attributeName))); |
473 |
| - ps.setString(3, session.getId()); |
474 |
| - } |
475 |
| - |
476 |
| - @Override |
477 |
| - public int getBatchSize() { |
478 |
| - return attributeNames.size(); |
479 |
| - } |
| 477 | + try { |
| 478 | + this.jdbcOperations.batchUpdate(this.createSessionAttributeQuery, |
| 479 | + new BatchPreparedStatementSetter() { |
| 480 | + |
| 481 | + @Override |
| 482 | + public void setValues(PreparedStatement ps, int i) throws SQLException { |
| 483 | + String attributeName = attributeNames.get(i); |
| 484 | + ps.setString(1, session.primaryKey); |
| 485 | + ps.setString(2, attributeName); |
| 486 | + lobCreator.setBlobAsBytes(ps, 3, serialize(session.getAttribute(attributeName))); |
| 487 | + } |
| 488 | + |
| 489 | + @Override |
| 490 | + public int getBatchSize() { |
| 491 | + return attributeNames.size(); |
| 492 | + } |
480 | 493 |
|
481 |
| - }); |
| 494 | + }); |
| 495 | + } |
| 496 | + catch (DuplicateKeyException ex) { |
| 497 | + throw ex; |
| 498 | + } |
| 499 | + catch (DataIntegrityViolationException ex) { |
| 500 | + // parent record not found - we are ignoring this error because we |
| 501 | + // assume that a concurrent request has removed the session |
| 502 | + } |
482 | 503 | }
|
483 | 504 | else {
|
484 |
| - this.jdbcOperations.update(this.createSessionAttributeQuery, (ps) -> { |
485 |
| - String attributeName = attributeNames.get(0); |
486 |
| - ps.setString(1, attributeName); |
487 |
| - lobCreator.setBlobAsBytes(ps, 2, serialize(session.getAttribute(attributeName))); |
488 |
| - ps.setString(3, session.getId()); |
489 |
| - }); |
| 505 | + try { |
| 506 | + this.jdbcOperations.update(this.createSessionAttributeQuery, (ps) -> { |
| 507 | + String attributeName = attributeNames.get(0); |
| 508 | + ps.setString(1, session.primaryKey); |
| 509 | + ps.setString(2, attributeName); |
| 510 | + lobCreator.setBlobAsBytes(ps, 3, serialize(session.getAttribute(attributeName))); |
| 511 | + }); |
| 512 | + } |
| 513 | + catch (DuplicateKeyException ex) { |
| 514 | + throw ex; |
| 515 | + } |
| 516 | + catch (DataIntegrityViolationException ex) { |
| 517 | + // parent record not found - we are ignoring this error because we |
| 518 | + // assume that a concurrent request has removed the session |
| 519 | + } |
490 | 520 | }
|
491 | 521 | }
|
492 | 522 | }
|
|
0 commit comments