diff --git a/config/alfresco/application-context-core.xml b/config/alfresco/application-context-core.xml
index fc0670ff70..ddac5f146c 100644
--- a/config/alfresco/application-context-core.xml
+++ b/config/alfresco/application-context-core.xml
@@ -12,6 +12,7 @@
+
@@ -27,7 +28,6 @@
-
diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml
index 846f350b1d..119bddad80 100644
--- a/config/alfresco/core-services-context.xml
+++ b/config/alfresco/core-services-context.xml
@@ -230,10 +230,22 @@
-
-
-
-
+
+
+ ${db.url}
+
+
+ ${db.username}
+
+
+ ${db.txn.isolation}
+
+
+
+
+
+
+
diff --git a/config/alfresco/messages/system-messages.properties b/config/alfresco/messages/system-messages.properties
index 9c1e732257..8d10155416 100644
--- a/config/alfresco/messages/system-messages.properties
+++ b/config/alfresco/messages/system-messages.properties
@@ -17,6 +17,10 @@ system.config_check.err.missing_content=CONTENT INTEGRITY ERROR: System content
system.config_check.err.fix_dir_root=Ensure that the ''dir.root'' property ''{0}'' is pointing to the correct data location.
system.config_check.msg.howto_index_recover=You may set 'index.recovery.mode=FULL' if you need to rebuild the indexes.
system.config_check.warn.starting_with_errors=Alfresco is starting with errors.
+system.config_check.err.wrong_transaction_isolation_sql_server=The transaction isolation is set to {0}, but should be set to {1} for MS SQL Server
+system.config_check.info.db_connection=Using database URL ''{0}'' with user ''{1}''.
+system.config_check.info.db_version=Connected to database {0} version {1}
+system.config_check.err.db_connection=Database connection failed: {0}
# Schema comparator messages
# Log messages...
diff --git a/source/java/org/alfresco/repo/domain/schema/DataSourceCheck.java b/source/java/org/alfresco/repo/domain/schema/DataSourceCheck.java
index 2fd5aedfe4..0847fbffd4 100644
--- a/source/java/org/alfresco/repo/domain/schema/DataSourceCheck.java
+++ b/source/java/org/alfresco/repo/domain/schema/DataSourceCheck.java
@@ -23,8 +23,15 @@ import java.sql.DatabaseMetaData;
import javax.sql.DataSource;
+import org.alfresco.error.AlfrescoRuntimeException;
+import org.alfresco.hibernate.DialectFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.springframework.extensions.surf.util.I18NUtil;
+import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
/**
* Bean to log connection details and attempt to ensure that the connection is OK.
@@ -36,27 +43,83 @@ public class DataSourceCheck
{
private static Log logger = LogFactory.getLog("org.alfresco.repo.admin");
- private static final String MSG_DB_CONNECTION = "Using database URL '%s' with user '%s'.";
- private static final String MSG_DB_VERSION = "Connected to database %s version %s";
- private static final String ERR_DB_CONNECTION = "Database connection failed: %s";
-
- /**
- * Constructor-based check of DB connection
- */
- public DataSourceCheck(String dbUrl, String dbUsername, DataSource dataSource)
+ private static final String MSG_DB_CONNECTION = "system.config_check.info.db_connection";
+ private static final String MSG_DB_VERSION = "system.config_check.info.db_version";
+ private static final String ERR_DB_CONNECTION = "system.config_check.err.db_connection";
+ private static final String ERR_WRONG_TRANSACTION_ISOLATION_SQL_SERVER =
+ "system.config_check.err.wrong_transaction_isolation_sql_server";
+ /** The required transaction isolation */
+ private static final int SQL_SERVER_TRANSACTION_ISOLATION = 4096;
+
+ private Configuration cfg;
+ private String dbUrl;
+ private String dbUsername;
+ private int transactionIsolation;
+ private DataSource dataSource;
+
+ public void setLocalSessionFactory(LocalSessionFactoryBean localSessionFactory)
{
- logger.info(String.format(MSG_DB_CONNECTION, dbUrl, dbUsername));
+ this.cfg = localSessionFactory.getConfiguration();
+ }
+
+ public void setDbUrl(String dbUrl)
+ {
+ this.dbUrl = dbUrl;
+ }
+
+ public void setDbUsername(String dbUsername)
+ {
+ this.dbUsername = dbUsername;
+ }
+
+ public void setDataSource(DataSource dataSource)
+ {
+ this.dataSource = dataSource;
+ }
+
+ public void setTransactionIsolation(int transactionIsolation)
+ {
+ this.transactionIsolation = transactionIsolation;
+ }
+
+ public void init()
+ {
+ logger.info(I18NUtil.getMessage(MSG_DB_CONNECTION, dbUrl, dbUsername));
Connection con = null;
try
{
con = dataSource.getConnection();
+ con.setAutoCommit(true);
DatabaseMetaData meta = con.getMetaData();
- logger.info(String.format(MSG_DB_VERSION, meta.getDatabaseProductName(), meta.getDatabaseProductVersion()));
+ logger.info(I18NUtil.getMessage(
+ MSG_DB_VERSION,
+ meta.getDatabaseProductName(), meta.getDatabaseProductVersion()));
+
+ Dialect dialect = DialectFactory.buildDialect(
+ cfg.getProperties(),
+ meta.getDatabaseProductName(),
+ meta.getDatabaseMajorVersion());
+
+ // Check MS SQL Server specific settings
+ if (dialect instanceof SQLServerDialect)
+ {
+ if (transactionIsolation != SQL_SERVER_TRANSACTION_ISOLATION)
+ {
+ throw new AlfrescoRuntimeException(
+ ERR_WRONG_TRANSACTION_ISOLATION_SQL_SERVER,
+ new Object[] {transactionIsolation, SQL_SERVER_TRANSACTION_ISOLATION});
+ }
+ }
+ }
+ catch (RuntimeException re)
+ {
+ // just rethrow
+ throw re;
}
catch (Exception e)
{
- throw new RuntimeException(String.format(ERR_DB_CONNECTION, e.getMessage()), e);
+ throw new AlfrescoRuntimeException(ERR_DB_CONNECTION, new Object[] {e.getMessage()}, e);
}
finally
{