Releasing connections?

Hello all!
I use connections to db from Jython or JavaBeanShell like:
conn = odiRef.getJDBCConnection("SRC")
prepStmt = conn.prepareStatement(sqlStmt)
nbRows = prepStmt.executeUpdate()
*1]*
When is the connection returned to Connection Pool? Is it done automatically when the KM-step is finished or do I have to do it manually end everytime call:
prepStmt.close()
conn.close()
*2]*
Is there any log I could see the connection usage from?
Thanks!
Antonin

1) ODI will keep the connection open until the end of the session. You should close your statement. There is no "pool" of connections, ODI will open the connections when required, and they get closed at the end of the scenario/session.
2) There is no additional logging, but if you use -v=3 or -v=5 option on your agent, you will get the detailed interaction of what is sent to the databases. (usually get people to use ./agent.sh -v=5 > agent.log so it goes to a file)

Similar Messages

  • Weblogic Data source is not releasing connections

    Hi All,
    Weblogic JDBC data source is not releasing connection until JDBC connection is deleted and created again. Could you please let me know this is a database issue or weblogic jdbc driver issue. We are using weblogic 10.1. Please see the following xml for JDBC driver.
    Although maximum connections are set to 300, it stills keeps increasing connections over 300. This issue is resolved only when jdbc data source is deleted and created again.
    <?xml version='1.0' encoding='UTF-8'?>
    <jdbc-data-source xmlns="http://www.bea.com/ns/weblogic/90" xmlns:sec="http://www.bea.com/ns/weblogic/90/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wls="http://www.bea.com/ns/weblogic/90/security/wls" xsi:schemaLocation="http://www.bea.com/ns/weblogic/920 http://www.bea.com/ns/weblogic/920.xsd">
    <name>abc_admin_STGNCB</name>
    <jdbc-driver-params>
    <url>jdbc:oracle:thin:@10.151.43.54:1521:STGNCB</url>
    <driver-name>oracle.jdbc.OracleDriver</driver-name>
    <properties>
    <property>
    <name>user</name>
    <value>abc_admin</value>
    </property>
    <property>
    <name>portNumber</name>
    <value>1521</value>
    </property>
    <property>
    <name>SID</name>
    <value>STGNCB</value>
    </property>
    <property>
    <name>serverName</name>
    <value>10.151.43.54</value>
    </property>
    </properties>
    <password-encrypted>{3DES}wc5vg5GIbPtt+b8vWY0i5Q==</password-encrypted>
    </jdbc-driver-params>
    <jdbc-connection-pool-params>
    <initial-capacity>20</initial-capacity>
    <max-capacity>300</max-capacity>
    <capacity-increment>10</capacity-increment>
    <connection-creation-retry-frequency-seconds>30</connection-creation-retry-frequency-seconds>
    <statement-cache-size>200</statement-cache-size>
    <pinned-to-thread>true</pinned-to-thread>
    <identity-based-connection-pooling-enabled>true</identity-based-connection-pooling-enabled>
    </jdbc-connection-pool-params>
    <jdbc-data-source-params>
    <jndi-name>jdbc/ABC_TX_DATASOURCE</jndi-name>
    <jndi-name>jdbc/ABC_NON_TX_DATASOURCE</jndi-name>
    <jndi-name>jdbc/ABC_TX_EVENT_DATASOURCE</jndi-name>
    <jndi-name>jdbc/ABC_NON_TX_EVENT_DATASOURCE</jndi-name>
    <jndi-name>jdbc/ABC_DATASOURCE</jndi-name>
    <jndi-name>abc.cdb.DataSource</jndi-name>
    <global-transactions-protocol>EmulateTwoPhaseCommit</global-transactions-protocol>
    </jdbc-data-source-params>
    </jdbc-data-source>
    Edited by: bpenugon on Aug 24, 2010 8:02 AM

    The root cause is pinned-to-thread is enabled. When the application finishes using the connection and calls connection.close(), WebLogic Server keeps the connection with the execute thread and does not return it to the connection pool. The connection pool maximum capacity is ignored when pinned-to-thread is enabled. So you saw the number of connections in connection pool keeps increasing over 300.
    Set pinned-to-thread to false can solve the problem.

  • ConnectionManager:release  Connection

    Hello Community,
    We are using the Oracle Forms and Reports 11g (11.1.2.1.0) on Solaris. The Reportserver are not frequently used, after some idle time  the reportserver takes Sometimes a long time (more than 5 minutes) to run jobs that should be finished in secondes this happend only for the first run of the Job, the subsequently jobs run faster a expected. In the log file "rwserver_diagnostic.log" i see the the server takes 5 Minutes releasing connections!! What Could be the reason of releasing these connections (repository connection?)
    [2015-01-22T08:17:53.384+00:00] [reports] [TRACE:16] [] [oracle.reports.server] [tid: 13] [ecid: 0000KfdVi7_2vHzMw2vX6G1KheUE000004,0] [SRC_CLASS: oracle.reports.utility.RWLogger] [SRC_METHOD: writeln] JobManage
    r:firstToRun  job 275943253 is first to run
    [2015-01-22T08:18:26.123+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2195 is released.
    [2015-01-22T08:18:29.695+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2196 is released.
    [2015-01-22T08:19:01.999+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2197 is released.
    [2015-01-22T08:19:03.195+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2198 is released.
    [2015-01-22T08:19:04.679+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2199 is released.
    [2015-01-22T08:19:06.243+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2200 is released.
    [2015-01-22T08:19:07.991+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2201 is released.
    [2015-01-22T08:19:49.699+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2202 is released.
    [2015-01-22T08:19:51.195+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2203 is released.
    [2015-01-22T08:19:52.791+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2204 is released.
    [2015-01-22T08:20:50.366+00:00] [reports] [TRACE] [] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [SRC_CLASS: oracle.reports.utility.RWLogger] [SRC_METHOD:
    writeln] [URI: /reports/rwservlet/getserverinfo] ConnectionImpl:getServerRunningInfo  enter...
    [2015-01-22T08:20:50.368+00:00] [reports] [TRACE] [] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [SRC_CLASS: oracle.reports.utility.RWLogger] [SRC_METHOD:
    writeln] [URI: /reports/rwservlet/getserverinfo] ConnectionImpl:getServerRunningInfo  ...exit
    [2015-01-22T08:20:50.370+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2205 is released.
    [2015-01-22T08:22:14.048+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2206 is released.
    [2015-01-22T08:22:15.272+00:00] [reports] [NOTIFICATION:16] [REP-56013] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [URI: /reports/rwservlet/getserverinfo
    ] ConnectionManager:release  Connection 2207 is released.
    [2015-01-22T08:22:52.645+00:00] [reports] [TRACE:16] [REP-50132] [oracle.reports.server] [tid: 16] [ecid: 0005zm51bLq2vHzMw2vX6G0005FW000021,0:1:0x5f5e102:100000000] [SRC_CLASS: oracle.reports.utility.RWLogger]
    [SRC_METHOD: writeln] [URI: /reports/rwservlet/getserverinfo] checkForDbProxyConnection  Trying to get key from configuration file for db
    Thank you for your help
    Best regards

    Hi,
    Please check to make sure the report server is actually started.
    Monica

  • JClient 2 Tier Application Release Connection

    We have a 2 tier application with many application modules which can be open at the same time. In each screen we call "Release" when it is closed but in Toad we see it is not releasing the connection.
    There is a post on this but nothing about if this was resolved?
    How to immediately released database connection in jclient form app ?
    Cory

    1)3 tier means the database is one tier, the applications server (the fmx) is the second tier, and the browser (where the UI gets displayed) is the 3rd tier. The 3rd Tier is a browser and requires no extra software.
    2) You can do this but the power of Forms is that the act of writing your middle tier(application logic) is easy because of the power of Forms. In theory, you could write all your application logic in Java and only write the screens (and the part that interfaces with the Java business Logic) in Forms. But this is not really what Forms is about - you would probably want to look at JDeveloper.
    3) Forms makes the interation with the database soooo easy - however if you have a load of business logic already written in Java you can integrate it with Forms using the Java importer.
    Regards
    Grant Ronald
    Forms Product Management

  • Listener won't release connections

    Hi,
    I'm getting "Exception occurred while getting connection: oracle.ucp.UniversalConnectionPoolException: All connections in the Universal Connection Pool are in use"
    after a few seconds of single user use on my Apex (4.1) application.
    Looking at the admin page I can see that the "active" connections have reached the max connections setting.
    Problem is, the active sessions counter never reduces. I am just entering the demo app that comes with Apex going into orders and selecting one.
    Trying exactly the same on my laptop with local listener and database set up the active connections are released and return to 0 when I do exactly the same.
    The JDBC settings are as follows: Inital Pool 3, Min connections 1, max 10, Max statements 10, Inactivity TO 1800, Statement TO 900.
    Increasing the max connections simply delays the problem.
    Any ideas as to why the connections are not being released back into the pool? Thought it might be something wrong with the Apex install which was done for using the app server, but I can't see anything from the installation guide that helps.
    Cheers
    Mark

    Apex listener 1.1.4.195.00.12
    DB 11.2
    Apex 4.1
    Here is the log, as soon as I start using the demo app I get closed connection messages, and for each one I get an active connection in the admin console, until eventually there are none available.
    Sometimes it seems to behave, but other times it doesn't work at all.
    I have the listener running on an application server (stand alone). But if I have the listener running on my local PC it gives the same issues.
    I have tried installing the db, apex, listener all on my laptop and the demo app works just fine with none of these closed connection messages
    Log below:
    c:\apexlstnr>java -jar apex.war
    INFO: Starting: C:\apexlstnr\apex.war
    See: 'java -jar apex.war --help' for full range of configuration options
    INFO: Extracting to: C:\Users\carym\AppData\Local\Temp\apex
    INFO: Using classpath: file:/C:/Users/carym/AppData/Local/Temp/apex/apex/____emb
    edded/start.jar:file:/C:/Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/ap
    ex.jar:file:/C:/Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/commons-fil
    eupload-1.2.1.jar:file:/C:/Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/
    je-4.0.103.jar:file:/C:/Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/ojd
    bc6.jar:file:/C:/Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/ojmisc.jar
    :file:/C:/Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/poi-3.6-20091214.
    jar:file:/C:/Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/ucp.jar:file:/
    C:/Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/xdb-11.2.0.jar:file:/C:/
    Users/carym/AppData/Local/Temp/apex/apex/WEB-INF/lib/xmlparserv2-11.2.0.jar:
    INFO: Starting Embedded Web Container in: C:\Users\carym\AppData\Local\Temp\apex
    Oct 29, 2012 9:52:51 AM ____bootstrap.Deployer deploy
    INFO: Will deploy application path=C:\Users\carym\AppData\Local\Temp\apex\apex\W
    EB-INF\web.xml
    Oct 29, 2012 9:52:51 AM ____bootstrap.Deployer deploy
    INFO: deployed application path=C:\Users\carym\AppData\Local\Temp\apex\apex\WEB-
    INF\web.xml
    Using config file: C:\Users\carym\AppData\Local\Temp\apex\apex-config.xml
    -- listing properties --
    PropertyCheckInterval=60
    ValidateConnection=true
    MinLimit=1
    MaxLimit=10
    InitialLimit=3
    AbandonedConnectionTimeout=900
    MaxStatementsLimit=10
    InactivityTimeout=1800
    MaxConnectionReuseCount=1000
    APEX Listener version : null
    APEX Listener server info: Grizzly/1.9.18-o
    Oct 29, 2012 9:52:56 AM com.sun.grizzly.Controller logVersion
    INFO: Starting Grizzly Framework 1.9.18-o - Mon Oct 29 09:52:56 GMT 2012
    INFO: http://localhost:8080/apex started.
    Using JDBC driver: Oracle JDBC driver version: 11.2.0.2.0
    Closed Connection
    Closed Connection
    Closed Connection
    Closed Connection
    Closed Connection

  • JDBC connection pools problems: weblogic doesn't release connections

    Hi all,
    we use Weblogic 5.1 in conjunction with Content Server 3.6 and Oracle
    8.1.6;
    We have this strange problem:
    Calling a page the connections, in the content server connection pool,
    grows up till the maximum. We think the problem is that Weblogic
    doesn't release used connections.
    Does anybody can help us? Did anybody had the same problem?
    Best Regards,
    Marcello Villani

    Hi. I'd have to see the code. When a pool connection is closed, it gets
    back into the pool. Until it's closed, it doesn't.
    Marcello Villani wrote:
    Hi all,
    we use Weblogic 5.1 in conjunction with Content Server 3.6 and Oracle
    8.1.6;
    We have this strange problem:
    Calling a page the connections, in the content server connection pool,
    grows up till the maximum. We think the problem is that Weblogic
    doesn't release used connections.
    Does anybody can help us? Did anybody had the same problem?
    Best Regards,
    Marcello Villani

  • Oracle RAC 11g R1 Release Connection Failover Problem

    Hi All,
    In our Architecture we are using Oracle RAC 11g R1. Below is the JDBC URL :
    JDBCURL = jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = Host1-vip)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = Host2-vi
    p)(PORT = 1521))(LOAD_BALANCE = ON)(FAILOVER=ON)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = <Service_name>)))
    We are using two node RAC. The problem is whenever we are rebooting a Node and rejoin the cluster, Application Servers are not able to recognize that.
    Suppose we have node1 and node2, I will take down node1 (freeze the cluster) and then reboot node1 and bring it back up( and join the cluster). At this point, My application servers are not able to recognize that some new DBserver(node1) had joined the cluster until I restart my application servers.
    Please Provide me a solution for this. Thanks alot to everyone in advance.
    Edited by: 877010 on Aug 4, 2011 2:00 PM
    Edited by: 877010 on Aug 8, 2011 10:19 AM

    Please try using this
    JDBCURL = jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = Host1-vip)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = Host2-vi
    p)(PORT = 1521))(LOAD_BALANCE = YES)(FAILOVER=YES)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = <Service_name>)))

  • How to immediately released database connection in jclient form app ?

    Hello Steve,
    We want our jclient form application could immediately released database connection when its be closed,
    We had follow your Weblog technical paper about http://radio.weblogs.com/0118231/stories/2005/02/10/amPoolingConsiderationsForAdfJclient.html , it mentioned following step to release Jclient database connection, but in our jclient project when we close separate jclient form application the database connection seems not immediately released(we monitor through TOAD trace session), the database connection will continue stay alive until we close the all project application.
    •Call panelBinding.releaseDataControl() method before our form application closed,
    •Set the AM pool's minimum available size to 0 (zero), and set the idle time and pool monitor interval shorter if the up-to 20-minute wait (in case it takes two wakeup cycles for the AM instance to be idle more than its idle time) is not something you like, or
    •Disable AM pooling altogether (jbo.ampooling.doampooling=false)In our project application the database connection behavior like following:
    1.when we open every Jclient form application , it will establish a new database connection for every form application
    2.But when we closed the jclient form application , the database connection still exist
    3.But when we open the same jclient form application again, the database connection will not create new database connection , it seems using the same connection when this application first create.
    4.when we close the all project application , it will release all database connection.
    Could you help us, thanks.
    Sincerely from, TIng-Rung

    Hello Steve,
    We have been study the paper that you mentioned, sorry that we still got some confused about AM pool and jdbc pool, My project bc4j,xcfg like following , could you help us what we missing ?
    ==============================
    <?xml version = '1.0' encoding = 'UTF-8'?>
    <BC4JConfig>
    <AppModuleConfigBag>
    <AppModuleConfig name="xxxAppModuleLocal">
    <jbo.ampool.maxinactiveage>5000</jbo.ampool.maxinactiveage>
    <user>xxx</user>
    <jbo.project>His</jbo.project>
    <AppModuleJndiName>com.xxx.business.module.xxxAppModule</AppModuleJndiName>
    <DeployPlatform>LOCAL</DeployPlatform>
    <jbo.poolmonitorsleepinterval>10000</jbo.poolmonitorsleepinterval>
    <jbo.poolmaxinactiveage>5000</jbo.poolmaxinactiveage>
    <JDBCName>NEWNTUHRIS</JDBCName>
    <RELEASE_MODE>Stateless</RELEASE_MODE>
    <jbo.recyclethreshold>0</jbo.recyclethreshold>
    <ApplicationName>com.xxx.business.module.xxxAppModule</ApplicationName>
    <java.naming.factory.initial>oracle.jbo.common.JboInitialContextFactory</java.naming.factory.initial>
    <password>xxxx</password>
    <jbo.poolminavailablesize>0</jbo.poolminavailablesize>
    <DBconnection>jdbc:oracle:thin:@10.0.0.8:1521:xxx</DBconnection>
    <jbo.ampool.minavailablesize>0</jbo.ampool.minavailablesize>
    <jbo.ampool.monitorsleepinterval>10000</jbo.ampool.monitorsleepinterval>
    </AppModuleConfig>
    </AppModuleConfigBag>
    <ConnectionDefinition name="xxx">
    <ENTRY name="JDBC_PORT" value="1521"/>
    <ENTRY name="ConnectionType" value="JDBC"/>
    <ENTRY name="HOSTNAME" value="xx.xx.xx.xx"/>
    <ENTRY name="DeployPassword" value="true"/>
    <ENTRY name="user" value="xxx"/>
    <ENTRY name="ConnectionName" value="xxx"/>
    <ENTRY name="SID" value="xxx"/>
    <ENTRY name="password">
    <![CDATA[{904}0505E5FED797881374FDE8BD1606B6CF01]]>
    </ENTRY>
    <ENTRY name="JdbcDriver" value="oracle.jdbc.driver.OracleDriver"/>
    <ENTRY name="ORACLE_JDBC_TYPE" value="thin"/>
    <ENTRY name="DeployPassword" value="true"/>
    </ConnectionDefinition>
    </BC4JConfig>
    and our jclient code to release connection like following:
    tabbedPane.addCloseListener(new CloseListener(){
    public void closeOperation(MouseEvent e){       
    cleanTabComponentListener(tabbedPane.getComponentAt(tabbedPane.getOverTabIndex()));
    tabbedPane.remove(tabbedPane.getOverTabIndex());
    UPanelBinding panelbd = tabbedPane.getPanelBinding();
    panelbd.releaseDataControl();
    panelbd.getBindingContext().release();
    }

  • WLS5.1 - How to configure WLS5.1 to release "unclosed" connections?

              Hi all,
              is there any feature or detector element in WLS5.1 to release connections back
              to the pool if they were not closed properly by the application? If not, is there
              any alternative to overcome the problem?
              Please advice! Thanks!
              Best Regards,
              Winnie
              

              "Winnie Ngiam" <[email protected]> wrote:
              >
              >Hi all,
              >
              >is there any feature or detector element in WLS5.1 to release connections
              >back
              >to the pool if they were not closed properly by the application? If not,
              >is there
              >any alternative to overcome the problem?
              >
              >Please advice! Thanks!
              >
              >Best Regards,
              >Winnie
              Hi WInnie,
              you can set timeouts for releasing the connection pool if the connection
              is not properly closed by using
              the following way for a T3CLient like :
              t3.setSoftDisconnectTimeoutMins(2);
              for further calrifications let me know.
              http://www.weblogic.com/docs51/classdocs/API_jdbct3.html#startupconnpool
              rgds
              SureshKumar
              

  • Does transaction manager also releases the connections ?

    Hi All,
    I've a doubt regarding release of connection in transaction handling scenarios in EJB.
    Let us assume I have an EJB method associated with a transaction attribute as Requires New (i.e. the ejb method is associated with container managed transaction).
    Within that method two diffreent databasess are accessed, connections are created, databases are updated but connections are not realeased.
    The code goes similar to the one given below -
    public void beanMethod1()
    InitialContext cntx = new InitialContext();
    javax.sql.DataSource ds1 = cntx.lookup("dataSourceName1");
    javax.sql.DataSource ds2 = cntx.lookup("dataSourceName2");
    java.sql.Connection conn1 = ds1.getConnection();
    ds1.setAutoCommit(false);
    PreparedStatement pst1 = ds1.prepareStatement("Qyery1");
    pst1.executeUpdate();
    java.sql.Connection conn2 = ds2.getConnection();
    ds2.setAutoCommit(false);
    PreparedStatement pst2 = ds2.prepareStatement("Qyery2");
    pst2.executeUpdate();
    Now in this context my doubt is - will the transaction manager, along with handling commit/rollback, release the connections also (once commit/rollback is over) ? Or releasing of connections need to be handled in the bean method ?
    If releasing connections has to be handled in the bean method, then how does transaction manager execute a commit/rollback on a released connection ?
    The same doubt can be extended to bean managed transaction also where transaction boundarry is demarcated using javax.transaction.UserTransaction object's begin(), commit() and rollback() methods.
    It will be a real help if anyone please throw some light on this doubt.
    Thanks in advance,
    Sourav

    Hi,
    Your code needs to release (i.e., close) the connections it uses; this is outside the TM responsibility scope.
    The commit or rollback is not a problem, because the corresponding XAResource (which is the
    transaction manager's handle to your connection) can be used even after your connection
    has been closed in the application code. That is the catch about XA, and it allows the whole
    mechanism of connection pooling and DataSources to work properly.
    Hope that helps,
    Guy

  • Connection pool for ldap

    Hi
    My application is an interface to ldap directory. I have not used any ldap open source api to retrieve data from ldap. I have written connection pool that will help the application to connect to the ldap. It's working fine, but it's creating threads which are not invited.
    ConnectionPool class takes care of the connection storage and creation, while Housekeeping thread relases these connection when idle after a given time.
    Can someone please help in finding the problem in the code that creates additional threads.
    package com.ba.cdLookup.manager;
    import com.ba.cdLookup.exception.CDLookupException;
    import com.ba.cdLookup.server.CdLookupProperties;
    import java.util.Vector;
    import javax.naming.Context;
    import javax.naming.NamingException;
    public class HouseKeeperThread extends Thread {
             * Apache Logger to log erro/info/debug statements.
        protected static org.apache.commons.logging.Log log = org.apache.axis.components.logger.LogFactory
             .getLog(HouseKeeperThread.class.getName());
        private static HouseKeeperThread houseKeeperThread;
             * Close all connections existing.
             * @param connections
             *                void
        private void closeConnections(Vector connections) {
         String methodIdentifier = "closeConnections";
         int numOfConn = connections.size();
         try {
             for (int i = 0; i < numOfConn; i++) {
              Context context = (Context) connections.get(i);
              if (context != null) {
                  context.close();
                  context = null;
                  connections.remove(i);
                  numOfConn--;
                  log.info(" connection name:" + context
                       + " removed. Threadcount =" + (connections.size()));
         } catch (NamingException e) {
             String errMsg = "CDLdapBuilder connect() - failure while releasing connection "
                  + " Exception is " + e.toString();
             log.error(errMsg);
         } catch (Exception e) {
             String errMsg = "CDLdapBuilder connect() - failure while releasing connection "
                  + " Exception is " + e.toString();
             log.error(errMsg);
             * Thread run method
        public void run() {
         String methodIdentifier = "run";
         try {
             while(true){
              log.debug("house keeping :" + this + " ---sleep");
              //sleep(100000);
              log.debug("house keeping :" + this + " startd after sleep");
               sleep(CdLookupProperties.getHouseKeepConnectionTime());
              ConnectionPool connectionPool = ConnectionPool
                   .getConnectionPool();
              Vector connList = connectionPool.getAvailableConnections();
              closeConnections(connList);
         } catch (CDLookupException cde) {
             log.error(methodIdentifier + " " + cde.getStackTrace());
         } catch (InterruptedException ie) {
             log.error(methodIdentifier + " " + ie.getStackTrace());
         * @param connectionPool
         * @return
         * Thread
        public static Thread getInstance() {
         if(houseKeeperThread==null){
             houseKeeperThread = new HouseKeeperThread();
         return houseKeeperThread ;
    package com.ba.cdLookup.manager;
    import com.ba.cdLookup.exception.CDLookupException;
    import com.ba.cdLookup.server.CdLookupProperties;
    import com.ba.cdwebservice.schema.cdLookupPacket.LookupFailureReasons;
    import java.util.Properties;
    import java.util.Vector;
    import javax.naming.Context;
    import javax.naming.NamingException;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    * ConnectionPool class manages, allocates LDAP connections. It works as a lazy
    * binder and retrieves connections only when required. It doesn't allow
    * connection greater then the maximum connection stated.
    * To retrieve a connection the singelton method getConnectionPool is to used,
    * which retruns thread safe singleton object for the connection.
    public class ConnectionPool implements Runnable {
        private int initialConnections = 0;
        private int maxConnections = 0;
        private boolean waitIfBusy = false;
        private Vector availableConnections, busyConnections;
        private boolean connectionPending = false;
        private static int threadCount = 0;
             * classIdentifier
        private final String classIdentifier = "ConnectionPool";
             * Apache Logger to log erro/info/debug statements.
        protected static org.apache.commons.logging.Log log = org.apache.axis.components.logger.LogFactory
             .getLog(CDLdapBuilder.class.getName());
             * To get the attribute a systemaccessfor out of the search result
        private String vendorContextFactoryClass = "com.sun.jndi.ldap.LdapCtxFactory";// "com.ibm.jndi.LDAPCtxFactory";
             * context factory to use
        private String ldapServerUrl = "LDAP://test.ldap.com"; // default ldap
             * server live used by default
        private String searchBase;
             * environment properties.
        private Properties env;
             * DirContext
        private javax.naming.directory.DirContext ctx;
             * default search base to be used in Corporate Directory searches
        private String defaultSearchBase = "dc=Pathway";
             * search criteria
        private String searchAttributes;
             * search filter to retrieve data from CD
        private String searchFilter;
             * CorporateDirectoryLookup Constructor
             * <p>
             * loads the setup parameters from the properties file and stores them
             * Makes a connection to the directory and sets default search base
             * @throws CDLookupException
             * @throws CDLookupException
        private ConnectionPool() throws CDLookupException {
         this.maxConnections = CdLookupProperties.getMaxConnection();// maxConnections;
         this.initialConnections = CdLookupProperties.getInitialConnection();
         this.waitIfBusy = CdLookupProperties.isWaitIfBusy();
         this.searchBase = CdLookupProperties.getDefaultSearchBase();
         //for local env testing
    //      this.maxConnections = 5;
    //      this.initialConnections = 1;
    //      this.waitIfBusy = true;
             * For keeping no of connections in the connection pool if
             * (initialConnections > maxConnections) { initialConnections =
             * maxConnections; }
         availableConnections = new Vector(maxConnections);
         busyConnections = new Vector(maxConnections);
         for (int i = 0; i < maxConnections; i++) {
             availableConnections.add(makeNewConnection());
             *  ConnectionPoolHolder provide Thread safe singleton
             *         instance of ConnectionPool class
        private static class ConnectionPoolHolder {
             * connection pool instance
         private static ConnectionPool connectionPool = null;
             * If no ConnectionPool object is present, it creates instance of
             * ConnectionPool class and initiates thread on that.
             * @return ConnectionPool Returns singleton object of ConnectionPool
             *         class.
             * @throws CDLookupException
         private static ConnectionPool getInstance() throws CDLookupException {
             if (connectionPool == null) {
              connectionPool = new ConnectionPool();
              new Thread(connectionPool).start();
              // Initiate house keeping thread.
              HouseKeeperThread.getInstance().start();
             return connectionPool;
             * Returns singleton object of ConnectionPool class.
             * @return ConnectionPool
             * @throws CDLookupException
        public static ConnectionPool getConnectionPool() throws CDLookupException {
         return ConnectionPoolHolder.getInstance();
             * getConnection retrieves connections to the corp directory. In case
             * there is no available connections in the pool then it'll try to
             * create one, if the max connection limit for the connection pool
             * reaches then this waits to retrieve one.
             * @return Context
             * @throws CDLookupException
        public synchronized Context getConnection() throws CDLookupException {
         String methodIdentifier = "getConnection";
         if (!availableConnections.isEmpty()) {
             int connectionSize = availableConnections.size() - 1;
             DirContext existingConnection = (DirContext) availableConnections
                  .get(connectionSize);
             availableConnections.remove(connectionSize);
                     * If connection on available list is closed (e.g., it timed
                     * out), then remove it from available list and repeat the
                     * process of obtaining a connection. Also wake up threads that
                     * were waiting for a connection because maxConnection limit was
                     * reached.
             if (existingConnection == null) {
              notifyAll(); // Freed up a spot for anybody waiting
              return (getConnection());
             } else {
              busyConnections.add(existingConnection);
              return (existingConnection);
         } else {
                     * Three possible cases: 1) You haven't reached maxConnections
                     * limit. So establish one in the background if there isn't
                     * already one pending, then wait for the next available
                     * connection (whether or not it was the newly established one).
                     * 2) You reached maxConnections limit and waitIfBusy flag is
                     * false. Throw SQLException in such a case. 3) You reached
                     * maxConnections limit and waitIfBusy flag is true. Then do the
                     * same thing as in second part of step 1: wait for next
                     * available connection.
             if ((totalConnections() < maxConnections) && !connectionPending) {
              makeBackgroundConnection();
             } else if (!waitIfBusy) {
              throw new CDLookupException("Connection limit reached", 0);
                     * Wait for either a new connection to be established (if you
                     * called makeBackgroundConnection) or for an existing
                     * connection to be freed up.
             try {
              wait();
             } catch (InterruptedException ie) {
              String errMsg = "Exception raised =" + ie.getStackTrace();
              log.error(errMsg);
              throw new CDLookupException(classIdentifier, methodIdentifier,
                   errMsg, ie);
             // connection freed up, so try again.
             return (getConnection());
             * You can't just make a new connection in the foreground when none are
             * available, since this can take several seconds with a slow network
             * connection. Instead, start a thread that establishes a new
             * connection, then wait. You get woken up either when the new
             * connection is established or if someone finishes with an existing
             * connection.
        private void makeBackgroundConnection() {
         connectionPending = true;
         try {
             Thread connectThread = new Thread(this);
             log.debug("background thread created");
             connectThread.start();
         } catch (OutOfMemoryError oome) {
             log.error("makeBackgroundConnection ="+ oome.getStackTrace());
             * Thread run method
        public void run() {
         String methodIdentifier = "run";
         try {
             Context connection = makeNewConnection();
             synchronized (this) {
              availableConnections.add(connection);
              connectionPending = false;
              notifyAll();
         } catch (Exception e) { // SQLException or OutOfMemory
             // Give up on new connection and wait for existing one
             // to free up.
             String errMsg = "Exception raised =" + e.getStackTrace();
             log.error(errMsg);   
             * This explicitly makes a new connection. Called in the foreground when
             * initializing the ConnectionPool, and called in the background when
             * running.
             * @return Context
             * @throws CDLookupException
        private Context makeNewConnection() throws CDLookupException {
         String methodIdentifier = "makeNewConnection";
         Context context = null;
         env = new Properties();
         log.debug("inside " + methodIdentifier);
         try {
             env.put(Context.INITIAL_CONTEXT_FACTORY,
                  getVendorContextFactoryClass());
             env.put(Context.PROVIDER_URL, getLdapServerUrl());
             env.put("com.sun.jndi.ldap.connect.pool", "true");
             context = new InitialDirContext(env);
         } catch (NamingException e) {
             String errMsg = "CDLdapBuilder connect() - failure while attempting to contact "
                  + ldapServerUrl + " Exception is " + e.toString();
             throw new CDLookupException(classIdentifier, methodIdentifier,
                  errMsg, e, LookupFailureReasons.serviceUnavailable);
         } catch (Exception e) {
             String errMsg = "CDLdapBuilder connect() - failure while attempting to contact "
                  + ldapServerUrl + " Exception is " + e.toString();
             throw new CDLookupException(classIdentifier, methodIdentifier,
                  errMsg, e, LookupFailureReasons.serviceUnavailable);
         log.info("new connection :" + (threadCount++) + " name =" + context);
         log.debug("exit " + methodIdentifier);
         return context;
             * releases connection to the free pool
             * @param context
        public synchronized void free(Context context) {
         busyConnections.remove(context);
         availableConnections.add(context);
         // Wake up threads that are waiting for a connection
         notifyAll();
             * @return int give total no of avail connections.
        public synchronized int totalConnections() {
         return (availableConnections.size() + busyConnections.size());
             * Close all the connections. Use with caution: be sure no connections
             * are in use before calling. Note that you are not <I>required</I> to
             * call this when done with a ConnectionPool, since connections are
             * guaranteed to be closed when garbage collected. But this method gives
             * more control regarding when the connections are closed.
        public synchronized void closeAllConnections() {
         closeConnections(availableConnections);
         availableConnections = new Vector();
         closeConnections(busyConnections);
         busyConnections = new Vector();
             * Close all connections existing.
             * @param connections
             *                void
        private void closeConnections(Vector connections) {
         String methodIdentifier = "closeConnections";
         try {
             for (int i = 0; i < connections.size(); i++) {
              Context context = (Context) connections.get(i);
              if (context != null) {
                  log.info(" connection name:" + context
                       + " removed. Threadcount =" + (threadCount++));
                  context.close();
                  context = null;
         } catch (NamingException e) {
             String errMsg = "CDLdapBuilder connect() - failure while attempting to contact "
                  + ldapServerUrl + " Exception is " + e.toString();
             log.error(errMsg);
        public synchronized String toString() {
         String info = "ConnectionPool(" + getLdapServerUrl() + ","
              + getVendorContextFactoryClass() + ")" + ", available="
              + availableConnections.size() + ", busy="
              + busyConnections.size() + ", max=" + maxConnections;
         return (info);
             * @return the defaultSearchBase
        public final String getDefaultSearchBase() {
         return defaultSearchBase;
             * @param defaultSearchBase
             *                the defaultSearchBase to set
        public final void setDefaultSearchBase(String defaultSearchBase) {
         this.defaultSearchBase = defaultSearchBase;
             * @return the ldapServerUrl
        public final String getLdapServerUrl() {
         return ldapServerUrl;
             * @param ldapServerUrl
             *                the ldapServerUrl to set
        public final void setLdapServerUrl(String ldapServerUrl) {
         this.ldapServerUrl = ldapServerUrl;
             * @return the vendorContextFactoryClass
        public final String getVendorContextFactoryClass() {
         return vendorContextFactoryClass;
             * @param vendorContextFactoryClass
             *                the vendorContextFactoryClass to set
        public final void setVendorContextFactoryClass(
             String vendorContextFactoryClass) {
         this.vendorContextFactoryClass = vendorContextFactoryClass;
         * @return the availableConnections
        public final Vector getAvailableConnections() {
            return availableConnections;
    }

    Hi,
    As the connection pool implmentation has the bug of not extending more than the min size, workaround I use is MIN_CONN=100 and MAX_CONN=101,and just waiting for the bug to get fixed. (using Netscape SDK for java4.0)

  • Error in getting Database connection

    I have got a separate class for obtaining connection(returns a connection object) and releasing connection.I had written a new class in which the connection object is returned as null after calling the getConnection() method on that dataaccessbean class.For other previous existing classes it is working.....but for this new class a null pointer exception is coming for that connection object.
    Please help me out

    Please help me outi wish i could see your code

  • [原创] 有关Weblogic Connection Pool 连接恢复的问题

    这是一个古老的问题,一直困扰我,这里既然碰到了,就看看能不能解决。
    环境描述:
    WEBLOGIC版本是8.1 SP2,数据库是SQL SERVER 2000,分别部署在两个服务器上。
    第一步:
    问题描述:
    数据库服务器重新启动,导致WEBLOGIC 的CONNECTION POOL中的连接中断,EJB无法获得连接,导致应用出错。
    解决方法:
    进入WEBLOGIC ADMIN CONSOLE,
    Services->JDBC->Connection Pools->Config->Connections, 点开Advanced Options.
    打开 Test Reserved Connections ,Test Created Connections,Test Released Connections这三个选项。
    将Test Table Name属性设置为:sysproperties(SQL Server系统表,即使自己的应用不存在,这个表也存在,而且默认的内部没有数据)
    根据如下解释:
    Connections that fail the test are closed and reopened to re-establish a valid physical database connection.
    (You must specify a Test Table Name below.)
    每次调用首先进行测试连接,如果测试失败连接将重新建立。
    测试结果:
    WEBLOGIC启动后,关闭数据库SQL SERVER,应用服务器前端调用此时失败。
    重新启动SQL SERVER后,WEBLOGIC端略做等待,前端应用恢复正常。
    第二步:
    问题描述:
    进一步测试,如果WEBLOGIC先启动,启动完成后再启动数据库。
    在WEBLOGIC CONSOLE得到如下输出:
    <2006-3-22 上午11时50分08秒 GMT+08:00> <Warning> <JDBC> <BEA-001129> <Received exception while creating connection for p
    ool "MyJDBC Connection Pool": [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.>
    <2006-3-22 上午11时50分10秒 GMT+08:00> <Error> <JDBC> <BEA-001150> <Connection Pool "MyJDBC Connection Pool" deployment
    failed with the following error: 0:Could not create pool connection. The DBMS driver exception was: [Microsoft][SQLServe
    r 2000 Driver for JDBC]Error establishing socket..>
    <2006-3-22 上午11时50分10秒 GMT+08:00> <Error> <JDBC> <BEA-001151> <Data Source "MyJDBC Data Source" deployment failed w
    ith the following error: DataSource(jdbc/OMSEIITxDS) can't be created with non-existent Pool (connection or multi) (MyJD
    BC Connection Pool).>
    Unable to deploy EJB: XXXXXXX from XXXXXXX.jar:
    [EJB:011028]The DataSource with the JNDI name: jdbc/XXXXXX could not be located. Please ensure that the DataSource h
    as been deployed successfully and that the JNDI name in your EJB Deployment descriptor is correct.
    1、在默认初始化打开的连接一一失败以后,连接池发现可用的连接为0,郁闷的宣布自己部署失败。
    2、接着数据源发现没有可用的连接池,自己也宣布部署失败。
    3、下面所有的EJB发现不了数据源的JNDI名,部署也全部失败。
    应用启动完成后,大部分EJB的状态为INACTIVE。前端应用无法使用,此时启动数据库,前端应用无法使用。
    手动重新部署 EJB失败,错误还是找不到JNDI,前端应用无法使用。
    手动重新部署 连接池,数据源后,部署EJB 依然失败。前端应用无法使用。
    解决方法:
    进入WEBLOGIC ADMIN CONSOLE,
    Services->JDBC->Connection Pools->Config->Connections, 点开Advanced Options.

    Connection Creation Retry Frequency 参数设置为 60。
    ConnectionCreationRetryFrequencySeconds含义:
    当创建数据库连接时,如果数据库不可用(如数据库没启动),隔多长时间试着重新创建该连接,
    WLS8.1会每隔ConnectionCreationRetryFrequencySeconds秒重试一次.直到JDBC POOL创建成功
    参考:http://dev2dev.bea.com.cn/techdoc/20030469.html,‘JDBC Connect Pool’部分。
    英文解释可以直接控制台上看到,或者edocs查。
    测试结果:
    将数据库关闭,WEBLOGIC重新启动。
    在WEBLOGIC CONSOLE得到如下输出:
    打开Connection Creation Retry Frequency 参数后,连接池在第一轮尝试失败以后,就成功部署了,数据源也成功部署。
    EJB部署会失败,但是提示也与先前的不同:
    Unable to deploy EJB: XXXXXXX from XXXXXXX.jar:
    weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool MyJDBC Connection Pool to
    allocate to applications, please increase the size of the pool and retry..
    每隔一段时间会看到,CONNECTION POOL不断的重新进行连接:
    <2006-3-22 下午12时17分56秒 GMT+08:00> <Warning> <JDBC> <BEA-001129> <Received exception while creating connection for p
    ool "MyJDBC Connection Pool": [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.>
    在WEBLOGIC启动完成后,所有EJB为INACTIVE状态。
    启动数据库服务器,稍后,手动重新部署所有的EJB,EJB可以部署成功,前端应用可以正常使用。
    此时,此问题已经基本解决,仍需要手动部署EJB。
    第三步:
    问题描述:
    解决方法:
    有关部署次序的问题,首先查阅WEBLOGIC文档,http://edocs.bea.com/wls/docs81/faq/deploy.html#744900,得到
    WebLogic Server deploys server-level resources (first JDBC and then JMS) before deploying applications.
    Applications are deployed in this order: connectors, then EJBs, then Web Applications.
    If the application is an EAR, the individual components are loaded in the order in which they are declared
    in the application.xml deployment descriptor.
    WEBLOGIC先部署服务器端资源,JDBC -> JMS....,然后部署我们的应用,EJB->WEB APPLICATION。
    实际从WEBLOGIC启动日志来看,即使打开了Connection Creation Retry Frequency,如果当时数据库不是可用的,CONNECTION POOL
    会不断的调度CONNECTION进行重新连接。但是此时,EJB的部署也同时在进行。个人猜测这应该是两个不同的线程(组)分别调度的任务。
    现在考虑的是能不能用StartupClass截住EJB的部署过程,粗略的说是如果DATASOURCE没有连接好,或者没有可用的连接池,
    就不往下进行EJB部署的过程。
    参考:http://edocs.bea.com/wls/docs81/config_xml/EJBComponent.html#DeploymentOrder
    DeploymentOrder:
    A priority that the server uses to determine when it deploys an item. The priority is relative to other deployable
    items of the same type. For example, the server prioritizes and deploys all EJBs before it prioritizes and
    deploys startup classes.Items with the lowest Deployment Order value are deployed first.
    There is no guarantee on the order of deployments with equal Deployment Order values.
    There is no guarantee of ordering across clusters. Default: 1000 Minimum: 0 Maximum: 2N31-1
    在部署同一类应用时,按照 DEPLOYMENT LOADER的数值决定,数值越小越先。(EJB的参数在ADMIN CONSOLE界面上叫做LOAD ORDER)
    而且上面看来服务器是先部署EJB,再部署STARTUP CLASS,遗憾了。
    好在STARTUP CLASS上有两个选项,
    Run Before Application Deployments
    Run Before Application Activations
    这两个选项分别可以设置StartupClass分别在系统资源部署之前,以及在系统资源部署和用户应用部署之间启动。
    选上Run Before Application Activations。
    现在可以了,我写了一个STARTUP CLASS,思路见下:
    主代码:
    private void testConnection(){
    while (!isTimeout() && !getConnection()){
    try{
    Thread.sleep(testInterval*1000);
    }catch(Exception ignor){}
    log("DBConnectHolder job finished with following status:");
    log("Timeout:"+isTimeout +",Connection OK:"+isConnected);
    测试结果:
    只要配置的等待时间足够长,应用服务器先行启动的情况下,等待数据库启动后才进行EJB等等的部署。
    (主要考虑如果数据库连接不OK,EJB启动了也没有太大用,还得手工重新部署。)算是比较完满的解决了问题。
    另外一个思路是是否可行? 通过MBean, 在CONNECTION 建立起来以后通知一把,进行EJB的重新部署。
    没来得及研究,请有经验的同学帮我补充完善。
    结论:
    其实也没什么结论,只是把自己遇到问题,解决问题的思路写了一下。短时间内阅读的文献有限,可能采用了一些苯方法
    ,或者走了弯路,也请大家拍砖。
    在WL8版本上,数据库连接进行恢复和重新连接的时候,上面提出的几个参数应该是比较重要的,我再次强调一下。
    Services->JDBC->Connection Pools->Config->Connections, 点开Advanced Options.
    Test Reserved Connections
    Test Created Connections
    Test Released Connections
    Test Table Name
    Connection Creation Retry Frequency

    在第一个情景中应该只需要打开Test Reserved Connections 就可以了。
    Test Created Connections表示创建连接后放到pool之前进行测试看连接是否可用
    Test Released Connections表示释放连接回到pool之前进行测试看连接是否可用
    I think so!

  • Threading with connection pool

    Hi
    My application is an interface to ldap directory. I have not used any ldap open source api to retrieve data from ldap. I have written connection pool that will help the application to connect to the ldap. It's working fine, but it's creating threads which are not invited.
    ConnectionPool class takes care of the connection storage and creation, while Housekeeping thread relases these connection when idle after a given time.
    Can someone please help in finding the problem in the code that creates additional threads.
    package com.ba.cdLookup.manager;
    import com.ba.cdLookup.exception.CDLookupException;
    import com.ba.cdLookup.server.CdLookupProperties;
    import java.util.Vector;
    import javax.naming.Context;
    import javax.naming.NamingException;
    public class HouseKeeperThread extends Thread {
             * Apache Logger to log erro/info/debug statements.
        protected static org.apache.commons.logging.Log log = org.apache.axis.components.logger.LogFactory
             .getLog(HouseKeeperThread.class.getName());
        private static HouseKeeperThread houseKeeperThread;
             * Close all connections existing.
             * @param connections
             *                void
        private void closeConnections(Vector connections) {
         String methodIdentifier = "closeConnections";
         int numOfConn = connections.size();
         try {
             for (int i = 0; i < numOfConn; i++) {
              Context context = (Context) connections.get(i);
              if (context != null) {
                  context.close();
                  context = null;
                  connections.remove(i);
                  numOfConn--;
                  log.info(" connection name:" + context
                       + " removed. Threadcount =" + (connections.size()));
         } catch (NamingException e) {
             String errMsg = "CDLdapBuilder connect() - failure while releasing connection "
                  + " Exception is " + e.toString();
             log.error(errMsg);
         } catch (Exception e) {
             String errMsg = "CDLdapBuilder connect() - failure while releasing connection "
                  + " Exception is " + e.toString();
             log.error(errMsg);
             * Thread run method
        public void run() {
         String methodIdentifier = "run";
         try {
             while(true){
              log.debug("house keeping :" + this + " ---sleep");
              //sleep(100000);
              log.debug("house keeping :" + this + " startd after sleep");
               sleep(CdLookupProperties.getHouseKeepConnectionTime());
              ConnectionPool connectionPool = ConnectionPool
                   .getConnectionPool();
              Vector connList = connectionPool.getAvailableConnections();
              closeConnections(connList);
         } catch (CDLookupException cde) {
             log.error(methodIdentifier + " " + cde.getStackTrace());
         } catch (InterruptedException ie) {
             log.error(methodIdentifier + " " + ie.getStackTrace());
         * @param connectionPool
         * @return
         * Thread
        public static Thread getInstance() {
         if(houseKeeperThread==null){
             houseKeeperThread = new HouseKeeperThread();
         return houseKeeperThread ;
    package com.ba.cdLookup.manager;
    import com.ba.cdLookup.exception.CDLookupException;
    import com.ba.cdLookup.server.CdLookupProperties;
    import com.ba.cdwebservice.schema.cdLookupPacket.LookupFailureReasons;
    import java.util.Properties;
    import java.util.Vector;
    import javax.naming.Context;
    import javax.naming.NamingException;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    * ConnectionPool class manages, allocates LDAP connections. It works as a lazy
    * binder and retrieves connections only when required. It doesn't allow
    * connection greater then the maximum connection stated.
    * To retrieve a connection the singelton method getConnectionPool is to used,
    * which retruns thread safe singleton object for the connection.
    public class ConnectionPool implements Runnable {
        private int initialConnections = 0;
        private int maxConnections = 0;
        private boolean waitIfBusy = false;
        private Vector availableConnections, busyConnections;
        private boolean connectionPending = false;
        private static int threadCount = 0;
             * classIdentifier
        private final String classIdentifier = "ConnectionPool";
             * Apache Logger to log erro/info/debug statements.
        protected static org.apache.commons.logging.Log log = org.apache.axis.components.logger.LogFactory
             .getLog(CDLdapBuilder.class.getName());
             * To get the attribute a systemaccessfor out of the search result
        private String vendorContextFactoryClass = "com.sun.jndi.ldap.LdapCtxFactory";// "com.ibm.jndi.LDAPCtxFactory";
             * context factory to use
        private String ldapServerUrl = "LDAP://test.ldap.com"; // default ldap
             * server live used by default
        private String searchBase;
             * environment properties.
        private Properties env;
             * DirContext
        private javax.naming.directory.DirContext ctx;
             * default search base to be used in Corporate Directory searches
        private String defaultSearchBase = "dc=Pathway";
             * search criteria
        private String searchAttributes;
             * search filter to retrieve data from CD
        private String searchFilter;
             * CorporateDirectoryLookup Constructor
             * <p>
             * loads the setup parameters from the properties file and stores them
             * Makes a connection to the directory and sets default search base
             * @throws CDLookupException
             * @throws CDLookupException
        private ConnectionPool() throws CDLookupException {
         this.maxConnections = CdLookupProperties.getMaxConnection();// maxConnections;
         this.initialConnections = CdLookupProperties.getInitialConnection();
         this.waitIfBusy = CdLookupProperties.isWaitIfBusy();
         this.searchBase = CdLookupProperties.getDefaultSearchBase();
         //for local env testing
    //      this.maxConnections = 5;
    //      this.initialConnections = 1;
    //      this.waitIfBusy = true;
             * For keeping no of connections in the connection pool if
             * (initialConnections > maxConnections) { initialConnections =
             * maxConnections; }
         availableConnections = new Vector(maxConnections);
         busyConnections = new Vector(maxConnections);
         for (int i = 0; i < maxConnections; i++) {
             availableConnections.add(makeNewConnection());
             *  ConnectionPoolHolder provide Thread safe singleton
             *         instance of ConnectionPool class
        private static class ConnectionPoolHolder {
             * connection pool instance
         private static ConnectionPool connectionPool = null;
             * If no ConnectionPool object is present, it creates instance of
             * ConnectionPool class and initiates thread on that.
             * @return ConnectionPool Returns singleton object of ConnectionPool
             *         class.
             * @throws CDLookupException
         private static ConnectionPool getInstance() throws CDLookupException {
             if (connectionPool == null) {
              connectionPool = new ConnectionPool();
              new Thread(connectionPool).start();
              // Initiate house keeping thread.
              HouseKeeperThread.getInstance().start();
             return connectionPool;
             * Returns singleton object of ConnectionPool class.
             * @return ConnectionPool
             * @throws CDLookupException
        public static ConnectionPool getConnectionPool() throws CDLookupException {
         return ConnectionPoolHolder.getInstance();
             * getConnection retrieves connections to the corp directory. In case
             * there is no available connections in the pool then it'll try to
             * create one, if the max connection limit for the connection pool
             * reaches then this waits to retrieve one.
             * @return Context
             * @throws CDLookupException
        public synchronized Context getConnection() throws CDLookupException {
         String methodIdentifier = "getConnection";
         if (!availableConnections.isEmpty()) {
             int connectionSize = availableConnections.size() - 1;
             DirContext existingConnection = (DirContext) availableConnections
                  .get(connectionSize);
             availableConnections.remove(connectionSize);
                     * If connection on available list is closed (e.g., it timed
                     * out), then remove it from available list and repeat the
                     * process of obtaining a connection. Also wake up threads that
                     * were waiting for a connection because maxConnection limit was
                     * reached.
             if (existingConnection == null) {
              notifyAll(); // Freed up a spot for anybody waiting
              return (getConnection());
             } else {
              busyConnections.add(existingConnection);
              return (existingConnection);
         } else {
                     * Three possible cases: 1) You haven't reached maxConnections
                     * limit. So establish one in the background if there isn't
                     * already one pending, then wait for the next available
                     * connection (whether or not it was the newly established one).
                     * 2) You reached maxConnections limit and waitIfBusy flag is
                     * false. Throw SQLException in such a case. 3) You reached
                     * maxConnections limit and waitIfBusy flag is true. Then do the
                     * same thing as in second part of step 1: wait for next
                     * available connection.
             if ((totalConnections() < maxConnections) && !connectionPending) {
              makeBackgroundConnection();
             } else if (!waitIfBusy) {
              throw new CDLookupException("Connection limit reached", 0);
                     * Wait for either a new connection to be established (if you
                     * called makeBackgroundConnection) or for an existing
                     * connection to be freed up.
             try {
              wait();
             } catch (InterruptedException ie) {
              String errMsg = "Exception raised =" + ie.getStackTrace();
              log.error(errMsg);
              throw new CDLookupException(classIdentifier, methodIdentifier,
                   errMsg, ie);
             // connection freed up, so try again.
             return (getConnection());
             * You can't just make a new connection in the foreground when none are
             * available, since this can take several seconds with a slow network
             * connection. Instead, start a thread that establishes a new
             * connection, then wait. You get woken up either when the new
             * connection is established or if someone finishes with an existing
             * connection.
        private void makeBackgroundConnection() {
         connectionPending = true;
         try {
             Thread connectThread = new Thread(this);
             log.debug("background thread created");
             connectThread.start();
         } catch (OutOfMemoryError oome) {
             log.error("makeBackgroundConnection ="+ oome.getStackTrace());
             * Thread run method
        public void run() {
         String methodIdentifier = "run";
         try {
             Context connection = makeNewConnection();
             synchronized (this) {
              availableConnections.add(connection);
              connectionPending = false;
              notifyAll();
         } catch (Exception e) { // SQLException or OutOfMemory
             // Give up on new connection and wait for existing one
             // to free up.
             String errMsg = "Exception raised =" + e.getStackTrace();
             log.error(errMsg);   
             * This explicitly makes a new connection. Called in the foreground when
             * initializing the ConnectionPool, and called in the background when
             * running.
             * @return Context
             * @throws CDLookupException
        private Context makeNewConnection() throws CDLookupException {
         String methodIdentifier = "makeNewConnection";
         Context context = null;
         env = new Properties();
         log.debug("inside " + methodIdentifier);
         try {
             env.put(Context.INITIAL_CONTEXT_FACTORY,
                  getVendorContextFactoryClass());
             env.put(Context.PROVIDER_URL, getLdapServerUrl());
             env.put("com.sun.jndi.ldap.connect.pool", "true");
             context = new InitialDirContext(env);
         } catch (NamingException e) {
             String errMsg = "CDLdapBuilder connect() - failure while attempting to contact "
                  + ldapServerUrl + " Exception is " + e.toString();
             throw new CDLookupException(classIdentifier, methodIdentifier,
                  errMsg, e, LookupFailureReasons.serviceUnavailable);
         } catch (Exception e) {
             String errMsg = "CDLdapBuilder connect() - failure while attempting to contact "
                  + ldapServerUrl + " Exception is " + e.toString();
             throw new CDLookupException(classIdentifier, methodIdentifier,
                  errMsg, e, LookupFailureReasons.serviceUnavailable);
         log.info("new connection :" + (threadCount++) + " name =" + context);
         log.debug("exit " + methodIdentifier);
         return context;
             * releases connection to the free pool
             * @param context
        public synchronized void free(Context context) {
         busyConnections.remove(context);
         availableConnections.add(context);
         // Wake up threads that are waiting for a connection
         notifyAll();
             * @return int give total no of avail connections.
        public synchronized int totalConnections() {
         return (availableConnections.size() + busyConnections.size());
             * Close all the connections. Use with caution: be sure no connections
             * are in use before calling. Note that you are not <I>required</I> to
             * call this when done with a ConnectionPool, since connections are
             * guaranteed to be closed when garbage collected. But this method gives
             * more control regarding when the connections are closed.
        public synchronized void closeAllConnections() {
         closeConnections(availableConnections);
         availableConnections = new Vector();
         closeConnections(busyConnections);
         busyConnections = new Vector();
             * Close all connections existing.
             * @param connections
             *                void
        private void closeConnections(Vector connections) {
         String methodIdentifier = "closeConnections";
         try {
             for (int i = 0; i < connections.size(); i++) {
              Context context = (Context) connections.get(i);
              if (context != null) {
                  log.info(" connection name:" + context
                       + " removed. Threadcount =" + (threadCount++));
                  context.close();
                  context = null;
         } catch (NamingException e) {
             String errMsg = "CDLdapBuilder connect() - failure while attempting to contact "
                  + ldapServerUrl + " Exception is " + e.toString();
             log.error(errMsg);
        public synchronized String toString() {
         String info = "ConnectionPool(" + getLdapServerUrl() + ","
              + getVendorContextFactoryClass() + ")" + ", available="
              + availableConnections.size() + ", busy="
              + busyConnections.size() + ", max=" + maxConnections;
         return (info);
             * @return the defaultSearchBase
        public final String getDefaultSearchBase() {
         return defaultSearchBase;
             * @param defaultSearchBase
             *                the defaultSearchBase to set
        public final void setDefaultSearchBase(String defaultSearchBase) {
         this.defaultSearchBase = defaultSearchBase;
             * @return the ldapServerUrl
        public final String getLdapServerUrl() {
         return ldapServerUrl;
             * @param ldapServerUrl
             *                the ldapServerUrl to set
        public final void setLdapServerUrl(String ldapServerUrl) {
         this.ldapServerUrl = ldapServerUrl;
             * @return the vendorContextFactoryClass
        public final String getVendorContextFactoryClass() {
         return vendorContextFactoryClass;
             * @param vendorContextFactoryClass
             *                the vendorContextFactoryClass to set
        public final void setVendorContextFactoryClass(
             String vendorContextFactoryClass) {
         this.vendorContextFactoryClass = vendorContextFactoryClass;
         * @return the availableConnections
        public final Vector getAvailableConnections() {
            return availableConnections;
    }

    hi ejp
    Thx for the reply.
    // Enable connection pooling
    env.put("com.sun.jndi.ldap.connect.pool", "true");
    Is this suffice to get the connection pool working,
    Should i merely have a thread to maintain the connection with the ldap that uses sun's connection pool; or allow requestes to create new object for the connection and still this pool will hold.
    for example in the above code instead to housekeep the thread merely maintain connection with the pool
    or
    should I directly connect each object with the ldap?
    I am unable to understand how exactly sun's connection pool is working and how it should be used. I have gone thru the following example but picture is still hazy and undigestable to me.
    java.sun.com/products/jndi/tutorial/ldap/connect/pool.html
    Rgds

  • JDBC Connections in WLS 7.0.SP2

    Hello All,
    We are using both entity beans and JDBC calls inside our Stateless Session Beans.
    Our tests show that
    1. we need more database connections (in pool) than number of concurrent users
    (say twice)
    2. getting and releasing connections become a bottleneck as we need to do this
    for every method invocation for making JDBC calls
    3. Methods using only entity beans run faster
    Can somebody explain this behaviour. Thanks in advance for the time and help.
    Best Regards
    MS

    Hi Manoj,
    "MS" <[email protected]> wrote in message news:3eeac5af$[email protected]..
    Hello All,
    We are using both entity beans and JDBC calls inside our Stateless SessionBeans.
    Our tests show that
    1. we need more database connections (in pool) than number of concurrentusers
    (say twice)It all depends how transaction processing is arragend in your application.
    In the worst case you both get connections from the pool using the pool
    driver
    and use TxDatasource for entity beans. Than you will have number of needed
    pool connections doubled. The same story is when you actively use
    RequiresNew transaction attribute for SLSB.
    Normally when you use the Required transaction attibute for
    EJBs and TxDatasource to get connections, the max number of
    consumed connections will be around a number of the execution
    threads.
    2. getting and releasing connections become a bottleneck as we need to dothis
    for every method invocation for making JDBC callsCan you provide more information on the approach used to
    indentify fact of bottleneck? Also, could you please post the connection
    pool and datasource definitions? That will help to identify if the pool
    is possible misconfigured.
    3. Methods using only entity beans run fasterIt's hard to tell why it happens to you withouth knowing more about the
    application. But here are a couple of suggestions: first, weblogic makes
    extensive use of caching when database is accessed via EJBs. second,
    those direct JDBC calls are not written well ot use inappropriate
    transaction
    model.
    Can somebody explain this behaviour. Thanks in advance for the time andhelp.
    Let me know if you have more questions.
    Regards,
    Slava Imeshev

Maybe you are looking for

  • New column with formula in Report Painter - GRR2

    Hi gurus, I want to insert a new element in my new report painter created by GRR2. I took a standard report and I copied the report.  I know how to insert a new element. The problem is I want to choose the value of a field in PROJ table for create a

  • Variable works in Dev but not in Test in Webi report

    Hi All, I have written a variable to calculate Average. It works fine for all entries in Dev. But when I transport it to Test Environment, it works fine for some entries and does not work for some entries. Any suggestions? This is happening in WEBI R

  • Searching java sdk documentation

    My question is: "Is there a way to search the Java 2 SDK, Standard Edition Documentation using JDeveloper?" I know how to browse it, using either browse javadoc or through the help file, but when I do a search using the Help Navigator it does not go

  • Computer wont recognize ZEN Mi

    I have Windows XP Home Edition and I updated the Zen Micro drivers on my computer; but it still won't work. What do you suggest?

  • How to modify Oracle Initialization Parameters in Oracle RAC db

    I would like to modify the AUDIT_SYS_OPERATIONS and SQL92_SECURITY parameters to TRUE. I have a two node Oracle RAC db. Should I stop the clustering services, modify the parameters on both nodes and restart them? Or modify the parameter on one node (