Connection Pooling in OCCI Vs Multi-Threading.

Hi,
I am working on an application in which I am using OCCI( Oracle C++ Call Interface)  and multi-threading concepts.
My application is having different clients( Ex: Client-A, Client-B) and I am offering a set of operations( functions that trigger the Stored Procedures of DataBase ) which are common to all the clients.Each Client can send asynchronous requests of any number.So, is there any chance of using single connection( not connection pooling) to the Data Base for all the clients to manage their requests ?
Note: Multi-threaded requests are also allowed from each client.
How can I co-relate multithreading and Connection Pooling in OCCI?
Can I you multi-threading without Connection Pooling? If so how?
Will the connection pooling is needed if there is no multi threading concept in my application?
Please help me on this. Very urgent.
Thanks in Advance..:)

Connections are resources that the application uses and a fewer connections can be used by multiple threads if the threads are not always busy with the database activity only, and are doing other work too. This sharing (pooling) can be implemented by the application or the application can leverage the connection pooling features offered by OCI/OCCI (recommended).
Be aware of connections vs sessions and sharing them (refer to :
OCI Programming Advanced Topics
OCCIConnectionPool is to pool connections and OCCIStatelessConnectionPool is to pool sessions. Please see the differences in the above link and apply as appropriate.

Similar Messages

  • Tomcat 5.5 + JDBC connection pooling -- help

    I recently upgraded from java 1.4/tomcat 5.0 to java 1.5/tomcat 5.5. I am having difficulty getting connection pooling to work, however.
    Here are the details:
    1. Using mysql 4.1.3 beta -- it has been working fine for my purposes for a while
    2. put mysql-connector-java-3.1.7-bin.jar in tomcat/common/lib.
    3. Here is server.xml:
    <Server port="8005" shutdown="SHUTDOWN">
        <GlobalNamingResources>
            <Resource auth="Container" name="jdbc/TestDB"
            type="javax.sql.DataSource"/>
            <ResourceParams name="jdbc/TestDB">
                <parameter>
                    <name>url</name>
                    <value>jdbc:mysql://localhost:3306/TestDB?autoReconnect=true</value>
                </parameter>
                <parameter>
                    <name>maxIdle</name>
                    <value>40</value>
                </parameter>
                <parameter>
                    <name>maxActive</name>
                    <value>150</value>
                </parameter>
                <parameter>
                    <name>driverClassName</name>
                    <value>com.mysql.jdbc.Driver</value>
                </parameter>
                <parameter>
                    <name>maxWait</name>
                    <value>3000</value>
                </parameter>
                <parameter>
                    <name>removeAbandoned</name>
                    <value>true</value>
                </parameter>
                <parameter>
                    <name>username</name>
                    <value>webapp</value>
                </parameter>
                <parameter>
                    <name>factory</name>
                    <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
                </parameter>
                <parameter>
                    <name>logAbandoned</name>
                    <value>true</value>
                </parameter>
                <parameter>
                    <name>removeAbandonedTimeout</name>
                    <value>90</value>
                </parameter>
                <parameter>
                    <name>password</name>
                    <value>secret</value>
                </parameter>
            </ResourceParams>
        </GlobalNamingResources>
        <Service name="Catalina">
            <Connector port="8080" />
            <Engine name="Catalina" defaultHost="localhost">
                <Host appBase="webapps"
                      autoDeploy="true"
                      debug="5"
                      liveDeploy="true"
                      name="localhost"
                      unpackWARs="true"
                      xmlValidation="true"/>
            </Engine>
        </Service>
    </Server>4. My application is called "bertle". Here is tomcat/conf/Catalina/localhost/bertle.xml:
    <Context path="/bertle" reloadable="true"
             docBase="C:\eclipse\workspace\bertle\bertle"
             workDir="C:\eclipse\workspace\bertle\work">
        <ResourceLink global="jdbc/TestDB"
                      name="jdbc/TestDB"
                      type="javax.sql.DataSource" />
    </Context>5. Tomcat starts up find without showing any errors. However, when I try and run the application I get an error. The error occurs when the user tries to log in, which involves querying the mysql database. Here is some of what it spits up:
    SEVERE: Error in validating user.
    Feb 28, 2005 5:05:16 PM edu.harvard.dsg.chv.model.LoginBean validateUser
    SEVERE: SQL statement =
    org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
         at  org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
         at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
         at mypackage.model.LoginBean.validateUser(LoginBean.java:49)
         at mypackage.action.LoginAction.execute(LoginAction.java:58)6. Here is the line at LoginBean.java:49:
    49    con = dataSource.getConnection();Here are the lines at LoginAction.java:58
    46        // Obtain our environment naming context
    47        Context initCtx = new InitialContext();
    48        Context envCtx = (Context) initCtx.lookup("java:comp/env");
    49       
    50        // Look up our data source
    51        DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB");
    52       
    53        // create a new LoginBean passing the datasource
    54        LoginBean lb = new LoginBean(ds);
    55       
    56        // check to see if this user/password combination are valid
    57        // will return a non-null UserDTO if valid
    58        UserDTO user = lb.validateUser((String)((DynaValidatorForm)form).get("handle"),
    59                (String)((DynaValidatorForm)form).get("password"));Is there something I am also supposed to add to WEB-INF/web.xml ?
    I am offering many kudos to anyone who can tell me what I am overlooking.
    Thanks,
    Jon

    the stuff you added in server.xml is old and wiilnot
    work with 5.5.*
    might pass dtd but it will not work
    did you try changing it to new layoutI gave you one Duke dollar for helping me with this.
    I will give another one to anyone who can tell me
    e how to set up global connection pooling in tomcat.Hi,
    Please bear with me for replying to a thread that's a week old.
    I was trying to set up connection pooling in tomcat and this thread helped me clear up some issues for the same.
    Incidentally google returns this thread among the top 10 when i search for tomcat 5.5 connection pooling.
    There are some unexplained questions here (regarding global connection pooling) and since I was able to set that up too, this may, in the future, benefit anybody who faces similar issues.
    Setting Up Global Connection Pooling
    Add this piece of code to server.xml under the server element
    <Server port="8005" shutdown="SHUTDOWN">
      <!-- other elements -->
      <GlobalNamingResources>
         <!-- other global resources-->
          <Resource name="jdbc/learning" auth="Container"                      type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
                         url="jdbc:oracle:thin:@localhost:1521:learning"
                         username="Learning" password="Learning" maxActive="20" maxIdle="10"  maxWait="-1"/>         
      </GlobalNamingResources>And then in your context file (which may be the <webapps>/<your appn>/META-INF/<your_web_app.xml> directory or conf/catalina/localhost/<your_web_app.xml>)
    add this code
    <Context docBase="${catalina.home}/webapps/webtest"
             privileged="true" antiResourceLocking="false" antiJARLocking="false">
    <!-- Use this if you dont require global resources
      <Resource name="jdbc/learning" auth="Container"
                         type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
                         url="jdbc:oracle:thin:@localhost:1521:learning"
                         username="Learning" password="Learning" maxActive="20" maxIdle="10"
                  maxWait="-1"/>
    -->
    <!-- this is a resource link if you have defined resource globally-->
    <ResourceLink
                name="jdbc/learning"
                global="jdbc/learning"
                type="javax.sql.DataSource"
              />
    </Context>also tomcat recommends defining the docBase outside the webapps directory (ie any other location outside the tomcat installation dir) if you choose to define contexts in xml files.
    thanks,
    ram.

  • Connection pool issue with packaged application

    we are using 9.2 mp1 for a Oarcle packaged application which is talking to Oracle RAC. In production one
    of the RAC nodes went down and we see that the wbelogic connection pool is never able to reconnect
    This is a packaged application Bharosa which internally uses hibernate and in turn relies on weblogic connection pool
    See a few stuck threads in the logs indicating some prolem with the connection cleanup
    <Dec 16, 2008 12:11:03 PM PST> <Error> <WebLogicServer> <BEA-000337> <[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)' has been busy for "626" seconds working on the request "Http Request: /fahost/econnect/IntegratedAuthRemoteServlet.svl;JSPSESSIONID=82W2JLLJ8vCB25G3jyc6cYdXVXLYc1G1GwTt91plpCpB9MY6yQP3!468271380!-864027599!1229457609639", which is more than the configured time (StuckThreadMaxTime) of "600" seconds. Stack trace:
         weblogic.common.resourcepool.ResourcePoolImpl.releaseResource(ResourcePoolImpl.java:521)
         weblogic.jdbc.common.internal.ConnectionPool.release(ConnectionPool.java:669)
         weblogic.jdbc.common.internal.ConnectionPoolManager.release(ConnectionPoolManager.java:113)
         weblogic.jdbc.wrapper.PoolConnection.doClose(PoolConnection.java:192)
         weblogic.jdbc.wrapper.PoolConnection.close(PoolConnection.java:117)
         org.hibernate.connection.DatasourceConnectionProvider.closeConnection(DatasourceConnectionProvider.java:74)
         org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:388)
         org.hibernate.jdbc.ConnectionManager.aggressiveRelease(ConnectionManager.java:343)
         org.hibernate.jdbc.ConnectionManager.afterTransaction(ConnectionManager.java:230)
         org.hibernate.jdbc.JDBCContext.afterTransactionCompletion(JDBCContext.java:201)
         org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:127)
         com.bharosa.common.hibernate.HiberDBMgr.commitTransaction(HiberDBMgr.java:293)
         com.bharosa.common.db.BharosaDBMgr.endSession(BharosaDBMgr.java:243)
         com.bharosa.common.hibernate.HiberBaseDAO.executeQuery(HiberBaseDAO.java:596)
         com.bharosa.common.hibernate.HiberBaseDAO.executeDBQuery(HiberBaseDAO.java:543)
         com.bharosa.common.hibernate.HiberDBMgr.executeDBQuery(HiberDBMgr.java:351)
         com.bharosa.vcrypt.dataaccess.impl.VCryptUserDataAccessImpl.getVCryptUserByLoginId(VCryptUserDataAccessImpl.java:520)
         com.bharosa.vcrypt.auth.impl.VCryptAuthImpl.getUserByLoginId(VCryptAuthImpl.java:274)
         com.bharosa.client.BharosaHelper.getUser(BharosaHelper.java:116)
         com.bharosa.client.BharosaHelper.createPersonalizedAuthentiPad(BharosaHelper.java:308)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthDelegateSkeleton.getAuthpadHTML(IntegratedAuthDelegateSkeleton.java:672)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthDelegateSkeleton.createAuthPad(IntegratedAuthDelegateSkeleton.java:113)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthDelegateSkeleton.createAuthPad(IntegratedAuthDelegateSkeleton.java:103)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthRemoteServlet.invokeService(IntegratedAuthRemoteServlet.java:60)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthRemoteServlet.doPost(IntegratedAuthRemoteServlet.java:40)
         javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
         javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
         weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:223)
         weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
         weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
         weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
         weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3245)
         weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
         weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
         weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2003)
         weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1909)
         weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1359)
         weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
         weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
    >
    <Dec 16, 2008 12:11:03 PM PST> <Error> <WebLogicServer> <BEA-000337> <[STUCK] ExecuteThread: '9' for queue: 'weblogic.kernel.Default (self-tuning)' has been busy for "616" seconds working on the request "weblogic.work.ServerWorkManagerImpl$WorkAdapterImpl@ba063", which is more than the configured time (StuckThreadMaxTime) of "600" seconds. Stack trace:
         weblogic.common.resourcepool.ResourcePoolImpl.getCurrCapacity(ResourcePoolImpl.java:671)
         weblogic.common.resourcepool.ResourcePoolImpl$ResourcePoolMaintanenceTask.timerExpired(ResourcePoolImpl.java:1922)
         weblogic.timers.internal.TimerImpl.run(TimerImpl.java:265)
         weblogic.work.ServerWorkManagerImpl$WorkAdapterImpl.run(ServerWorkManagerImpl.java:518)
         weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
         weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
    >
    <Dec 16, 2008 12:11:03 PM PST> <Error> <WebLogicServer> <BEA-000337> <[STUCK] ExecuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)' has been busy for "635" seconds working on the request "Http Request: /fahost/econnect/IntegratedAuthRemoteServlet.svl;JSPSESSIONID=Q3C6JLLV1lwjqmTWLQ4m5M02BqBKmQzcyt66wY925kykg2pQyB1t!1872529297!468271380!1229457621681", which is more than the configured time (StuckThreadMaxTime) of "600" seconds. Stack trace:
         java.net.SocketInputStream.socketRead0(Native Method)
         java.net.SocketInputStream.read(SocketInputStream.java:129)
         oracle.net.ns.Packet.receive(Unknown Source)
         oracle.net.ns.DataPacket.receive(Unknown Source)
         oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
         oracle.net.ns.NetInputStream.read(Unknown Source)
         oracle.net.ns.NetInputStream.read(Unknown Source)
         oracle.net.ns.NetInputStream.read(Unknown Source)
         oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1099)
         oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1070)
         oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:478)
         oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
         oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
         oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10622)
         weblogic.jdbc.wrapper.PreparedStatement.executeBatch(PreparedStatement.java:157)
         org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
         org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
         org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
         org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
         org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
         org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
         org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1009)
         org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:356)
         org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
         com.bharosa.common.hibernate.HiberDBMgr.commitTransaction(HiberDBMgr.java:293)
         com.bharosa.common.db.BharosaDBMgr.endSession(BharosaDBMgr.java:243)
         com.bharosa.common.dataaccess.DataAccessMgr.endSession(DataAccessMgr.java:132)
         com.bharosa.vcrypt.tracker.impl.VCryptTrackerImpl.updateLog(VCryptTrackerImpl.java:1048)
         com.bharosa.vcrypt.tracker.impl.VCryptTrackerImpl.updateLog(VCryptTrackerImpl.java:622)
         com.bharosa.client.BharosaHelper.fingerPrintFlash(BharosaHelper.java:203)
         com.bharosa.client.BharosaHelper.fingerPrintBrowser(BharosaHelper.java:155)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthDelegateSkeleton.runPreAuthRules(IntegratedAuthDelegateSkeleton.java:239)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthDelegateSkeleton.runPreAuthRules(IntegratedAuthDelegateSkeleton.java:214)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthRemoteServlet.invokeService(IntegratedAuthRemoteServlet.java:83)
         com.svb.ib.security.web.loginauthserver.IntegratedAuthRemoteServlet.doPost(IntegratedAuthRemoteServlet.java:40)
         javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
         javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
         weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:223)
         weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
         weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
         weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
         weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3245)
         weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
         weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
         weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2003)
         weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1909)
         weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1359)
         weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
         weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
    >

    Hi. Something is seriously ill there. I would ask that you post a full thread dump
    to see what's locking what. You may need an official support case...

  • Proble with multi-threaded app using the same connection

    have a multi-threaded app. The threads all share the
    same connection. They all do some selects / updates.
    The OS is NT 4.0 and the application server is weblogic
    Some times I am getting the error "java.sql.SQLException: Io exception: not in streaming mode"
    and some times I am getting "java.sql.SQLException: Io exception: Protocal violation
    Any Ideas?
    Regards
    Suresh

    Don't create threads.... Your threads should if they are necessary be reusable, your threads should call the connections it needs from the cache service with let's say a max number of N pools (each pool a max number of M connections), if the connection domain asked exists on cache a connection is asked for corresponding pool, if the connection domain is not on cache the less used domain is thrown away (all inner connections closed first) and substituted by the new one requested. While the pool is not full keep creating connections as the request came (and all existing connections are being held and not released), when M connections exists, a request should wait till a connection is released.
    If you can have 20 threads asking for the same connection and the max number of connections on pool is M=10, then yopur threads will wait for a connection being released. All this must be synchronized. You should set M the closest as possible to the normal number of requests you can imagine to happen the same time. You should get connection use it and release it right away if you can have a lot of requests.
    I hope this helps you.

  • Multi-Thread vs. ConnectionPool vs. Connection Management

    Hi there,
    In an OCI8-JDBC context - do I have three choices ????
    Multi-Trhead / one connection:
    Share one connection for all requests using
    one thread for each client
    Connection-Pool:
    Create one connection for each client
    Connection-Management:
    multiplex over one connection using
    getConnection(jdbc:oracle:oci8:@description...."
    null

    Hi there,
    In an OCI8-JDBC context - do I have three choices ????
    Multi-Trhead / one connection:
    Share one connection for all requests using
    one thread for each client
    Connection-Pool:
    Create one connection for each client
    Connection-Management:
    multiplex over one connection using
    getConnection(jdbc:oracle:oci8:@description...."
    null

  • 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

  • Execute threads used by connection pools

    Hellos,
    I am interested in fining out the relationship betwen the sizes of the execute
    thread pool and a connection pool (jolt in my case).
    I would like to know if each jolt conection uses up a thead from the default execute
    queu or if the threads are taken from a different and reserved thread pool.
    I am trying to tune up the thread pool size according to my pool sizes and so
    on.
    Any ideas?
    Best regards,
    Cristina

    Cristina Ceballos wrote:
    Hellos,
    I am interested in fining out the relationship betwen the sizes of the execute
    thread pool and a connection pool (jolt in my case).
    I would like to know if each jolt conection uses up a thead from the default execute
    queu or if the threads are taken from a different and reserved thread pool.
    I am trying to tune up the thread pool size according to my pool sizes and so
    on.
    Any ideas?Hi. Connection pools do not use threads. Your application thread will get a connection
    from the pool and use it. The relationship between threads and pools is that you want
    to have enough connections in your pool to be able to serve all the threads that
    may individually want a connection. Therefore for a server with 25 execute-threads,
    you would typically define the pool to have 25 connections.
    Joe
    >
    Best regards,
    Cristina

  • Connection pools, dspMaxThreads, listener-threads and ReceiverThreads?

    Hi,
    We are using BPEL 10.1.3.3. Our integration uses the database adapter and the AQ adapter against the same remote database 10.1.2.3. We are experiencing problems with transaction that fails with:
    java.sql.SQLException: Unable to get a physical connection from the database...there are no connections available.Error Code: 0.
    Then we tried to change the connection pools to not use so many connection but now instances disappears.
    The 2 connections pools are setup like this:
    DBAdapter connection pool with max 10 connection
    AqAdapter connection pool with max 2 connections
    We have 3 domains:
    Default:
    dspMaxThreads 20
    dspMinThreads 5
    Test:
    dspMaxThreads 100
    dspMinThreads 5
    Production:
    dspMaxThreads 60
    dspMinThreads 5
    listener-threads and ReceiverThreads are set to 300 in the orion-ejb-jar.xml in C:\oracle\product\10.1.3.1\OracleAS_1\j2ee\oc4j_soa\application-deployments\orabpel\ejb_ob_engine
    I had a look at Clemens blog about lost instances (http://clemensblog.blogspot.com/2007/07/soa-suite-10133-patchset-and-lost.html) but I cannot understand the part about listener-threads and receiverThreads. Can anybody explain how the size of the connection pools and the dspMaxThreads, ReceiveThreads andlistener-threads has to be?
    Regards Pete
    Here are the settings for the WorkerBean:
    <message-driven-deployment name="WorkerBean" listener-threads="300" min-instances="100" resource-adapter="BPELjms">
    <ejb-ref-mapping name="ejb/local/DispatcherLocalBean" jndi-properties-file="jndi.properties" />
    <ejb-ref-mapping name="ejb/local/CubeEngineLocalBean" jndi-properties-file="jndi.properties" />
    <ejb-ref-mapping name="ejb/local/DomainManagerLocalBean" jndi-properties-file="jndi.properties" />
    <ejb-ref-mapping name="ejb/local/ActivityManagerLocalBean" jndi-properties-file="jndi.properties" />
    <ejb-ref-mapping name="ejb/local/CubeDeliveryLocalBean" jndi-properties-file="jndi.properties" />
    <ejb-ref-mapping name="ejb/local/MessageLocalBean" jndi-properties-file="jndi.properties" />
    <ejb-ref-mapping name="ejb/services/NotificationServiceBean" jndi-properties-file="jndi.properties" />
    <ejb-ref-mapping name="ejb/local/TaskServiceBean" jndi-properties-file="jndi.properties" />
    <config-property>
    <config-property-name>ConnectionFactoryJndiName</config-property-name>
    <config-property-value>BPELjms/BPELWorkerQueueFactory</config-property-value>
    </config-property>
    <config-property>
    <config-property-name>DestinationName</config-property-name>
    <config-property-value>BPELjms/BPELWorkerQueue</config-property-value>
    </config-property>
    <config-property>
    <config-property-name>DestinationType</config-property-name>
    <config-property-value>javax.jms.Queue</config-property-value>
    </config-property>
    <config-property>
    <config-property-name>AcknowledgeMode</config-property-name>
    <config-property-value>Auto-acknowledge</config-property-value>
    </config-property>
    <config-property>
    <config-property-name>ReceiverThreads</config-property-name>
    <config-property-value>300</config-property-value>
    </config-property>
    <config-property>
    <config-property-name>ListenerThreadMaxIdleDuration</config-property-name>
    <config-property-value>100000000</config-property-value>
    </config-property>
    <config-property>
    <config-property-name>ListenerThreadMinBusyDuration</config-property-name>
    <config-property-value>1</config-property-value>
    </config-property>
    <config-property>
    <config-property-name>ListenerThreadMaxPollInterval</config-property-name>
    <config-property-value>10</config-property-value>
    </config-property>
    </message-driven-deployment>Please :-)
    Message was edited by:
    Peter Lorenzen

    Thanks Marc,
    Yes I have and I got it working. If you set dspMaxThread to 90 and my connections pools to max session 90 it works. Don't understand why it has to be so high. It's potentially a lot of resources that has to be available on the database (Extra ram). But it looks like it's OK for now.
    Regards Pete

  • Jolt client vs. jolt connection pooling

    We are porting our app to weblogic. We are current users of jolt but since we weren't
    using weblogic
    we are currently using jolt client out of the app server. We are examining the merits
    of converting to use
    the jolt connection pool.
    I have been told that jolt client is multi-threaded so the question is: if we convert
    to jolt connection pooling
    will we see a performance improvement, and if so, why? Or is the advantage purely
    from an administrative
    standpoint, and if so, what are the advantages there?

    Connections are resources that the application uses and a fewer connections can be used by multiple threads if the threads are not always busy with the database activity only, and are doing other work too. This sharing (pooling) can be implemented by the application or the application can leverage the connection pooling features offered by OCI/OCCI (recommended).
    Be aware of connections vs sessions and sharing them (refer to :
    OCI Programming Advanced Topics
    OCCIConnectionPool is to pool connections and OCCIStatelessConnectionPool is to pool sessions. Please see the differences in the above link and apply as appropriate.

  • Memory leaks and multi threading issues in managed client.

    In our company we use a lot of Oracle, and after the release of the managed provider we migrated all applications to it. First the  things were very impressive : the new client was faster, but after some days applications that uses 100MB with old client goes to 1GB and up. The memory is not the only issue, we use a lot of multi threading, and we experience connection drops and not disposal, after 1 days working one of the application had over 100 sessions on the server. I think there is something wrong with connection pool and multi threading.
    Is someone experience same problems.
    Yesterday we went back with unmanaged provider. Now things are back to normal.

    connection drops: did you try to use "Validate Connection=true" parameter in your connection string?
    the new client was faster: are you sure with this statement? Even in 64bit environment? I got quite serious performance problems when running application under 64bit process: https://forums.oracle.com/thread/2595323

  • [原创] 有关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!

  • Multi-threading

    Hi folks,
    I need to have one Connection object and multiple Statement objects created from this Connection Object. Is it safe to do this from a multi-threaded application?
    Does createStatement() destroy any previously created Statement?

    You can have multiple statements in different threads coming of the same connection.
    But, all such statements will be part of the same transacion. A DML in one thread will be reflected in a query in another thread.
    If this not what you wanted, then you can have a connection pool and get connections from it in the individual threads.

  • Use of Semaphore in addition to db connection pool

    Hi,
    I have a multi-threaded app, about 4 threads, reading from a local DB then pushing to a web service,
    then writing a response back to the local DB. I'm using Commons DBCP with a size of 20.
    Do you think there is any added benefit to using semaphore to safe-guard access to the DB pool?
    Will this prevent any deadlocks in a more thorough manner?

    iketurner wrote:
    Yes,
    after I am done with the connection I explicitly close it:
    conn.closeThis should handle things for me.
    I will add in the use of finally
    Will this make a difference you think, even though I am using conn.close()?whenever you use a "resource" you should close it in a finally block. otherwise you can leak resources if you encounter problems (i.e. throw exception):
    Connection c = null;
    try {
      c = ...;
      // do something with c
    } finally {
      if(c != null) {
        c.close();
    }this is a must if you are using db connections, otherwise an exception thrown during the "do something with c" part will cause your connection to not be closed. then you would encounter problems later as all you run out of connections in your connection pool and your application hangs.

  • Multi-threading problem

    Hello everybody,
    I am having a problem using OCCI and threads.
    First I have Oracle RAC, I launched 5 threads from my application to do some query each thread has its own parameters to the same query but all are accessing the same table which is created with nolog option.
    The problem is the application always crashes whenever the threads are all at the same point of getting result set and specifcally at next() .
    I am suspecting that result set returned is null or paralle execution of the query has problem.
    P.S.: I have a connection pool which I use to get connection for each thread separately. The environment object is created with Object I tried to create the environment with Multithreaded_mutexed | object but it crashes while executing the app.
    Can anybody help ?

    Are you creating the environment as shown below?
    Environment *env = Environment::createEnvironment(Environment::Mode((Environment::OBJECT|Environment::THREADED_MUTEXED)));                                                                                                                                                                                                                                                                                                                                                       

  • Repost-Best way of using connection pooling

    I am reposting this, seems best suitable in this category.
    I am using Eclipse 3.1 along with Tomcat 5.0, MySQL 4.1, J2EE1.4. I could set up the JNDI Dataresource connection pooling and tested with small test servlet. Now thinking of having common methods for getting connection / closing / commiting ....etc.
    I wrote following. [Please let me know whether it is correct way of doing it - as i am not very sure]
    package common;
    import java.sql.*;
    import javax.sql.*;
    import javax.naming.*;
    import org.apache.log4j.Logger;
    public final class connectionManager {
         private static Logger logger = Logger.getLogger(common.connectionManager.class);
         public connectionManager() {}
         public static Connection getConn () throws NamingException, SQLException
    //JNDI DataSource connection pooling
              Connection conn = null;
              try{
                   Context initContext = new InitialContext();
                   Context envContext  = (Context)initContext.lookup("java:/comp/env");
                   DataSource ds = (DataSource)envContext.lookup("jdbc/TQ3DB");
                   conn = ds.getConnection();
              }catch (NamingException ne) {
                  new GlobalExceptionHandler(logger, ne);
                   conn = null;
                   throw new NamingException();
              }catch (SQLException e){
                   new GlobalExceptionHandler(logger, e);
                   conn = null;
                   throw new SQLException();
              return conn;
           }//getConnection
         public static void commit(Connection conn) throws SQLException
              conn.commit();
         public static void rollback(Connection conn) throws SQLException
              conn.rollback();
           public static void setAutoCommit(Connection conn, boolean autoCommit)
                                        throws SQLException
                conn.setAutoCommit(autoCommit );
         public static void closeConnection(Connection conn) throws SQLException{
              if (conn != null) {
                   conn.close();
                   conn = null;
         }//closeConnection
         public static void closeResources(ResultSet oRS, PreparedStatement pstmt) throws SQLException
              if (oRS != null) {
                   oRS.close();
                   oRS = null;
              if (pstmt != null) {
                        pstmt.close();
                        pstmt = null;
         } // closeResources
    }//ConnectionManager
    I am having a login form which submits user name and password. I am checking this against the database. Following is the servlet to do that.
    package login;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.sql.*;
    import common.*;
    public class loginServlet extends HttpServlet {
         public void doGet(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException, IOException {          
              doPost(request, response);
         }//doGet
         public void doPost(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException,IOException{
              String userId = request.getParameter("userId");
              String password = request.getParameter("password");
              ** call a method to validate the password which will return the
              ** User Name for authorized users and null string for un-authorised.
              String uName = validateUser(userId, password);
              //if uName is null .. user is not authorized.
              if (uName == null){
                   //redirect to jsp page with error message
                  RequestDispatcher rd =
                       getServletContext().getRequestDispatcher("/jsps/mainmenu.jsp");
                  if (rd != null){
                       rd.forward(request,response);
              else{
                   // the user is valid - create a seesion for this user.
                   HttpSession userSession = request.getSession(true);
                   // put the user name session variable.
                   userSession.setAttribute("userName", uName);
                   //redirect to Main menu page
                   RequestDispatcher rd =
                        getServletContext().getRequestDispatcher("/jsps/mainmenu.jsp");
                   if (rd != null){
                        rd.forward(request,response);
         }// end of doPost
         private String validateUser(String userId, String password)
                   throws SQLException{
              String returnVal = null;
              connectionManager cm = new connectionManager();
              Connection conn = null;
              PreparedStatement pstmt = null;
              ResultSet oRS = null;
              try{
                   //get the connection
                   conn = cm.getConn ();
                   //get records from user table for this user id and password
                   String sQry = "SELECT  user_login FROM user "
                             + "where user_login = ? AND user_pwd = ? ";
                   pstmt = conn.prepareStatement(sQry);
                   pstmt.setString(1, userId);
                   pstmt.setString(2, password);
                   oRS = pstmt.executeQuery();
                   //check for record
                   if (oRS.next()) {
                        returnVal = oRS.getString("user_login");
                   }else {returnVal = null;}
                 }catch (Exception e){            
                      returnVal = null;
              }finally{
                   cm.closeResources(oRS, pstmt);
                   cm.closeConnection(conn);
              return returnVal;
    }// end of servlet class
    But i am unable to compile it and i am also getting lots of warnings.
    I am getting error at line
    1)String uName = validateUser(userId, password);
    Unhandled exception type SQLException loginServlet.java TQ3/WEB-INF/src/login line
    Following warnings:
    2)For loginServlet Declaration
    The serializable class DBTest does not declare a static final serialVersionUID field of type long loginServlet.java
    3)The static method getConn() from the type connectionManager should be accessed in a static way
    4)The static method closeResources(ResultSet, PreparedStatement) from the type connectionManager should be accessed in a static way
    5)The static method closeConnection(Connection) from the type connectionManager should be accessed in a static way
    Definitely I am doing it wrong but exactly where? I am having very strong doubt the way i am using connections is not the correct way. Pls help me.
    regards
    Manisha

    I am in a search of best way to use connection pooling. Initially was using simple JDBC call, then modified to JNDI, afterwards tried to have common class. Later came accross the idea of Singleton/Static. I wanted to have a common class which will handle all connection related issues and at the same time give good performance.
    With due respect to all Java Gurus: i got all from web articles/tutorials/java forum etc. There is a long discussion regarding Singlet vs static in this forum. But finally got confused and could not figure out in my case which method shall i make use of, so tried both.
    What I want is somebody pointing out flwas inside my 2 code snippets and guide me about which method shall i adopt in future.
    Static way:
    package common;
    import java.sql.Connection;
    import javax.sql.DataSource;
    import java.sql.SQLException;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    public final class ConnectionManager_Static {
         private static InitialContext ctx = null;
         private static DataSource ds = null;
         public ConnectionManager_Static(){     }
         //as the staic method is updating static var i am synchonizing it
         private static synchronized void getDatasource () throws NamingException, SQLException
              if (ds == null){
                   ctx = new InitialContext();
                   ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySql");
         //making getConnection() also static as it is not instance specific     
         public static Connection getConnection () throws NamingException, SQLException, Exception
              Connection conn = null;
              try{     
                   if (ds == null) {getDatasource ();}
                   if (ds != null) {
                        conn = ds.getConnection();                 
              }catch (Exception e){
                   throw new Exception("From ConnectionManager_Static",e);
              return conn;
           }//getConnection
    }Singleton:
    package common;
    import java.sql.*;
    import javax.sql.*;
    import javax.naming.*;
    public final class ConnectionManager_Singleton {
             private static ConnectionManager_Singleton INSTANCE = null;
              private DataSource datasource = null;
              // Private constructor for singleton pattern
             private ConnectionManager_Singleton() throws NamingException{
                   Context ctx = new InitialContext();
                   datasource = (DataSource)ctx.lookup("java:comp/env/jdbc/MySql");
             //synchronized creator for  multi-threading issues
             //another if check to avoid multiple instantiation
             private synchronized static void createInstance() throws NamingException{
                 if (INSTANCE == null) {
                     INSTANCE = new ConnectionManager_Singleton();
             public static ConnectionManager_Singleton getInstance() throws NamingException {
                 if (INSTANCE == null) createInstance();
                 return INSTANCE;
              public Connection getConnection() throws Exception
                   Connection con = null;
                   try{
                        con = datasource.getConnection();
                   }catch(Exception e){
                        throw new Exception("From connection manager singleton ", e);
                   return con;
    }Sorry, It's becoming long.
    Thanaks in advance,
    Manisha

Maybe you are looking for

  • Timestamp off by 1 hour

    Production department scans images using OS 10.3. The files are stored on a Windows 2000 server. Once the files are complete, they are copied to another Windows 2000 server located offsite. When the images are copied, the Date Modified appears correc

  • Konqueror strangeness

    For quite some time I've noticed the following Konqueror behaviour only under Arch Linux (as opposed to other distros): 1. Intermittently, attempts to open a text file while running Konqueror as superuser will result in my being told KDE could load K

  • Mm certification

    Hi MM experts, where can i get the  mm certification   certification MODEL papers online. if any one having can u pls send me  . to anthyodayaGMAIL.COM Tanks inadvance, Anthyodaya.

  • CS2 camera raw plug-in no longer working

    Issue description Summary: I currently have CS2 installed on my Dell desktop. In September, I noticed that I could no longer open raw files and I looked on the Adobe site, found the plug-in, downloaded it and all was well. Just the other day I went t

  • Search help Custom Table.

    Hi Experts, I have a custom table with 4 fields. On the selection screen i have these exact four fields too. I designed a elementary search help as well. Now my requirement is. On selecting a row in F4 all the four fields have to be filled. The selec