ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Nabours <MNabo...@peabodyenergy.com>
Subject com.ibatis.common.util.Throttle not decrementing Session counter causes application to hang
Date Thu, 03 Feb 2005 18:50:57 GMT




Hello,

I have a rather serious problem to which we need a quick resolution.

In brief, the increment method on the Throttle class is being called for
sessions after executing SqlMapClient.setUserConnection()  but the
corresponding decrement method is never being called.  After we reach the
session limit configured in sql-map-config.xml the application hangs hard!

Here are some of the specifics, we are using iBATIS to map data from a
database to our own set of data objects.  However, we are not using iBATIS
to acquire the database connections; we are externally providing them to
the iBATIS SqlMapClient through the setUserConnection method, and we clear
the transaction out by calling setUserConnection and passing null for the
connection.  We have our own connection acquisition code that we use and
therefore we do not even have a transactionManager element configured
within sql-map-config.xml -- we would prefer not to have to configure it
since it requires a data source to be configured and our connection
acquisition code if highly flexible to use different types of connection
ion various environments.  It's my understanding that it is perfectly
acceptable to use iBATIS by providing external connections as long as you
handle all of  your transactional requirements (which we do).

I have attached the following test case  that illustrates the problem.  We
have configured the maximum session count to 75.  Don't read too much into
our test case code as it acquires a single connection and immediately
closes it so that we don't leave the connection open when the test case
freezes.  We loop 80 times and we hang after 75 iterations.

/*
 * Created on Feb 3, 2005.
 */
package com.alliancesys.common.ibatis.testing;

import java.io.Reader;
import java.sql.Connection;
import java.sql.SQLException;

import com.alliancesys.common.jdbc.DatabaseConnectionService;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

import junit.framework.TestCase;

/**
 * <code>{@link SqlMapClientSessionTest}</code>
 *
 */
public class SqlMapClientSessionTest extends TestCase {

      private int threadCounter = 0;

      public SqlMapClientSessionTest(String arg0) {
            super(arg0);
      }

      public static void main(String[] args) {
            junit.textui.TestRunner.run(SqlMapClientSessionTest.class);
      }

      private synchronized void writeCount(){
            threadCounter++;
            System.out.println("Thread " + threadCounter + " completed.");
      }

      public void testThrottleSessionLock() throws Exception {

            final Connection connection  =
DatabaseConnectionService.getNewConnection();
            connection.close();
            Reader reader =
                  Resources.getResourceAsReader(
                        getClass().getClassLoader(),
                        "sql-map-config.xml");
            final SqlMapClient sqlMapClient =
SqlMapClientBuilder.buildSqlMapClient(reader);
            for (int i = 0; i < 80; i++) {

                  Runnable runnable = new Runnable() {
                        public void run() {
                              try {
                                    SqlMapClient client = sqlMapClient;
                                    Connection cn = connection;
                                    client.setUserConnection(cn);
                                    client.setUserConnection(null);
                                    writeCount();
                              } catch (SQLException e) {

                                    e.printStackTrace();
                              }
                        }
                  };

                  Thread t = new Thread(runnable);
                  t.start();

            }


      }

}

If you run it, you will notice that if you have max sessions configured to
75 it hangs after completion of the 75 thread.

Our sql-map-config.xml file is as follows:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "
http://www.ibatis.com/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

      <properties
            resource="ibatis.properties" />

      <settings
            cacheModelsEnabled="true"
            enhancementEnabled="true"
            maxSessions="75"
            maxTransactions="20"
            maxRequests="140" />

      <sqlMap resource="Contact.xml" />

</sqlMapConfig>

We are hoping that it is a configuration problem, but we suspect that the
decrement method on Throttle needs to be called.  Please provide us with a
solution that would prevent this from happening.

Let me thank you in advance for you help.  iBATIS is an great product, but
this is currently preventing us from moving through QA into production.

Thanks,
Mark Nabours

(See attached file: sql-map-config.xml)(See attached file:
SqlMapClientSessionTest.java)


-----------------------------------------
E-mail Disclaimer:  The information contained in this e-mail, and in any
accompanying  documents, may constitute confidential and/or legally
privileged  information.  The information is intended only for use by the
designated recipient.  If you are not the intended recipient (or
responsible for the delivery of the message to the intended recipient),
you are hereby notified that any dissemination, distribution, copying,  or
other use of, or taking of any action in reliance on this e-mail  is
strictly prohibited. If you have received this email communication  in
error, please notify the sender immediately and delete the message  from
your system.

Mime
View raw message