You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Carlo Paglia (JIRA)" <ji...@apache.org> on 2012/11/27 14:43:57 UTC

[jira] [Created] (JCR-3464) Clustering Jackrabbit with Liferay 5.2.3 over IBM DB2

Carlo Paglia created JCR-3464:
---------------------------------

             Summary: Clustering Jackrabbit with Liferay 5.2.3 over IBM DB2
                 Key: JCR-3464
                 URL: https://issues.apache.org/jira/browse/JCR-3464
             Project: Jackrabbit Content Repository
          Issue Type: Bug
          Components: jackrabbit-core, sql
    Affects Versions: 1.5.3
         Environment: Liferay 5.2.3 on JBoss 5.1.2 GA over IBM DB2
            Reporter: Carlo Paglia


Hi guys, i just want to share with you solutions to some bugs that occour in jackrabbit cluster configuration on IBM DB2.
Two kind of problems occour:

DatabaseJournal.java in /org/apache/jackrabbit/core/journal/ can't create J_C_ tables due to missing db2.ddl file in that package.
Here is the sql script that you have to put in it:

CREATE TABLE ${schemaObjectPrefix}JOURNAL (REVISION_ID BIGINT NOT NULL, JOURNAL_ID VARCHAR(255), PRODUCER_ID VARCHAR(255), REVISION_DATA BLOB )
CREATE UNIQUE INDEX ${schemaObjectPrefix}JOURNAL_IDX ON ${schemaObjectPrefix}JOURNAL (REVISION_ID)

CREATE TABLE ${schemaObjectPrefix}GLOBAL_REVISION (REVISION_ID BIGINT NOT NULL)
CREATE UNIQUE INDEX ${schemaObjectPrefix}GLOBAL_REVISION_IDX ON ${schemaObjectPrefix}GLOBAL_REVISION (REVISION_ID)

CREATE TABLE ${schemaObjectPrefix}LOCAL_REVISIONS ( JOURNAL_ID varchar(255), REVISION_ID BIGINT NOT NULL)

# Inserting the one and only revision counter record now helps avoiding race conditions
INSERT INTO ${schemaObjectPrefix}GLOBAL_REVISION VALUES(0)


Classes located in /org/apache/jackrabbit/core/ cannot acquire connections from datasource, due to a bug in ConnectionFactory.java in package /org/apache/jackrabbit/core/persistence/bundle/util/; below is reported the fixed source code: 

package org.apache.jackrabbit.core.persistence.bundle.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.jcr.RepositoryException;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnectionFactory
{
public static Connection getConnection(String driver, String url, String user, String password)
throws RepositoryException, SQLException
{
if ((driver != null) && (driver.length() > 0)) {
try {
Class d = Class.forName(driver);
if (Context.class.isAssignableFrom(d))
{
Context context = (Context)d.newInstance();
DataSource ds = (DataSource)context.lookup(url);
//Here is the bug: the original version doesn't check the empty string
//case in user and password properties.
if ((user == null || user.equals("")) && (password == null || password.equals(""))) {
return ds.getConnection();
}
return ds.getConnection(user, password);
}

try
{
d.newInstance();
}
catch (Throwable e)
{
}
}
catch (ClassNotFoundException e) {
throw new RepositoryException("Could not load class " + driver, e);
} catch (InstantiationException e) {
throw new RepositoryException("Could not instantiate context " + driver, e);
} catch (IllegalAccessException e) {
throw new RepositoryException("Could not instantiate context " + driver, e);
} catch (NamingException e) {
throw new RepositoryException("Naming exception using " + driver + " url: " + url, e);
}
}
return DriverManager.getConnection(url, user, password);
}
}

Hope it helps!!! Enjoy!
Carlo

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira