I beleive you are wrong. It was that way for a reason.
The reason is that if ID aquisition is performed as a part of (large) 
transaction it will lock ID_TABLE for the duration of that transaction.
So it was perfectly correct for IDBroker to get the IDs in a separate (small) 
transaction so that ID_TABLE is locked for the minimal time possible.
I think this change should be rolled back...

your ever-watching fedor.

On Tuesday 09 April 2002 08:23 am, you wrote:
> jmcnally    02/04/09 08:23:01
>
>   Modified:    src/java/org/apache/torque/oid IDBroker.java
>   Log:
>   no longer ignoring the connection passed into the getIdAsXXX methods as
>   it might be part of a transaction.
>
>   Revision  Changes    Path
>   1.12      +106 -47  
> jakarta-turbine-torque/src/java/org/apache/torque/oid/IDBroker.java
>
>   Index: IDBroker.java
>   ===================================================================
>   RCS file:
> /home/cvs/jakarta-turbine-torque/src/java/org/apache/torque/oid/IDBroker.ja
>va,v retrieving revision 1.11
>   retrieving revision 1.12
>   diff -u -r1.11 -r1.12
>   --- IDBroker.java   6 Feb 2002 15:18:56 -0000       1.11
>   +++ IDBroker.java   9 Apr 2002 15:23:01 -0000       1.12
>   @@ -113,7 +113,7 @@
>     *
>     * @author <a href="mailto:[EMAIL PROTECTED]";>Frank Y. Kim</a>
>     * @author <a href="mailto:[EMAIL PROTECTED]";>John D. McNally</a>
>   - * @version $Id: IDBroker.java,v 1.11 2002/02/06 15:18:56 mpoeschl Exp $
>   + * @version $Id: IDBroker.java,v 1.12 2002/04/09 15:23:01 jmcnally Exp $
>     */
>    public class IDBroker
>        implements Runnable, IdGenerator
>   @@ -288,7 +288,7 @@
>        public int getIdAsInt(Connection connection, Object tableName)
>            throws Exception
>        {
>   -        return getIdAsBigDecimal(null, tableName).intValue();
>   +        return getIdAsBigDecimal(connection, tableName).intValue();
>        }
>
>
>   @@ -305,7 +305,7 @@
>        public long getIdAsLong(Connection connection, Object tableName)
>            throws Exception
>        {
>   -        return getIdAsBigDecimal(null, tableName).longValue();
>   +        return getIdAsBigDecimal(connection, tableName).longValue();
>        }
>
>        /**
>   @@ -322,7 +322,7 @@
>                                            Object tableName)
>            throws Exception
>        {
>   -        BigDecimal[] id = getNextIds((String)tableName, 1);
>   +        BigDecimal[] id = getNextIds((String)tableName, 1, connection);
>            return id[0];
>        }
>
>   @@ -339,13 +339,12 @@
>        public String getIdAsString(Connection connection, Object tableName)
>            throws Exception
>        {
>   -        return getIdAsBigDecimal(null, tableName).toString();
>   +        return getIdAsBigDecimal(connection, tableName).toString();
>        }
>
>
>        /**
>   -     * A flag to determine the timing of the id generation
>   -     *
>   +     * A flag to determine the timing of the id generation     *
>         * @return a <code>boolean</code> value
>         */
>        public boolean isPriorToInsert()
>   @@ -386,6 +385,22 @@
>                                                    int numOfIdsToReturn)
>            throws Exception
>        {
>   +        return getNextIds(tableName, numOfIdsToReturn, null);
>   +    }
>   +
>   +    /**
>   +     * This method returns x number of ids for the given table.
>   +     *
>   +     * @param tableName The name of the table for which we want an id.
>   +     * @param numOfIdsToReturn The desired number of ids.
>   +     * @return A BigDecimal.
>   +     * @exception Exception Database error.
>   +     */
>   +    public synchronized BigDecimal[] getNextIds(String tableName,
>   +                                                int numOfIdsToReturn,
>   +                                                Connection connection)
>   +        throws Exception
>   +    {
>            if (tableName == null)
>            {
>                throw new Exception ("getNextIds(): tableName == null");
>   @@ -413,7 +428,7 @@
>                {
>                    category.info ("Forced id retrieval - " +
> availableIds.size()); }
>   -            storeIDs(tableName, true);
>   +            storeIDs(tableName, true, connection);
>                availableIds = (List)ids.get(tableName);
>            }
>
>   @@ -515,7 +530,7 @@
>                    category.info("IDBroker thread checking for more keys on
> table: " + tableName);
>                    List availableIds = (List)ids.get(tableName);
>   -                int quantity = getQuantity(tableName).intValue();
>   +                int quantity = getQuantity(tableName, null).intValue();
>                    if ( quantity > availableIds.size() )
>                    {
>                        try
>   @@ -523,7 +538,7 @@
>                            // Second parameter is false because we don't
>                            // want the quantity to be adjusted for thread
>                            // calls.
>   -                        storeIDs(tableName, false);
>   +                        storeIDs(tableName, false, null);
>                            category.info("Retrieved more ids for table: " +
>                                     tableName);
>                        }
>   @@ -585,7 +600,7 @@
>                             tableName);
>                    // Increase quantity, so that hopefully this does not
>                    // happen again.
>   -                float rate = getQuantity(tableName).floatValue()
>   +                float rate = getQuantity(tableName, null).floatValue()
>                        / (float)timeLapse;
>                    quantityStore.put(tableName,
>                        new
> BigDecimal(Math.ceil(sleepPeriod*rate*safetyMargin))); @@ -604,7 +619,8 @@
>         * @exception Exception, a generic exception.
>         */
>        private void storeIDs(String tableName,
>   -                          boolean adjustQuantity)
>   +                          boolean adjustQuantity,
>   +                          Connection connection)
>            throws Exception
>        {
>            BigDecimal nextId = null;
>   @@ -624,33 +640,29 @@
>                DBConnection dbCon = null;
>                try
>                {
>   -                String databaseName = dbMap.getName();
>   -
>   -                // Get a connection to the db by starting a
>   -                // transaction.
>   -                if (transactionsSupported)
>   +                if (connection == null)
>                    {
>   -                    dbCon = BasePeer.beginTransaction(databaseName);
>   -                }
>   -                else
>   -                {
>   -                    dbCon = Torque.getConnection(databaseName);
>   +                    String databaseName = dbMap.getName();
>   +                    // Get a connection to the db by starting a
>   +                    // transaction.
>   +                    if (transactionsSupported)
>   +                    {
>   +                        dbCon = BasePeer.beginTransaction(databaseName);
>   +                    }
>   +                    else
>   +                    {
>   +                        dbCon = Torque.getConnection(databaseName);
>   +                    }
>   +                    connection = dbCon.getConnection();
>                    }
>   -                Connection connection = dbCon.getConnection();
>   -
>   +
>                    // Write the current value of quantity of keys to grab
>                    // to the database, primarily to obtain a write lock
>                    // on the table/row, but this value will also be used
>                    // as the starting value when an IDBroker is
>                    // instantiated.
>   -                quantity = getQuantity(tableName);
>   -                Criteria criteria = new Criteria(2)
>   -                    .add( QUANTITY, quantity );
>   -                Criteria selectCriteria = new Criteria(2)
>   -                    .add( TABLE_NAME, tableName );
>   -                criteria.setDbName(dbMap.getName());
>   -                selectCriteria.setDbName(dbMap.getName());
>   -                BasePeer.doUpdate( selectCriteria, criteria, dbCon );
>   +                quantity = getQuantity(tableName, connection);
>   +                updateQuantity(connection, tableName, quantity);
>
>                    // Read the next starting ID from the ID_TABLE.
>                    BigDecimal[] results = selectRow(connection, tableName);
>   @@ -659,16 +671,16 @@
>                    // Update the row based on the quantity in the
>                    // ID_TABLE.
>                    BigDecimal newNextId = nextId.add(quantity);
>   -                updateRow(connection, tableName, newNextId.toString() );
>   +                updateNextId(connection, tableName, newNextId.toString()
> );
>
>   -                if (transactionsSupported)
>   +                if (transactionsSupported && dbCon != null)
>                    {
>                        BasePeer.commitTransaction(dbCon);
>                    }
>                }
>                catch (Exception e)
>                {
>   -                if (transactionsSupported)
>   +                if (transactionsSupported && dbCon != null)
>                    {
>                        BasePeer.rollBackTransaction(dbCon);
>                    }
>   @@ -676,7 +688,7 @@
>                }
>                finally
>                {
>   -                if (!transactionsSupported)
>   +                if (!transactionsSupported && dbCon != null)
>                    {
>                        // Return the connection to the pool.
>                        Torque.releaseConnection(dbCon);
>   @@ -713,7 +725,7 @@
>         * @param tableName The name of the table we want to query.
>         * @return An int with the number of ids cached in memory.
>         */
>   -    private BigDecimal getQuantity(String tableName)
>   +    private BigDecimal getQuantity(String tableName, Connection
> connection) {
>            BigDecimal quantity = null;
>
>   @@ -732,11 +744,13 @@
>                DBConnection dbCon = null;
>                try
>                {
>   -                String databaseName =
> tableMap.getDatabaseMap().getName(); -
>   -                // Get a connection to the db
>   -                dbCon = Torque.getConnection(databaseName);
>   -                Connection connection = dbCon.getConnection();
>   +                if (connection == null)
>   +                {
>   +                    String databaseName =
> tableMap.getDatabaseMap().getName(); +                    // Get a
> connection to the db
>   +                    dbCon = Torque.getConnection(databaseName);
>   +                    connection = dbCon.getConnection();
>   +                }
>
>                    // Read the row from the ID_TABLE.
>                    BigDecimal[] results = selectRow(connection, tableName);
>   @@ -754,7 +768,10 @@
>                    // Return the connection to the pool.
>                    try
>                    {
>   -                    Torque.releaseConnection(dbCon);
>   +                    if (dbCon != null)
>   +                    {
>   +                        Torque.releaseConnection(dbCon);
>   +                    }
>                    }
>                    catch (Exception e)
>                    {
>   @@ -824,9 +841,9 @@
>         * @param id An int with the value to set for the id.
>         * @exception Exception Database error.
>         */
>   -    private void updateRow(Connection con,
>   -                           String tableName,
>   -                           String id)
>   +    private void updateNextId(Connection con,
>   +                              String tableName,
>   +                              String id)
>            throws Exception
>        {
>
>   @@ -842,7 +859,49 @@
>
>            Statement statement = null;
>
>   -        category.debug("updateRow: " + stmt.toString());
>   +        category.debug("updateNextId: " + stmt.toString());
>   +
>   +        try
>   +        {
>   +            statement = con.createStatement();
>   +            statement.executeUpdate( stmt.toString() );
>   +        }
>   +        finally
>   +        {
>   +            if (statement != null) statement.close();
>   +        }
>   +    }
>   +
>   +
>   +    /**
>   +     * Helper method to update a row in the ID_TABLE.
>   +     *
>   +     * @param con A Connection.
>   +     * @param tableName The properly escaped name of the table to
> identify the +     * row.
>   +     * @param id An int with the value to set for the id.
>   +     * @exception Exception Database error.
>   +     */
>   +    private void updateQuantity(Connection con,
>   +                                String tableName,
>   +                                BigDecimal quantity)
>   +        throws Exception
>   +    {
>   +
>   +
>   +        StringBuffer stmt =
>   +            new StringBuffer(quantity.toString().length() +
> tableName.length() +                             + 50);
>   +            stmt.append( "UPDATE " + ID_TABLE )
>   +            .append( " SET QUANTITY = " )
>   +            .append( quantity )
>   +            .append( " WHERE TABLE_NAME = '" )
>   +            .append( tableName )
>   +            .append( '\'' );
>   +
>   +        Statement statement = null;
>   +
>   +        category.debug("updateQuantity: " + stmt.toString());
>
>            try
>            {

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

Reply via email to