ABAP MDM Connection Pool concept? Slow Performance in call

Hi,
I'm playing around with the MDM ABAP API, and I found the performance a bit disappointing.
I followed the guide "How To identify master data records using SAP MDM 5.5 ABAP API's" and wrote a test program.
The program makes a connection, triggers an MDM query, and disconnects.
    CREATE OBJECT api
      EXPORTING
        iv_log_object_name = logical_object_name.
    api->mo_accessor->connect( language ).
* Query parameters
    ls_query-parameter_code = 'Material_Number'.
    ls_query-operator = 'CS'.
    ls_query-dimension_type = 1.
    ls_query-constraint_type = 8.
    ls_value = '70'.
    GET REFERENCE OF ls_value INTO ls_query-value_low.
    APPEND ls_query TO lt_query.
    CLEAR ls_query.
* Search
    CALL METHOD api->mo_core_service->query
      EXPORTING
        iv_object_type_code = 'Products'
        it_query            = lt_query
        iv_hits_max         = 10
      IMPORTING
        et_result_set       = lt_result_set.
Connection is really fast (a split second)
First time triggered 'query' method took about 30-50 seconds.
Second time triggering 'query' method took a split second.
Further to my investigation, I found out the most expensive code lies in
CL_MDM_PROVIDER_SP04_PL03->IF_MDM_CORE_SERVICES~QUERY
*--- load field meta data ---*
  IF mt_mdm_field_meta_data IS INITIAL
  OR mt_field_meta_data     IS INITIAL.
    CALL METHOD me->_load_field_information.
  ENDIF.
Within this method loadfield_information, it rips all the table and structure information
from MDM, and ALL language texts and so on.
It has many loops, and within the loops querying MDM for more information.
Is there anyway to speed this up?
Why aren't these data cached? (They don't change so often in a production environment)
I also found a shared memory class CL_MDM_METADATA_ACCESS but it is not used anywhere.
No shared memory area relevant is delivered by SAP as well.
Any ideas?
Cheers,
Michael.

Hi Michael,
you're welcome.
I'm not sure how the Connection Pooling to MDM is really done by the ABAP APIs as I'm unfortunately not an API developer but just use the API for my programms.
What I learned during this process is that the repository meta data (meaning table descriptions, and so on) have to be loaded at least once for each connection. This makes sense because a repository can always be changed manually by any user. And I don't think that it would be faster to hold the meta data persistent in the ABAP layer because then you would need to compare the ABAP available meta information with the current meta information of the repository. This could take even longer.
I've solved this "issue" in a way that I really rely on the connection because a single connection is very stable. So I call the "CONNECT" only once in the very beginning, run through my coding and the very last step is the "DISCONNECT". As long as a connection is available, the meta data is cached in the API layer (at least this is the case for SP05).
BR Michael

