Refactor JdbcOperationsSessionRepository session clean up query to prevent overflow

Fixes gh-679
This commit is contained in:
Vedran Pavic
2016-12-02 20:29:23 +01:00
parent ebbc10b2b4
commit 39503a21a7
2 changed files with 3 additions and 22 deletions

View File

@@ -176,7 +176,7 @@ public class JdbcOperationsSessionRepository implements
private static final String DELETE_SESSIONS_BY_LAST_ACCESS_TIME_QUERY =
"DELETE FROM %TABLE_NAME% " +
"WHERE LAST_ACCESS_TIME < ? - MAX_INACTIVE_INTERVAL * 1000";
"WHERE MAX_INACTIVE_INTERVAL < (? - LAST_ACCESS_TIME) / 1000";
private static final Log logger = LogFactory
.getLog(JdbcOperationsSessionRepository.class);

View File

@@ -15,7 +15,6 @@
*/
package org.springframework.session.jdbc.config.annotation.web.http;
import java.util.Arrays;
import java.util.Map;
import javax.sql.DataSource;
@@ -36,8 +35,6 @@ import org.springframework.core.serializer.support.SerializingConverter;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.jdbc.support.MetaDataAccessException;
import org.springframework.jdbc.support.lob.LobHandler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
@@ -88,19 +85,14 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration
@Bean
public JdbcOperationsSessionRepository sessionRepository(
@Qualifier("springSessionJdbcOperations") JdbcTemplate jdbcTemplate,
@Qualifier("springSessionJdbcOperations") JdbcOperations jdbcOperations,
PlatformTransactionManager transactionManager) {
JdbcOperationsSessionRepository sessionRepository =
new JdbcOperationsSessionRepository(jdbcTemplate, transactionManager);
new JdbcOperationsSessionRepository(jdbcOperations, transactionManager);
String tableName = getTableName();
if (StringUtils.hasText(tableName)) {
sessionRepository.setTableName(tableName);
}
String databaseName = getDatabaseName(jdbcTemplate.getDataSource());
if (Arrays.asList("Apache Derby", "H2").contains(databaseName)) {
sessionRepository.setDeleteSessionsByLastAccessTimeQuery("DELETE FROM " + tableName +
" WHERE LAST_ACCESS_TIME < ? - CAST(MAX_INACTIVE_INTERVAL AS BIGINT) * 1000");
}
sessionRepository
.setDefaultMaxInactiveInterval(this.maxInactiveIntervalInSeconds);
if (this.lobHandler != null) {
@@ -163,17 +155,6 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration
this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds;
}
private String getDatabaseName(DataSource dataSource) {
try {
String databaseProductName = JdbcUtils.extractDatabaseMetaData(dataSource,
"getDatabaseProductName").toString();
return JdbcUtils.commonDatabaseName(databaseProductName);
}
catch (MetaDataAccessException e) {
return null;
}
}
private String getTableName() {
String systemProperty = System.getProperty("spring.session.jdbc.tableName", "");
if (StringUtils.hasText(systemProperty)) {