mkalen      2005/03/11 11:13:23

  Modified:    src/java/org/apache/ojb/broker/platforms
                        PlatformOracle9iImpl.java
  Log:
  Merge with OJB_1_0_RELEASE branch: Lower sizes for Oracle-specific row 
pre-fetch and statement cache. This optimizes memory consumption and avoids 
OutOfMemoryException when using Oracle9i platform (heavy caching in JDBC driver 
see to make JVM GC unable to reclaim references under low memory conditions). 
Also make pre-fetch enable only once per connection instead of once per 
statement.
  
  Revision  Changes    Path
  1.15      +31 -26    
db-ojb/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java
  
  Index: PlatformOracle9iImpl.java
  ===================================================================
  RCS file: 
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- PlatformOracle9iImpl.java 15 Aug 2004 22:39:11 -0000      1.14
  +++ PlatformOracle9iImpl.java 11 Mar 2005 19:13:23 -0000      1.15
  @@ -37,16 +37,16 @@
    * an implementation that uses Oracle specific optimizations and 
LOB-handling.
    *
    * Optimization: Oracle Batching (not standard JDBC batching)
  - * see http://technet.oracle.com/products/oracle9i/daily/jun07.html
  + * see <a 
href="http://technet.oracle.com/products/oracle9i/daily/jun07.html";>OTN</a>.
    *
    * Optimization: Oracle Prefetching
  - * see 
http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/RowPrefetchSample/Readme.html
  + * see <a 
href="http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/RowPrefetchSample/Readme.html";>OTN</a>
    *
    * Optimization: Oracle Statement Caching
  - * see 
http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/jdbc30/StmtCacheSample/Readme.html
  + * see <a 
href="http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/jdbc30/StmtCacheSample/Readme.html";>OTN</a>
    *
    * TODO: Optimization: use ROWNUM to minimize the effects of not having 
server side cursors
  - * see 
http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:127412348064
  + * see <a 
href="http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:127412348064";>Ask
 TOM</A>.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]">Matthew Baird</a>
    * @author <a href="mailto:[EMAIL PROTECTED]">Erik Forkalsrud</a>
  @@ -60,8 +60,22 @@
   {
       private Logger logger = 
LoggerFactory.getLogger(PlatformOracle9iImpl.class);
   
  -    protected static final int STATEMENT_CACHE_SIZE = 100;
  -    protected static final int ROW_PREFETCH_SIZE = 100;
  +    /**
  +     * Number of cached statements per connection,
  +     * when using implicit caching with OracleConnections.
  +     * Set in [EMAIL PROTECTED] #initializeJdbcConnection}.
  +     * @see <a 
href="http://www.apache.org/~mkalen/ojb/broker-tests.html";>Profiling page</a>
  +     * for a discussion re sizing
  +     */
  +    protected static final int STATEMENT_CACHE_SIZE = 10;
  +    /**
  +     * Number of rows pre-fetched by the JDBC-driver for each executed query,
  +     * when using Oracle row pre-fetching with OracleConnections.
  +     * Set in [EMAIL PROTECTED] #initializeJdbcConnection}.
  +     * @see <a 
href="http://www.apache.org/~mkalen/ojb/broker-tests.html";>Profiling page</a>
  +     * for a discussion re sizing
  +     */
  +    protected static final int ROW_PREFETCH_SIZE = 10;
   
       // From Oracle9i JDBC Developer's Guide and Reference:
       // "Batch values between 5 and 30 tend to be the most effective."
  @@ -81,12 +95,16 @@
       protected static final JdbcType BASE_BLOB = 
JdbcTypesHelper.getJdbcTypeByName("blob");
   
       /**
  -     * Enables Oracle statement caching if supported by the JDBC-driver.
  +     * Enables Oracle statement caching and row prefetching if supported by 
the JDBC-driver.
        * See
        * [EMAIL PROTECTED] 
"http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/jdbc30/StmtCacheSample/Readme.html"}
        * @param jcd the OJB <code>JdbcConnectionDescriptor</code> (metadata) 
for the connection to be initialized
        * @param conn the <code>Connection</code>-object (physical) to be 
initialized
        * @see PlatformDefaultImpl#initializeJdbcConnection
  +     * @see <a 
href="http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/jdbc30/StmtCacheSample/Readme.html";>
  +     * Oracle TechNet Statement Caching Sample</a>
  +     * @see <a 
href="http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/RowPrefetchSample/Readme.html";>
  +     * Oracle TechNet Row Pre-fetch Sample<a>
        */
       public void initializeJdbcConnection(JdbcConnectionDescriptor jcd, 
Connection conn) throws PlatformException
       {
  @@ -110,26 +128,13 @@
               }
               catch (Exception e)
               {
  -                throw new PlatformException(e.getLocalizedMessage(), e);
  +                throw new PlatformException(e);
               }
           }
  -    }
   
  -    /**
  -     * Enables Oracle row prefetching if supported.
  -     * See 
http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/RowPrefetchSample/Readme.html.
  -     * This is RDBMS server-to-client prefetching and thus one layer below
  -     * the OJB-internal prefetching-to-cache introduced in version 1.0rc5.
  -     * @param stmt the statement just created
  -     * @throws PlatformException upon JDBC failure
  -     */
  -    public void afterStatementCreate(java.sql.Statement stmt) throws 
PlatformException
  -    {
  -        super.afterStatementCreate(stmt);
  -
  -        // Check for OracleStatement-specific row prefetching support
  +        // Check for OracleConnection-specific row pre-fetching support
           final Method methodSetRowPrefetch;
  -        methodSetRowPrefetch = ClassHelper.getMethod(stmt, "setRowPrefetch", 
PARAM_TYPE_INTEGER);
  +        methodSetRowPrefetch = ClassHelper.getMethod(conn, 
"setDefaultRowPrefetch", PARAM_TYPE_INTEGER);
   
           final boolean rowPrefetchingSupported = methodSetRowPrefetch != null;
           if (rowPrefetchingSupported)
  @@ -137,11 +142,11 @@
               try
               {
                   // Set number of prefetched rows
  -                methodSetRowPrefetch.invoke(stmt, PARAM_ROW_PREFETCH_SIZE);
  +                methodSetRowPrefetch.invoke(conn, PARAM_ROW_PREFETCH_SIZE);
               }
               catch (Exception e)
               {
  -                throw new PlatformException(e.getLocalizedMessage(), e);
  +                throw new PlatformException(e);
               }
           }
       }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to