upported;
    /** True if the database supports the rs.setFetchSize() method. */
    private static boolean fetchSizeSupported;
    // True if the database supports correlated subqueries.
    private static boolean subqueriesSupported;
    // True if the database supports scroll-insensitive results.
    private static boolean scrollResultsSupported;
    // True if the database supports batch updates.
    private static boolean batchUpdatesSupported;
    /** True if the database supports the Statement.setFetchSize()) method. */
    private static boolean pstmt_fetchSizeSupported = true;
    /** The char used to quote identifiers */
    private static String identifierQuoteString;

    private static final String SETTING_DATABASE_MAX_RETRIES = "database.maxRetries";
    private static final String SETTING_DATABASE_RETRY_DELAY = "database.retryDelay";

    private static DatabaseType databaseType = DatabaseType.unknown;

    private static SchemaManager schemaManager = new SchemaManager();

    /**
     * Ensures that the connection provider exists and is set
     */
    private static void ensureConnectionProvider() {
        if (connectionProvider != null) return;
        
        synchronized (providerLock) {
            if (connectionProvider != null) return;
            
            // Attempt to load the connection provider classname as a Jive property.
            String className = JiveGlobals.getXMLProperty("connectionProvider.className");
            if (className != null) {
                // Attempt to load the class.
                try {
                    Class conClass = ClassUtils.forName(className);
                    setConnectionProvider((ConnectionProvider)conClass.newInstance());
                } catch (Exception e) {
                    Log.warn("Failed to create the " +
                            "connection provider specified by connection" +
                            "Provider.className. Using the default pool.", e);
                    setConnectionProvider(new DefaultConnectionProvi