Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 88889 invoked from network); 12 Dec 2007 07:35:55 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 12 Dec 2007 07:35:55 -0000 Received: (qmail 62644 invoked by uid 500); 12 Dec 2007 07:35:43 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 62605 invoked by uid 500); 12 Dec 2007 07:35:43 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 62596 invoked by uid 99); 12 Dec 2007 07:35:43 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 11 Dec 2007 23:35:43 -0800 X-ASF-Spam-Status: No, hits=-98.0 required=10.0 tests=ALL_TRUSTED,FUZZY_CPILL,URIBL_BLACK X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Dec 2007 07:35:29 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id C7EC91A9832; Tue, 11 Dec 2007 23:35:32 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r603499 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/data/ main/java/org/apache/jackrabbit/core/data/db/ main/resources/org/apache/jackrabbit/core/data/db/ test/java/org/apache/jackrabbit/core/data/ Date: Wed, 12 Dec 2007 07:35:30 -0000 To: commits@jackrabbit.apache.org From: thomasm@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20071212073532.C7EC91A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: thomasm Date: Tue Dec 11 23:35:28 2007 New Revision: 603499 URL: http://svn.apache.org/viewvc?rev=603499&view=rev Log: JCR-1154 Database data store: support multiple concurrent connections Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/Pool.java (with props) jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/TempFileInputStream.java (with props) Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataStoreException.java jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/data/db/derby.properties jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/data/db/h2.properties jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/data/db/mysql.properties jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/data/db/postgresql.properties jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/data/db/sqlserver.properties jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/PersistenceManagerIteratorTest.java jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/RandomInputStream.java Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataStoreException.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataStoreException.java?rev=603499&r1=603498&r2=603499&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataStoreException.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/DataStoreException.java Tue Dec 11 23:35:28 2007 @@ -43,4 +43,14 @@ public DataStoreException(String message, Throwable cause) { super(message, cause); } + + /** + * Constructs a new instance of this class with the specified root cause. + * + * @param rootCause root failure cause + */ + public DataStoreException(Throwable rootCause) { + super(rootCause); + } + } Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java?rev=603499&r1=603498&r2=603499&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/FileDataRecord.java Tue Dec 11 23:35:28 2007 @@ -21,11 +21,10 @@ import java.io.IOException; import java.io.InputStream; - /** * Data record that is based on a normal file. */ -class FileDataRecord extends AbstractDataRecord { +public class FileDataRecord extends AbstractDataRecord { /** * The file that contains the binary stream. @@ -38,7 +37,7 @@ * @param identifier data identifier * @param file file that contains the binary stream */ - public FileDataRecord(DataIdentifier identifier, File file) { + protected FileDataRecord(DataIdentifier identifier, File file) { super(identifier); assert file.isFile(); this.file = file; Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java?rev=603499&r1=603498&r2=603499&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataRecord.java Tue Dec 11 23:35:28 2007 @@ -27,9 +27,9 @@ */ public class DbDataRecord extends AbstractDataRecord { - private final DbDataStore store; - private final long length; - private long lastModified; + protected final DbDataStore store; + protected final long length; + protected long lastModified; /** * Creates a data record based on the given identifier and length. Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java?rev=603499&r1=603498&r2=603499&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java Tue Dec 11 23:35:28 2007 @@ -23,17 +23,15 @@ import org.apache.jackrabbit.core.persistence.bundle.util.ConnectionRecoveryManager; import org.apache.jackrabbit.core.persistence.bundle.util.TrackingInputStream; import org.apache.jackrabbit.core.persistence.bundle.util.ConnectionRecoveryManager.StreamWrapper; +import org.apache.jackrabbit.util.Text; import org.apache.jackrabbit.uuid.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedInputStream; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.lang.ref.WeakReference; import java.security.DigestInputStream; import java.security.MessageDigest; @@ -46,6 +44,8 @@ import java.util.Properties; import java.util.WeakHashMap; +import javax.jcr.RepositoryException; + /** * A data store implementation that stores the records in a database using JDBC. * @@ -58,6 +58,8 @@ *
  • <param name="{@link #setDatabaseType(String) databaseType}" value="postgresql"/> *
  • <param name="{@link #setDriver(String) driver}" value="org.postgresql.Driver"/> *
  • <param name="{@link #setMinRecordLength(int) minRecordLength}" value="1024"/> + *
  • <param name="{@link #setMaxConnections(int) maxConnections}" value="2"/> + *
  • <param name="{@link #setCopyWhenReading(int) copyWhenReading}" value="true"/> * * *

    @@ -68,13 +70,21 @@ * A three level directory structure is used to avoid placing too many * files in a single directory. The chosen structure is designed to scale * up to billions of distinct records. + *

    + * For Microsoft SQL Server 2005, there is a problem reading large BLOBs. You will need to use + * the JDBC driver version 1.2 or newer, and append ;responseBuffering=adaptive to the database URL. + * Don't append ;selectMethod=cursor, otherwise it can still run out of memory. + * Example database URL: jdbc:sqlserver://localhost:4220;DatabaseName=test;responseBuffering=adaptive + *

    + * By default, the data is copied to a temp file when reading, to avoid problems when reading multiple + * blobs at the same time. */ public class DbDataStore implements DataStore { /** * The digest algorithm used to uniquely identify records. */ - private static final String DIGEST = "SHA-1"; + protected static final String DIGEST = "SHA-1"; /** * Logger instance @@ -84,142 +94,168 @@ /** * The default value for the minimum object size. */ - private static final int DEFAULT_MIN_RECORD_LENGTH = 100; + public static final int DEFAULT_MIN_RECORD_LENGTH = 100; + + /** + * The default value for the maximum connections. + */ + public static final int DEFAULT_MAX_CONNECTIONS = 3; /** * The minimum modified date. If a file is accessed (read or write) with a modified date * older than this value, the modified date is updated to the current time. */ - private long minModifiedDate; + protected long minModifiedDate; /** * The database URL used. */ - private String url; + protected String url; /** * The database driver. */ - private String driver; + protected String driver; /** * The user name. */ - private String user; + protected String user; /** * The password */ - private String password; + protected String password; /** * The database type used. */ - private String databaseType; + protected String databaseType; /** * The minimum size of an object that should be stored in this data store. */ - private int minRecordLength = DEFAULT_MIN_RECORD_LENGTH; + protected int minRecordLength = DEFAULT_MIN_RECORD_LENGTH; - private ConnectionRecoveryManager conn; + /** + * The maximum number of open connections. + */ + protected int maxConnections = DEFAULT_MAX_CONNECTIONS; - private static final String TEMP_PREFIX = "TEMP_"; + /** + * A list of connections + */ + protected Pool connectionPool; - private String tableSQL = "DATASTORE"; - private String createTableSQL = - "CREATE TABLE DATASTORE(ID VARCHAR(255) PRIMARY KEY, LENGTH BIGINT, LAST_MODIFIED BIGINT, DATA BLOB)"; - private String insertTempSQL = - "INSERT INTO DATASTORE VALUES(?, 0, ?, NULL)"; - private String updateDataSQL = - "UPDATE DATASTORE SET DATA=? WHERE ID=?"; - private String updateLastModifiedSQL = - "UPDATE DATASTORE SET LAST_MODIFIED=? WHERE ID=? AND LAST_MODIFIED (len - pos)) { n = (len - pos); } - if (n > MAX_READ_BLOCK) { - n = MAX_READ_BLOCK; + if (n > maxReadBlockSize) { + n = maxReadBlockSize; } else if (n < 0) { n = 0; }