Similar Messages

  • ABAP MDM Connection Pool

    Hi,
    I'm trying to write a report that extracts information from MDM. Everytime it's called, it has to establish a new connection to MDM where the hand-shake takes about 20-30 secs.
    I was wondering if ABAP MDM Connection Pooling exist.
    In Java MDM, you can configure J2EE with connection pool, so that you can reuse a connection rather than re-establishing a new connection on every call.
    I've read Thomas Jung's WIKI on "How do you implement a MDM Connection Help Class?", however I cannot reuse this class. The static attribute in the class is not persisted.
    Did I do something wrong?
    I tried turning it into a shared memory root class, however it complains about an object reference still exist and would not allow me to do "dettach_commit( )".
    Don't know any other ways to store the connection handle in memory.
    Export/Import, SPA/GPA are not OO friendly.
    Cheers
    Michael

    Hi Andreas,
    Thanks for your reply, it is good to confirm my understanding of the ABAP API connection.
    For your interest, I have changed part of the connection code to increase the speed of the connection significantly.
    Firstly to clarify, the connection from the ABAP stack to MDM is actually quite fast.
    Upon the first call, the method CL_MDM_PROVIDER_SP04_PL03->_LOAD_FIELD_INFORMATION is called which reads the META-DATA from MDM for every table and every field. This could normally take 1 minute in our system landscape. I've changed to code to buffer the meta-data.
    In a production/stable environment, it is unlikely for the META-DATA to change rapidly. Hence reading this on every connection is a waste of time.
    This could be useful only if we are in implementation phase where this changes all the time.
    1) In transaction MDMAPIC, I've added the ABAP implementation for MDM Version Support as my own MDM provider class ZSP04_PL03 with provider type ZCL_MDM_PROVIDER_SP04_PL03.
    ZCL_MDM_PROVIDER_SP04_PL03 is a copy of CL_MDM_PROVIDER_SP04_PL03.
    2) In ZCL_MDM_PROVIDER_SP04_PL03, the method LOADFIELD_INFORMATION is changed to read from buffer first before calling MDM. If the buffer is empty, it will read from MDM and store result into buffer etc.
    I'm storing the information in a transparent table at the moment.
    I buffer the three class attributes:
    - mt_field_meta_data,
    - mt_mdm_field_meta_data,
    - mt_field_code2id_map.
    As MT_FIELD_META_DATA is a complex structure (i.e. tables within table), I had to split it up into many different tables.
    I can provide the code if you are interested.
    Cheers,
    Michael.

  • Connection pooling problem in web service call

    Hi,
    I want to create some REST web services which will be called frequently by other applications (making calls at each 4-5 seconds).
    During the day there can be several instances active (20-30) which will use those web services. In conclusion there will be many database calls.
    What's the best solution to avoid seeing JDBC connection failure in weblogic console and to use connection pooling properly?
    1. Use createRootApplicationModule and after that call release
    2. Get the datasource instance and after that do whatever business (get VOs, methods etc.)
    ...or there is another solution?
    Thanks.
    Edited by: DorinS on 03.11.2011 12:02

    Hi,
    If the POJO you use to expose the service stays in memory then you don't need to close the AM reference. However, what you really want to do is to use JDBC Datasources with your AM configuration so the server manages a pool of database connections the AM then reaches out to
    Frank

  • Oracle.DataAccess 2.112.1.0 - Connection Pool Problem

    Hi,
    Oracle.DataAccess 2.112.1.0 is having connection pool problem. The no. of TCP connections to Oracle database keep increasing untill the server's session run out of limit. My application created connections, use them, close them, and dispose them properly. When using previous Oracle.DataAccess 2.111.6.20, the no. of TCP connections do not increase.
    My database connection string has "Min Pool Size = 3 and Max Pool Size = 150".
    With 2.111.6.20 version, TCP connection stays at 3.
    With 2.112.1.0, TCP connection keep increasing for every 5 minutes. I've tried to disable Self Tuning, but still can't prevent the connections from increasing.
    Later today, I downloaded Oracle.DataAccess 2.112.1.2 (it comes with ODAC 11.2.0.1.2) and test again, the problem is resolved... no more connection increases... but.... it is only for 32 bit Windows.
    Unfortunately, there is no Oracle.DataAccess 2.112.1.2 for 64 bit Windows Server 2008.
    May I know how can i resolve this problem on 64bit Window installed with Oracle 11g R2 client, which comes with Oracle.DataAccess 2.112.1.0, which has serious problems...(according to this 11.2 ODP.NET causing test runner failures )
    Many thanks for your time and answers!
    Edited by: user1502907 on 04-Sep-2010 23:01

    Hi,
    The only thing that jumps out within your problem description is that connections are being increased every 5 minutes. Are you sure its every 5 minutes and not 3 minutes which is the timing interval used by the Connection Pool facility to perform connection pool maintenance. If this occurs even when the application is idle then you could be running into the following known issue filed against 11.2.0.1.0 and fixed in 11.2.0.1.2.
    Bug 9711600 - CONNECTIONS INCREASE BEYOND MAX POOL SIZE EVERY 3 MINUTE
    This is specific to using the option CommandBehavior.CloseConnection when calling execute reader. Are you using this option and then also closing the connection in code before the datareader object is closed, if so you may be hitting this bug. You can also generate an ODP trace at level 15 of the behavior and if you see negative pool counts, that is also a diagnostic that points to this bug.
    This is fixed in 11.2.0.1.0 Patch 3 or later for x64. If you have support, I recommend you open a service request to verify if this is your issue and if a patch set may help you.
    Regards
    Jenny B.

  • What is Connection Pooling

    Hi Friends
    What is "Connection Pooling"
    I am developing Java Application using ms sql server 2000 database
    Pl explain me about this
    thanxinadvance
    yours
    Rajesh

    In a basic DataSource implementation, there is a 1:1 correspondence between the
    client�s Connection object and the physical database connection. When the
    Connection object is closed, the physical connection is dropped. Thus, the
    overhead of opening, initializing, and closing the physical connection is incurred for
    each client session.
    A connection pool solves this problem by maintaining a cache of physical database
    connections that can be reused across client sessions. Connection pooling greatly
    improves performance and scalability, particularly in a three-tier environment where
    multiple clients can share a smaller number of physical database connections.
    Nitin

  • Oracle: slow performance with SELECT using ojdbc14 and connection pooling

    Hello,
    i'm working hard the last days to solve a performance problem with our customer using a oracle 10g database. For testing I used our oracle 9.2.0.1.0 database which shows the same symptoms. All doing solved nothing: the performance while using this oracle is much slower than other databases. This result I cannot trust and so I need some advice. What is missing to improve the performance on the java side?
    The webapplication I use runs fast on MySQL 4.x and SQLServer 2000, but on the above mentioned Oracle it was always 4 times slower. The webapplication uses a lot of simple SELECT-Statements without complicated joins and so on (because it should run on many different databases). Doing some days of creating tests within this webapplication, I was not able to find any entrance point for a change. All databases server I'm using, having only the default configurations after a common installation.
    To reduce the complexity I wrote a simple java application with connection pooling using only the latest libraries from apache-commons(dbcp, pool), and the latest ojdbc14 for oracle 9.2.
    First the results than the code: MySQL needed less than 1000 millisecond, SQLServer around 1000 milliseconds and Oracle over 2000 milliseconds. I stopped pooling and the results are for Oracle even worse: over 18000 milliseconds (mysql:2500, sqlserver:4100).
    I changed the classes for Oracle and used the class oracle.jdbc.pool.OracleConnectionCacheImpl from the ojdbc14-library. No difference (around 100 milliseconds more or less).
    The only Select-Statement works on this table, which has one index on HICTGID.
    It contains 259 entrances.:
    CREATE TABLE HIERARCHYCATEGORY (
      HICTGID                 NUMBER (19)   NOT NULL,
      HICTGLEVEL              NUMBER (10)   NOT NULL,
      HICTGEXTID              NUMBER (19)   NOT NULL,
      HICTGEXTPARENTID        NUMBER (19)   NOT NULL,
      HICTGNAME               VARCHAR2(255) NOT NULL
    );The application simply loops through this table using
    SELECT Hictgid, Hictgname FROM HIERARCHYCATEGORY WHERE HICTGID = ?, but I always open a connection before this query and closes this connection afterwards. So I use the pooling as much as possible. That's all SQL I'm using.
        protected static DataSource setupDataSource(String sDriver, String sUrl, String sUser, String sPwd) throws SQLException {
            BasicDataSource ds = new BasicDataSource();
            ds.setDriverClassName(sDriver);
            ds.setUsername(sUser);
            ds.setPassword(sPwd);
            ds.setUrl(sUrl);
            // The maximum number of active connections:
            ds.setMaxActive(3);
            // The maximum number of active connections that can remain idle in the pool,
            // without extra ones being released, or zero for no limit:
            ds.setMaxIdle(3);
            // The maximum number of milliseconds that the pool will wait (when there are no available connections)
            // for a connection to be returned before throwing an exception, or -1 to wait indefinitely:
            ds.setMaxWait(3000);    
            return ds;
        }I can switch by using external properties between three databases (oracle, mysql and sqlserver) and if I want I can switch pooling off. And all actions I'm interested are logged by Log4J.
        public static Connection getConnection() throws SQLException {
            Connection result = null;
            String sJdbcDriver = m_oJbProp.getString("jdbcDriver");
            String sJdbcUrl = m_oJbProp.getString("databaseConnection");
            String sJdbcUser = m_oJbProp.getString("dbUsername");
            String sJdbcPwd = m_oJbProp.getString("dbPassword");
                try {
                    if (m_oJbProp.getString("useConnectionPooling").equals("true")) {
                         if (log.isDebugEnabled()) {
                              log.debug("ConnectionPooling true");
                        if(null == m_ds) {
                            m_ds = setupDataSource(sJdbcDriver,sJdbcUrl,sJdbcUser,sJdbcPwd);
                              if (log.isDebugEnabled()) {
                                   log.debug("DataSource created");
                        result = m_ds.getConnection();
                    } else {
                        // No connection pooling:
                         if (log.isDebugEnabled()) {
                              log.debug("ConnectionPooling false");
                        try {
                            Class.forName(sJdbcDriver);
                            result = DriverManager.getConnection(sJdbcUrl, sJdbcUser, sJdbcPwd);
                        } catch (ClassNotFoundException cnf) {
                            log.error("Exception: Class Not Found. ", cnf);
                            System.exit(0);
    (.. ErrorHandling ...)Here is the code fragment which is doing the work:
                     StringBuffer sb = new StringBuffer();
                while (lNextBottom <= lNextCeiling) {
                     con = getConnection();
                     innerSelStmt = con.prepareStatement("SELECT Hictgid, Hictgname FROM HIERARCHYCATEGORY WHERE HICTGID = ?");
                     innerSelStmt.setLong(1, lNextBottom);
                     rsInner = innerSelStmt.executeQuery();
                     if ((rsInner != null) && (rsInner.next())) {
                         sb.append(rsInner.getLong(1) + ", " + rsInner.getString(2) + "\r");
                          if (log.isDebugEnabled()) {
                               log.debug("Inner Statement: " + rsInner.getLong(1) + "\r");
                     rsInner.close();
                     con.close();
                     lNextBottom++;
                 if (log.isInfoEnabled()) {
                      log.info("\rResult values: Hictgid, Hictgname \r");
                      log.info(sb.toString());
                 }and the main method:
        public static void main(String[] args) {
            try {
                 long lStartTime = System.currentTimeMillis();
                 JdbcBasic oJb = new JdbcBasic();
                 boolean bSuccess = false;
                 bSuccess = oJb.getHierarchycategories();
                 if (log.isInfoEnabled()) {
                      log.info("Running time: " + (System.currentTimeMillis() - lStartTime));
                 if (null != m_ds) {
                     printDataSourceStats(m_ds);
                      shutdownDataSource(m_ds);
                      if (log.isInfoEnabled()) {
                           log.info("Datasource closed.");
             } catch (SQLException sqe) {
                  log.error("SQLException within  main-method", sqe);
        }My database values are
    databaseConnection=jdbc:oracle:thin:@SERVERDB:1521:ora
    jdbcDriver=oracle.jdbc.driver.OracleDriver
    databaseConnection=jdbc:jtds:sqlserver://SERVERDB:1433/testdb
    jdbcDriver=net.sourceforge.jtds.jdbc.Driver
    databaseConnection=jdbc:mysql://localhost/testdb
    jdbcDriver=com.mysql.jdbc.Driver
    dbUsername=testusr
    dbPassword=testpwdThanks for your reading and maybe for your help.

    A few comments.
    There is of course another difference between your test cases then just the database. There is also the driver. And I suspect that in at least the case with the jtds driver it is helping you along where you are doing something silly and the Oracle driver is not.
    Before I explain the next part I would say the speed differences between MS-SQL and MySQL look about right I think you are aiming here for MS-SQL level performance not MySQL. (For a bunch of reasons MySQL is inherently faster but there are MANY drawbacks as well which have been well discussed on previous threads)
    Here is where I believe your problem lies
    while (lNextBottom <= lNextCeiling) {
                     con = getConnection();
                     innerSelStmt = con.prepareStatement("SELECT Hictgid, Hictgname FROM HIERARCHYCATEGORY WHERE HICTGID = ?");
                     innerSelStmt.setLong(1, lNextBottom);
                     rsInner = innerSelStmt.executeQuery();
                     if ((rsInner != null) && (rsInner.next())) {
                         sb.append(rsInner.getLong(1) + ", " + rsInner.getString(2) + "\r");
                          if (log.isDebugEnabled()) {
                               log.debug("Inner Statement: " + rsInner.getLong(1) + "\r");
                     rsInner.close();
                     con.close();
                     lNextBottom++;
                 }There at least four things that are wrong with above.
    1) Why are you preparing the statement INSIDE the loop. Let us for a moment say that the loop will spin 100 times. That means that you are preparing the same statement 100 times. This is bad. It is also very relevant because for example the Jtds driver is going to be caching the prepared statements you make so that actually while you try and prepare it 100 times it only actually does it once... but in Oracle I don't know what it is doing for sure but if it is preparing on each pass well than that bit of it is going take 100 times longer then it should.
    2) You are opening and closing the connection on each pass through the loop... also a terrible idea. You need to fix this first so that you can repeatedly use the same prepared statement.
    3) Why are you looping in the first place? More on this later.
    4) Where do you close the PreparedStatement? It doesn't look like you do.
    Okay so for starters your loop should look a lot more like this...
    code]
    con = getConnection();
    innerSelStmt = con.prepareStatement("SELECT Hictgid, Hictgname FROM HIERARCHYCATEGORY WHERE HICTGID = ?");
    while (lNextBottom <= lNextCeiling) {
    innerSelStmt.setLong(1, lNextBottom);
    rsInner = innerSelStmt.executeQuery();
    if ((rsInner != null) && (rsInner.next())) {
    sb.append(rsInner.getLong(1) + ", " + rsInner.getString(2) + "\r");
    rsInner.close();
    lNextBottom++;
    innerSelStmt.close();
    con.close();
    I think the code above (and you can put your debug stuff back if you want) which uses ONE connection and ONE prepared Statement will improve your performance dramatically.
    The other question though I would as is why in the hell you are doing 100 or whatever number of queries anyway. This can be done all in ONE query which again will improve performance.
    Your query and such should look like this I think.
    String sql = "SELECT Hictgid, Hictgname FROM HIERARCHYCATEGORY WHERE HICTGID >=? AND HICTGID<=?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setLong(1,lNextBottom );
    ps.setLong(2,lNextCeiling);
    ResultSet rs = ps.executeQuery();
    while(rs.next()){
      // your appending to string buffer code goes here
    }and I can't understand why you're not doing that in the first place.

  • performance CONNECTION POOLING BC4J

    When Application was used by 80 users it work wery slow I think problem in CONNECTION POOLING
    private Map m_pools;
    public static final String[] APP_MODULE_NAMES = {
    "StaffAppModule", "DossierAppModule", "ProcedureAppModule",
    "ReportAppModule"
    public static final String[] APP_MODULE_CONFIGURATION_NAMES = {
    "StaffAppModuleLocal", "DossierAppModuleLocal",
    "ProcedureAppModuleLocal", "ReportAppModuleLocal"
    ******* initialize pool START ********
    m_pools = new HashMap();
    PoolMgr mgr = PoolMgr.getInstance();
    for (int i = 0; i < APP_MODULE_NAMES.length; i++) {
    String poolName = APP_MODULE_NAMES[i] + "Pool";
    ApplicationPool pool = mgr.findPool(poolName, PACKAGE,
    APP_MODULE_CONFIGURATION_NAMES, null);
    if (pool == null) {
    pool = mgr.createPool(poolName, PACKAGE,
    APP_MODULE_CONFIGURATION_NAMES[i], null);
    m_pools.put(APP_MODULE_NAMES[i], pool);
    ******* initialize pool END ********
    ****** getAppModule START ***************
    ApplicationPool pool = (ApplicationPool) m_pools.get(name);
    log.debug("{ -- BusinessService ");
    if (pool == null) {
    return null;
    SessionCookie sesCookie = pool.createSessionCookie(name,
    IdFactory.createID(), null);
    ApplicationModuleImpl appModule;
    synchronized (this) {
    log.debug("} -- synchronized ");
    appModule = (ApplicationModuleImpl) sesCookie.useApplicationModule();
    System.out.println("^^^ -- "+appModule.getClass());
    appModule.setProperty(APP_MODULE_PROPERTY_SESSION_COOKIE, sesCookie);
    return appModule;
    ****** getAppModule START ***************
    <<< Can you help me performance CONNECTION POOLING ??? >>>

    A Exception is thrown.

  • Low Application Performance due to AM connection pooling configuration

    Hi All,
    My application performance is too slow due to default App module connection pooling parameters. I started exploring on these parameters in oracle documentation and was stopped due to some doubts.
    The below link is actually the one from which I'm doing the configuration.
    http://docs.oracle.com/cd/E21764_01/web.1111/b31974/bcampool.htm
    1. I want to know what value should be in Weblogic server --> Maximum capacity (I think they confused me a little saying it can be equal to AM's Maximum Pool Size, Maximum Available Size, Minimum Available Size).
    2. Then the AM's Initial pool size should be equal to the weblogic's Initial Capacity. I have 10 AM, if I'm setting 100 in each AM, then the corresponding weblogic's initial capacity should be equal to 100 or 100 X 10. Please clarify this.
    Thanks.

    You post give no information which connects the pooling parameter to 'low' performance. Have you checked where all the time is consumed? Which method or part of the application consumes the most time. Before you can't answer these questions you can't link the problem to am pooling.
    Here are some pointers
    http://andrejusb.blogspot.de/2011/10/experimenting-with-adf-bc-application.html
    http://andrejusb.blogspot.de/2012/01/adf-performance-marathon-22-hours.html
    and there are some more articles available on Andrejus's blog...
    Timo

  • So, about a week ago my macbook pro started having lots of issues: wifi connectivity, slow performance, sound issues, spotlight wasn't working. After going through the issues with apple support, they decided the best course of action was to erase it...

    So, about a week ago my macbook pro started having lots of issues: wifi connectivity, slow performance, sound issues, spotlight wasn't working. After going through the issues with apple support, they decided the best course of action was to erase the hard drive and do a reinstall. Since I have a recent backup this seemed like a good enough option. They were kind enough to send me a copy of the snow leopard disk to do the install since we couldn't get it to complete through the disk utility. Not sure why, since it says we are fully connected, it just never completed.
    Anyway, so now that you have the background here is the new issue. The macbook pro keeps spitting out the disk I'm trying to install from. Disk utility and using the 'Startup Disk' function from the apple menu doesn't read the disk.
    Can anyone suggest a solution to this vexing problem?
    Thanks in advance.

    Jeremy.Laurin,
    have you tried agb76’s approach here?

  • Connection pool performance

     

    Barry,
    You should post this to Performance newsgroups (please dont cross post)
    This actually depends on how many execute threads you have - if you have 101
    clients / applications requesting connections concurrently, only the once
    that can get a Execute Thread will actually be able to use a connection and
    complete. Rest of the application requests will be queued up.
    sree
    "Barry Myles" <[email protected]> wrote in message
    news:40b47cdd$1@mktnews1...
    >
    Hi there I wonder if anyone could shine some light on the subject ofconnection
    pooling configuration for me
    In the connection pool If I have
    initial capacity = 50
    Maximum Capacity = 100
    and then get a period with 101 concurrent applications all wanting towrite information
    to the backend database at the same time, what happens to that oneapplication?
    is it forced to wait until a thread becomes available, does it just blockuntil
    this happens or does it give up right away? (if it does what exception
    is generated if any?)
    Also I'm trying to pin down some performance issues with the use ofconnection
    pooling, can someone guide me as to what a typically under performingconfiguration
    for a connection pool would be.

  • Javamail performance and connection pooling

    Dear Javamail users and programmers,
    I am new to javamail. We are working on a commercial web mail project and using Javamail to connect with an IMAP/SMTP clustered server group to read and write mails.
    Our application will have 400000 concurrent users in the system and an Approximate , we will have 200 servers (Glassfish 3 ) and each server will have 2000 active users at time.
    Now my problem! At the moment, we are opening the store each time we read or store mails for each user. I doubt this will have performance issues in production.
    Does anyone have experience using Javamail in this dimension?
    I read the connection pooling mechanism in the package com.sun.mail.imap Descriptio. If i understood correctly, this will require at-least one dedicated connection per user to the server . I think, that will be too many connections at a time for any Imap server cluster system.
    Is there any other method of doing connection pooling?
    Btw in which scenario I should increase the mail.imap.connectionpoolsize to more than one? I assume, i only need to increase this parameter if i want to keep more than one folder open for a particular user at time, isn't it?
    What will be the best approach which suite to our application?
    Thank you very much for any help.
    With regards,
    Alvin Antony

    Connection pooling isn't likely to help in your scenario. IMAP connection pooling does not allow multiple
    users to use the same connection to the server. Unless you want to map all of your web mail users to a
    single IMAP user, connection pooling won't help you.
    The general issue of managing sessions and connections was discussed briefly in this other thread:
    [http://forums.sun.com/thread.jspa?threadID=5423307|http://forums.sun.com/thread.jspa?threadID=5423307]
    I suspect you're going to need to do some experiments to determine the best approach.

  • Real slow performance on 100mbit connection with WRT320N

    I noticed that 100mbit connections on the WRT320N perform realy bad. I tried a XBOX and a Aspire One laptop, both have 100mbit ethernet. Throughput is about 1-2 mbit/s.
    If I put a gbit switch in between peformance is good - 80-90 mbit/s.
    So: 
    100mbit xbox/aspire  > wrt320N > gbitNAS = 1-2 mbit/s
    100mbit xbox/aspire > gbit switch > wrt320N > gbitNAS = 90 mbit/s (nice!)
    for reference: gbit pc > WRT320N > gbitNAS = 200mbit/s (NAS can't perform better)
    I tried various duplex and speed settings on the Aspire (not possible on the XBOX) but that dit not help.
    Can't find any option in the WRT230N to tweak the interfaces. Running the latest firmware avail on this site.
    Anybody suggestions please?

    Yesterday I got my Asus O!Play HDP-R1 player to replace my XBMC@XBOX. The Asus has a 100mbit ethernet port. I connected it to the WRT320N and I was almost sure it would have the same issue, but it did not. It streamed MKV and DVD files without any issues.
    I googled a lot on this issue and found that a lot of people have this issue with the XBOX and other gigabit router/switches. The solution they found is to manual set the switchport to 100mbit full duplex. However this seems not possible on the WRT320N.
    So I think this can be solved by finding the right driver for the 100mbit host (which I guess is a problem for the XBOX..)
    Best would be to have a way to set the switchport to 100mbit full duplex. So I hope Linksys can add this feature, or can advise how to set somehow with the current firmware.

  • Has anyone run the connection pooling for mysql & tomcat successfully?

    I'm trying to set up connection pooling. I'm following the how-to page at
    http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-datasource-examples-howto.html
    But when i test the DBTest/test.jsp file, tomcat displays an error =
    could not load jdbc driver class 'null'(msdos)
    i have placed all the required .jar files in the tomcat lib.
    below is the cofiguration i did to the server.xml file
    <!-- Example Server Configuration File -->
    <!-- Note that component elements are nested corresponding to their
    parent-child relationships with each other -->
    <!-- A "Server" is a singleton element that represents the entire JVM,
    which may contain one or more "Service" instances. The Server
    listens for a shutdown command on the indicated port.
    Note: A "Server" is not itself a "Container", so you may not
    define subcomponents such as "Valves" or "Loggers" at this level.
    -->
    <Server port="8005" shutdown="SHUTDOWN" debug="0">
    <!-- Uncomment these entries to enable JMX MBeans support -->
    <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"
    debug="0"/>
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
    debug="0"/>
    <!-- Global JNDI resources -->
    <GlobalNamingResources>
    <!-- Test entry for demonstration purposes -->
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
    <!-- Editable user database that can also be used by
    UserDatabaseRealm to authenticate users -->
    <Resource name="UserDatabase" auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved">
    </Resource>
    <ResourceParams name="UserDatabase">
    <parameter>
    <name>factory</name>
    <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
    </parameter>
    <parameter>
    <name>pathname</name>
    <value>conf/tomcat-users.xml</value>
    </parameter>
    </ResourceParams>
    </GlobalNamingResources>
    <!-- A "Service" is a collection of one or more "Connectors" that share
    a single "Container" (and therefore the web applications visible
    within that Container). Normally, that Container is an "Engine",
    but this is not required.
    Note: A "Service" is not itself a "Container", so you may not
    define subcomponents such as "Valves" or "Loggers" at this level.
    -->
    <!-- Define the Tomcat Stand-Alone Service -->
    <Service name="Tomcat-Standalone">
    <!-- A "Connector" represents an endpoint by which requests are received
    and responses are returned. Each Connector passes requests on to the
    associated "Container" (normally an Engine) for processing.
    By default, a non-SSL HTTP/1.1 Connector is established on port 8080.
    You can also enable an SSL HTTP/1.1 Connector on port 8443 by
    following the instructions below and uncommenting the second Connector
    entry. SSL support requires the following steps (see the SSL Config
    HOWTO in the Tomcat 4.0 documentation bundle for more detailed
    instructions):
    * Download and install JSSE 1.0.2 or later, and put the JAR files
    into "$JAVA_HOME/jre/lib/ext".
    * Execute:
    %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
    $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (Unix)
    with a password value of "changeit" for both the certificate and
    the keystore itself.
    By default, DNS lookups are enabled when a web application calls
    request.getRemoteHost(). This can have an adverse impact on
    performance, so you can disable it by setting the
    "enableLookups" attribute to "false". When DNS lookups are disabled,
    request.getRemoteHost() will return the String version of the
    IP address of the remote client.
    -->
    <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8081 -->
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
    port="8080" minProcessors="5" maxProcessors="75"
    enableLookups="true" redirectPort="8443"
    acceptCount="100" debug="0" connectionTimeout="20000"
    useURIValidationHack="false" disableUploadTimeout="true" />
    <!-- Note : To disable connection timeouts, set connectionTimeout value
    to -1 -->
    <!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
    <!--
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
    port="8443" minProcessors="5" maxProcessors="75"
    enableLookups="true"
         acceptCount="100" debug="0" scheme="https" secure="true"
    useURIValidationHack="false" disableUploadTimeout="true">
    <Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"
    clientAuth="false" protocol="TLS" />
    </Connector>
    -->
    <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
    port="8009" minProcessors="5" maxProcessors="75"
    enableLookups="true" redirectPort="8443"
    acceptCount="10" debug="0" connectionTimeout="20000"
    useURIValidationHack="false"
    protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <!--
    <Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
    port="8009" minProcessors="5" maxProcessors="75"
    acceptCount="10" debug="0"/>
    -->
    <!-- Define a Proxied HTTP/1.1 Connector on port 8082 -->
    <!-- See proxy documentation for more information about using this. -->
    <!--
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
    port="8082" minProcessors="5" maxProcessors="75"
    enableLookups="true" disableUploadTimeout="true"
    acceptCount="100" debug="0" connectionTimeout="20000"
    proxyPort="80" useURIValidationHack="false" />
    -->
    <!-- Define a non-SSL legacy HTTP/1.1 Test Connector on port 8083 -->
    <!--
    <Connector className="org.apache.catalina.connector.http.HttpConnector"
    port="8083" minProcessors="5" maxProcessors="75"
    enableLookups="true" redirectPort="8443"
    acceptCount="10" debug="0" />
    -->
    <!-- Define a non-SSL HTTP/1.0 Test Connector on port 8084 -->
    <!--
    <Connector className="org.apache.catalina.connector.http10.HttpConnector"
    port="8084" minProcessors="5" maxProcessors="75"
    enableLookups="true" redirectPort="8443"
    acceptCount="10" debug="0" />
    -->
    <!-- An Engine represents the entry point (within Catalina) that processes
    every request. The Engine implementation for Tomcat stand alone
    analyzes the HTTP headers included with the request, and passes them
    on to the appropriate Host (virtual host). -->
    <!-- Define the top level container in our container hierarchy -->
    <Engine name="Standalone" defaultHost="localhost" debug="0">
    <!-- The request dumper valve dumps useful debugging information about
    the request headers and cookies that were received, and the response
    headers and cookies that were sent, for all requests received by
    this instance of Tomcat. If you care only about requests to a
    particular virtual host, or a particular application, nest this
    element inside the corresponding <Host> or <Context> entry instead.
    For a similar mechanism that is portable to all Servlet 2.3
    containers, check out the "RequestDumperFilter" Filter in the
    example application (the source for this filter may be found in
    "$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters").
    Request dumping is disabled by default. Uncomment the following
    element to enable it. -->
    <!--
    <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
    -->
    <!-- Global logger unless overridden at lower levels -->
    <Logger className="org.apache.catalina.logger.FileLogger"
    prefix="catalina_log." suffix=".txt"
    timestamp="true"/>
    <!-- Because this Realm is here, an instance will be shared globally -->
    <!-- This Realm uses the UserDatabase configured in the global JNDI
    resources under the key "UserDatabase". Any edits
    that are performed against this UserDatabase are immediately
    available for use by the Realm. -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    debug="0" resourceName="UserDatabase"/>
    <!-- Comment out the old realm but leave here for now in case we
    need to go back quickly -->
    <!--
    <Realm className="org.apache.catalina.realm.MemoryRealm" />
    -->
    <!-- Replace the above Realm with one of the following to get a Realm
    stored in a database and accessed via JDBC -->
    <!--
    <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
    driverName="org.gjt.mm.mysql.Driver"
    connectionURL="jdbc:mysql://localhost/authority"
    connectionName="test" connectionPassword="test"
    userTable="users" userNameCol="user_name" userCredCol="user_pass"
    userRoleTable="user_roles" roleNameCol="role_name" />
    -->
    <!--
    <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
    driverName="oracle.jdbc.driver.OracleDriver"
    connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
    connectionName="scott" connectionPassword="tiger"
    userTable="users" userNameCol="user_name" userCredCol="user_pass"
    userRoleTable="user_roles" roleNameCol="role_name" />
    -->
    <!--
    <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
    driverName="sun.jdbc.odbc.JdbcOdbcDriver"
    connectionURL="jdbc:odbc:CATALINA"
    userTable="users" userNameCol="user_name" userCredCol="user_pass"
    userRoleTable="user_roles" roleNameCol="role_name" />
    -->
    <!-- Define the default virtual host -->
    <Host name="localhost" debug="0" appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Context path="/my-jsp" docBase="c:\JSP-Files" debug="0"
    privileged="true" reloadable="true" />
         <Context path="" docBase="c:\Inetpub\wwwroot" debug="0" privileged="true" />
    <Context path="/sharon" docBase="C:\Tomcat 4.1\webapps\sharon" debug="0" privileged="true" />
    <!-- Normally, users must authenticate themselves to each web app
    individually. Uncomment the following entry if you would like
    a user to be authenticated the first time they encounter a
    resource protected by a security constraint, and then have that
    user identity maintained across all web applications contained
    in this virtual host. -->
    <!--
    <Valve className="org.apache.catalina.authenticator.SingleSignOn"
    debug="0"/>
    -->
    <!-- Access log processes all requests for this virtual host. By
    default, log files are created in the "logs" directory relative to
    $CATALINA_HOME. If you wish, you can specify a different
    directory with the "directory" attribute. Specify either a relative
    (to $CATALINA_HOME) or absolute path to the desired directory.
    -->
    <!--
    <Valve className="org.apache.catalina.valves.AccessLogValve"
    directory="logs" prefix="localhost_access_log." suffix=".txt"
    pattern="common" resolveHosts="false"/>
    -->
    <!-- Logger shared by all Contexts related to this virtual host. By
    default (when using FileLogger), log files are created in the "logs"
    directory relative to $CATALINA_HOME. If you wish, you can specify
    a different directory with the "directory" attribute. Specify either a
    relative (to $CATALINA_HOME) or absolute path to the desired
    directory.-->
    <Logger className="org.apache.catalina.logger.FileLogger"
    directory="logs" prefix="localhost_log." suffix=".txt"
         timestamp="true"/>
    <!-- Define properties for each web application. This is only needed
    if you want to set non-default properties, or have web application
    document roots in places other than the virtual host's appBase
    directory. -->
    <!-- Tomcat Root Context -->
    <!--
    <Context path="" docBase="ROOT" debug="0"/>
    -->
    <!-- Tomcat Examples Context -->
    <Context path="/examples" docBase="examples" debug="0"
    reloadable="true" crossContext="true">
    <Logger className="org.apache.catalina.logger.FileLogger"
    prefix="localhost_DBTest_log." suffix=".txt"
    timestamp="true"/>
    <Ejb name="ejb/EmplRecord" type="Entity"
    home="com.wombat.empl.EmployeeRecordHome"
    remote="com.wombat.empl.EmployeeRecord"/>
    <!-- If you wanted the examples app to be able to edit the
    user database, you would uncomment the following entry.
    Of course, you would want to enable security on the
    application as well, so this is not done by default!
    The database object could be accessed like this:
    Context initCtx = new InitialContext();
    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    UserDatabase database =
    (UserDatabase) envCtx.lookup("userDatabase");
    -->
    <!--
    <ResourceLink name="userDatabase" global="UserDatabase"
    type="org.apache.catalina.UserDatabase"/>
    -->
    <!-- PersistentManager: Uncomment the section below to test Persistent
              Sessions.
    saveOnRestart: If true, all active sessions will be saved
    to the Store when Catalina is shutdown, regardless of
    other settings. All Sessions found in the Store will be
    loaded on startup. Sessions past their expiration are
    ignored in both cases.
    maxActiveSessions: If 0 or greater, having too many active
    sessions will result in some being swapped out. minIdleSwap
    limits this. -1 means unlimited sessions are allowed.
    0 means sessions will almost always be swapped out after
    use - this will be noticeably slow for your users.
    minIdleSwap: Sessions must be idle for at least this long
    (in seconds) before they will be swapped out due to
    maxActiveSessions. This avoids thrashing when the site is
    highly active. -1 or 0 means there is no minimum - sessions
    can be swapped out at any time.
    maxIdleSwap: Sessions will be swapped out if idle for this
    long (in seconds). If minIdleSwap is higher, then it will
    override this. This isn't exact: it is checked periodically.
    -1 means sessions won't be swapped out for this reason,
    although they may be swapped out for maxActiveSessions.
    If set to >= 0, guarantees that all sessions found in the
    Store will be loaded on startup.
    maxIdleBackup: Sessions will be backed up (saved to the Store,
    but left in active memory) if idle for this long (in seconds),
    and all sessions found in the Store will be loaded on startup.
    If set to -1 sessions will not be backed up, 0 means they
    should be backed up shortly after being used.
    To clear sessions from the Store, set maxActiveSessions, maxIdleSwap,
    and minIdleBackup all to -1, saveOnRestart to false, then restart
    Catalina.
    -->
              <!--
    <Manager className="org.apache.catalina.session.PersistentManager"
    debug="0"
    saveOnRestart="true"
    maxActiveSessions="-1"
    minIdleSwap="-1"
    maxIdleSwap="-1"
    maxIdleBackup="-1">
    <Store className="org.apache.catalina.session.FileStore"/>
    </Manager>
              -->
    <Environment name="maxExemptions" type="java.lang.Integer"
    value="15"/>
    <Parameter name="context.param.name" value="context.param.value"
    override="false"/>
    <Resource name="jdbc/EmployeeAppDb" auth="SERVLET"
    type="javax.sql.DataSource"/>
    <Resource name="jdbc/TestDB"
         auth="Container"
         type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/TestDB">
    <parameter>
         <name>factory</name>
         <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
         </parameter>
         <!-- Maximum number of dB connections in pool. Make sure you
         configure your mysqld max_connections large enough to handle
         all of your db connections. Set to 0 for no limit.
         -->
         <parameter>
         <name>maxActive</name>
         <value>100</value>
         </parameter>
         <!-- Maximum number of idle dB connections to retain in pool.
         Set to 0 for no limit.
         -->
         <parameter>
         <name>maxIdle</name>
         <value>30</value>
         </parameter>
         <!-- Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded. Set to -1 to wait indefinitely.
         -->
         <parameter>
         <name>maxWait</name>
         <value>10000</value>
         </parameter>
    <!-- MySQL dB username and password for dB connections -->
    <parameter>
    <name>user</name>
    <value>javauser</value>
    </parameter>
    <parameter>
    <name>password</name>
    <value>javadude</value>
    </parameter>
    <!-- Class name for mm.mysql JDBC driver -->
    <parameter>
    <name>driverClassName</name>
    <value>org.gjt.mm.mysql.Driver</value>
    </parameter>
    <!-- The JDBC connection url for connecting to your MySQL dB.
         The autoReconnect=true argument to the url makes sure that the
         mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
         connection. mysqld by default closes idle connections after 8 hours.
         -->
         <parameter>
         <name>url</name>
         <value>jdbc:mysql://localhost:3306/javatest?autoReconnect=true</value>
    </parameter>
    </ResourceParams>
    <Resource name="mail/Session" auth="Container"
    type="javax.mail.Session"/>
    <ResourceParams name="mail/Session">
    <parameter>
    <name>mail.smtp.host</name>
    <value>localhost</value>
    </parameter>
    </ResourceParams>
    <ResourceLink name="linkToGlobalResource"
    global="simpleValue"
    type="java.lang.Integer"/>
    </Context>
    </Host>
    </Engine>
    </Service>
    <!-- The MOD_WEBAPP connector is used to connect Apache 1.3 with Tomcat 4.0
    as its servlet container. Please read the README.txt file coming with
    the WebApp Module distribution on how to build it.
    (Or check out the "jakarta-tomcat-connectors/webapp" CVS repository)
    To configure the Apache side, you must ensure that you have the
    "ServerName" and "Port" directives defined in "httpd.conf". Then,
    lines like these to the bottom of your "httpd.conf" file:
    LoadModule webapp_module libexec/mod_webapp.so
    WebAppConnection warpConnection warp localhost:8008
    WebAppDeploy examples warpConnection /examples/
    The next time you restart Apache (after restarting Tomcat, if needed)
    the connection will be established, and all applications you make
    visible via "WebAppDeploy" directives can be accessed through Apache.
    -->
    <!-- Define an Apache-Connector Service -->
    <!--
    <Service name="Tomcat-Apache">
    <Connector className="org.apache.catalina.connector.warp.WarpConnector"
    port="8008" minProcessors="5" maxProcessors="75"
    enableLookups="true" appBase="webapps"
    acceptCount="10" debug="0"/>
    <Engine className="org.apache.catalina.connector.warp.WarpEngine"
    name="Apache" debug="0">
    <Logger className="org.apache.catalina.logger.FileLogger"
    prefix="apache_log." suffix=".txt"
    timestamp="true"/>
    <Realm className="org.apache.catalina.realm.MemoryRealm" />
    </Engine>
    </Service>
    -->
    </Server>
    Pleas4 help!!!

    you have your driver jar in Tomcat\common\lib?
    if so, check your classpath, it could be that.

  • Connection Pooling in Portal?..Can we do that?

    Hi to all.
    Not sure if this the correct forum to ask, but maybe anybody have any ideas..
    We have a problem.
    We are using Oracle Portal R2 9.0.2.0.1.
    The case is, we found out that the most of the database connection we create while using JSP Portlet, didn't closed...
    and the result, maybe it makes our Portal performance slow..
    So, we have to use Connection Pooling in the Portal.
    How can we do that, and can we do that in Oracle Portal?
    Thanks.

    If you created the connections you should explicitly close them also.
    Are you doing that ?

  • Excessive connection latency... Does Adobe Air support connection pooling on mobile?

    Hello,
    I am developing a mobile app which loads thumbnail images from a remote server. During testing on the Android platform, however, I have discovered that images are very slow to load. By monitoring server logs I have determined that the poor performance is caused by the lack of connection pooling, meaning that each request builds a new connection. Running the sample code below on a mobile device produces 20 requests and 20 connection attempts. By comparison, the same web or desktop app creates 2 connections and reuses those connections for subsequent requests. The substantial overhead and latency associated with generating new connections has a substantial affect on performance, with 20 thumbnails taking approximately 4-5 seconds to load on mobile versus 0.5 - 1 second on a desktop.
    I have included a sample app below to emphasis the performance issue. The image itself is very small (290 bytes) to focus the issue on connection latency. I have confirmed this behavior on numerous Android devices, running 4.1, 4.0, and 2.3. I have also attempted using Loader v. URLLoader v. URLStream and sequential v. simultaneous loading with no change in connection behavior. Attempting to set the connection to 'keep-alive' in the URLRequest also has no affect.
    package
              import flash.display.Loader;
              import flash.display.Sprite;
              import flash.display.StageAlign;
              import flash.display.StageScaleMode;
              import flash.events.Event;
              import flash.net.URLRequest;
              import flash.utils.getTimer;
              public class Main extends Sprite
                        private var _count:int = 0;
                        public function Main()
                                  super();
                                  stage.align = StageAlign.TOP_LEFT;
                                  stage.scaleMode = StageScaleMode.NO_SCALE;
                                  trace("Start time " + getTimer() + " ms");
                                  var loader:Loader;
                                  var url:String = "http://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif";  // 290 bytes
                                  for (var i:int = 0; i < 20; i++) {
                                            loader = this.addChild(new Loader()) as Loader;
                                            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, complete);
                                            loader.load(new URLRequest(url));
                        private function complete(event:Event):void
                                  _count++
                                  trace("Finished " + _count + " at " + getTimer() + " ms");
    So, I have a couple questions:
    1) Is there something that I can do to enable connection reuse?
    2) Is this an inherent limitation with Adobe Air for mobile?
    3) Can someone confirm whether this limitation exists on other mobile platforms (iOS or Blackberry)?
    Any help that you can provide would be greatly appreciated. I am really hoping that this isn't a fundamental limitation of Adobe Air as it causes my app to feel very sluggish.
    Thanks,
    Adam

    Hmm. You were absolutely correct, that's a bit disappointing!
    This is Android recompiled for 3.4 rather than 3.1.
    null
    COMPLETED 50 with 8 loaders in 11327 milliseconds or 226.54 per load.   50           8              11327    226.54
    COMPLETED 50 with 50 loaders in 8899 milliseconds or 177.98 per load.   50           50           8899       177.98
    COMPLETED 50 with 50 loaders in 9280 milliseconds or 185.6 per load.     50           50           9280       185.6
    COMPLETED 50 with 50 loaders in 9513 milliseconds or 190.26 per load.   50           50           9513       190.26
    COMPLETED 50 with 8 loaders in 9744 milliseconds or 194.88 per load.     50           8              9744       194.88
    COMPLETED 50 with 1 loaders in 16383 milliseconds or 327.66 per load.   50           1              16383    327.66
    Versus Apple iPad recompiled for 3.4 rather than 3.1.
    null
    COMPLETED 50 with 8 loaders in 502 milliseconds or 10.04 per load. 50      8        502    10.04
    COMPLETED 50 with 50 loaders in 100 milliseconds or 2 per load.     50      50      100    2
    COMPLETED 50 with 50 loaders in 117 milliseconds or 2.34 per load. 50      50      117    2.34
    COMPLETED 50 with 50 loaders in 93 milliseconds or 1.86 per load.  50      50      93      1.86
    COMPLETED 50 with 8 loaders in 270 milliseconds or 5.4 per load.    50      8        270    5.4
    COMPLETED 50 with 8 loaders in 307 milliseconds or 6.14 per load.  50      8        307    6.14
    COMPLETED 50 with 8 loaders in 316 milliseconds or 6.32 per load.  50      8        316    6.32
    COMPLETED 50 with 4 loaders in 555 milliseconds or 11.1 per load.  50      4        555    11.1
    COMPLETED 50 with 4 loaders in 547 milliseconds or 10.94 per load. 50      4        547    10.94
    COMPLETED 50 with 4 loaders in 535 milliseconds or 10.7 per load.  50      4        535    10.7
    COMPLETED 50 with 2 loaders in 1038 milliseconds or 20.76 per load.        50      2        1038          20.76
    COMPLETED 50 with 2 loaders in 1042 milliseconds or 20.84 per load.        50      2        1042          20.84
    COMPLETED 50 with 1 loaders in 2107 milliseconds or 42.14 per load.        50      1        2107          42.14
    COMPLETED 50 with 1 loaders in 2099 milliseconds or 41.98 per load.        50      1        2099          41.98
    Both are on release compile, which should take out all of the variability. So, yes, it looks as if the 3.4 AIR runtime has lost the connection pooling but ONLY for Android.
    PS: Code I used in my test (which was a conventional View based Mobile app) is below in case you want to include it when you submit a bug report.
    <?xml version="1.0" encoding="utf-8"?>
    <s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark" title="TestLLatency" xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Script>
      <![CDATA[
       import mx.events.FlexEvent;
       protected function uicomponent1_creationCompleteHandler(event:FlexEvent):void
        startTest();
       public function startTest():void {
        if(queue) throw new Error("Please wait for previous test to end.");
        queue = new Array();
        _count = 0;
        var loader:Loader;
        var i:int;
        for (i = 0; i < numToQueue; i++) {
         loader = bob.addChild(new Loader()) as Loader;
         loader.x = (i%10)*50;
         loader.y = Math.floor(i/5)*50;
         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, complete);
         queue.push(loader);
        startTime = getTimer();
        for(i=0;i<numLoaders;i++) {
         nextQueue();
       protected var startTime:int;
       protected var endTime:int;
       protected var numToQueue:int = 50;
       protected var numLoaders:int = 8;
       protected var queue:Array;
       private var _count:int;
       private function complete(event:Event):void
        _count++
        nextQueue();
       [Bindable] protected var results:String;
       protected function nextQueue():void {
        var url:String = "http://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yo/r/UlIqmHJn-SK.gif";  // 290 bytes
        if(queue && queue.length) {
         var loader:Loader = queue.pop() as Loader;
         loader.load(new URLRequest(url));
        } else if(_count==numToQueue) {
         endTime = getTimer();
         var elapsed:int = endTime-startTime;
         results += "\n"+("COMPLETED "+numToQueue+" with "+numLoaders+" loaders in "+(elapsed)+" milliseconds or "+(elapsed/numToQueue)+" per load.\t"+[numToQueue,numLoaders,elapsed,elapsed/numToQueue].join("\t"));
         queue = null;
         while(bob.numChildren>5) {
          bob.removeChildAt(bob.numChildren-1);
         bob.getChildAt(0).addEventListener(MouseEvent.CLICK,repeatTest);
         bob.getChildAt(1).addEventListener(MouseEvent.CLICK,repeatTest);
         bob.getChildAt(2).addEventListener(MouseEvent.CLICK,repeatTest);
         bob.getChildAt(3).addEventListener(MouseEvent.CLICK,repeatTest);
         bob.getChildAt(4).addEventListener(MouseEvent.CLICK,repeatTest);
       protected function repeatTest(event:MouseEvent):void {
        var dob:DisplayObject = event.target as DisplayObject;
        var testBehaviour:int = dob.parent.getChildIndex(dob);
        try {
         switch(testBehaviour) {
          case 4 :
           this.numLoaders = this.numToQueue;
           break;
          case 3 :
           this.numLoaders = 8;
           break;
          case 2 :
           this.numLoaders = 4;
           break;
          case 1 :
           this.numLoaders = 2;
           break;
          case 0 :
           this.numLoaders = 1;
           break;
         startTest();
         dob.removeEventListener(MouseEvent.CLICK,repeatTest);
         for(var i:int=0;i<5;i++) bob.removeChildAt(0);
        } catch(e:Error) {
         trace(e.message); 
      ]]>
    </fx:Script>
    <fx:Declarations>
      <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:HGroup width="100%" height="100%">
      <mx:UIComponent id="bob" width="100%" height="100%" creationComplete="uicomponent1_creationCompleteHandler(event)" />
      <s:TextArea text="{results}" width="100%" height="100%" />
    </s:HGroup>
    </s:View>

Maybe you are looking for