=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/setting/DefaultSystemSettingManager.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/setting/DefaultSystemSettingManager.java 2016-03-14 15:55:25 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/setting/DefaultSystemSettingManager.java 2016-03-14 18:04:21 +0000 @@ -202,8 +202,8 @@ } /** - * Get system setting. The database call is executed in a programmatic - * transaction. + * Get system setting optional. The database call is executed in a + * programmatic transaction. * * @param name the system setting name. * @param defaultValue the default value for the system setting. @@ -213,7 +213,7 @@ { SystemSetting setting = transactionTemplate.execute( new TransactionCallback() { - public SystemSetting doInTransaction( TransactionStatus status) + public SystemSetting doInTransaction( TransactionStatus status ) { return systemSettingStore.getByName( name ); } @@ -235,9 +235,9 @@ @Transactional public List getAllSystemSettings() { - return systemSettingStore.getAll().stream() - .filter( systemSetting -> !isConfidential( systemSetting.getName() ) ) - .collect( Collectors.toList() ); + return systemSettingStore.getAll().stream(). + filter( systemSetting -> !isConfidential( systemSetting.getName() ) ). + collect( Collectors.toList() ); } @Override === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserSettingService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserSettingService.java 2016-03-14 17:47:20 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserSettingService.java 2016-03-14 18:04:21 +0000 @@ -35,7 +35,11 @@ import org.hisp.dhis.setting.SettingKey; import org.hisp.dhis.setting.SystemSettingManager; import org.hisp.dhis.system.util.SystemUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; import java.io.Serializable; import java.util.ArrayList; @@ -47,9 +51,12 @@ import java.util.stream.Collectors; /** + * Declare transactions on individual methods. The get-methods do not have + * transactions declared, instead a programmatic transaction is initiated on + * cache miss in order to reduce the number of transactions to improve performance. + * * @author Torgeir Lorange Ostby */ -@Transactional public class DefaultUserSettingService implements UserSettingService { @@ -102,11 +109,15 @@ this.systemSettingManager = systemSettingManager; } + @Autowired + private TransactionTemplate transactionTemplate; + // ------------------------------------------------------------------------- // UserSettingService implementation // ------------------------------------------------------------------------- @Override + @Transactional public void saveUserSetting( UserSettingKey key, Serializable value, String username ) { UserCredentials credentials = userService.getUserCredentialsByUsername( username ); @@ -118,6 +129,7 @@ } @Override + @Transactional public void saveUserSetting( UserSettingKey key, Serializable value ) { User currentUser = currentUserService.getCurrentUser(); @@ -126,6 +138,7 @@ } @Override + @Transactional public void saveUserSetting( UserSettingKey key, Serializable value, User user ) { if ( user == null ) @@ -152,6 +165,7 @@ } @Override + @Transactional public void deleteUserSetting( UserSetting userSetting ) { SETTING_CACHE.invalidate( getCacheKey( userSetting.getName(), userSetting.getUser().getUsername() ) ); @@ -160,6 +174,7 @@ } @Override + @Transactional public void deleteUserSetting( UserSettingKey key ) { User currentUser = currentUserService.getCurrentUser(); @@ -176,6 +191,7 @@ } @Override + @Transactional public void deleteUserSetting( UserSettingKey key, User user ) { UserSetting setting = userSettingStore.getUserSetting( user, key.getName() ); @@ -186,12 +202,20 @@ } } + /** + * No transaction for this method, transaction is initiated in + * {@link getUserSettingOptional}. + */ @Override public Serializable getUserSetting( UserSettingKey key ) { return getUserSetting( key, Optional.empty() ).orElse( null ); } + /** + * No transaction for this method, transaction is initiated in + * {@link getUserSettingOptional}. + */ @Override public Serializable getUserSetting( UserSettingKey key, User user ) { @@ -199,6 +223,7 @@ } @Override + @Transactional public List getAllUserSettings() { User currentUser = currentUserService.getCurrentUser(); @@ -207,6 +232,7 @@ } @Override + @Transactional public List getUserSettings( User user ) { if ( user == null ) @@ -259,6 +285,14 @@ } } + /** + * Get user setting optional. The database call is executed in a + * programmatic transaction. + * + * @param key the user setting key. + * @param username the username of the user. + * @return an optional user setting value. + */ private Optional getUserSettingOptional( UserSettingKey key, String username ) { UserCredentials userCredentials = userService.getUserCredentialsByUsername( username ); @@ -268,7 +302,13 @@ return Optional.empty(); } - UserSetting setting = userSettingStore.getUserSetting( userCredentials.getUserInfo(), key.getName() ); + UserSetting setting = transactionTemplate.execute( new TransactionCallback() + { + public UserSetting doInTransaction( TransactionStatus status ) + { + return userSettingStore.getUserSetting( userCredentials.getUserInfo(), key.getName() ); + } + } ); return setting != null && setting.hasValue() ? Optional.of( setting.getValue() ) : Optional.empty();