Re: Using Tomcat7 JDBC Connection Pool
Thanks for the response. The below suggestion to make an SP call worked out. Another update on programmatic registering the pool to jmx - It worked out and here is how I did it MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); try { tomcatDataSource.createPool(); mBeanServer.registerMBean(tomcatDataSource.getPool().getJmxPool(), new ObjectName(tomcat.jdbc:type=ConnectionPool)); } catch (Exception e) { throw new RuntimeException(Error registering the tomcat pool data source, e); } Thanks for the quick support on my queries. On Tue, Feb 14, 2012 at 3:42 AM, Filip Hanik - Dev Lists devli...@hanik.com wrote: Here is an example String query = BEGIN DBMS_LOCK.sleep(seconds = 5.01); END; It is pretty obvious that you can't do SELECT 1; SELECT 1; is this would result in TWO result sets. But you can create a block and execute any number of instructions The above example executes a stored procedure. Filip On 2/9/2012 9:48 AM, Pid wrote: On 09/02/2012 16:21, Amit wrote: Any thoughts on the first point about executing multiple SQL queries on physical connection creation? I have no idea if it'll work, but I'd try: SELECT 1; SELECT 1; If you are controlling the pool (and you are) by passing in username/password parameters each time, then you could do it as an extra transaction thereafter. p On 09-Feb-2012, at 7:05 PM, Pidp...@pidster.com wrote: On 09/02/2012 12:56, amit shah wrote: One more comment below about oracle UCP. snip The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. So why not create multiple controlled pools not run into availability problems? snip What overhead? The application server and database server resources (memory, cpu etc) for keeping the connections open? That's a total connection count dependent metric. So the overhead is virtually the same regardless of whether you have 5 pools or 1, if you have the same total number of connections. For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. There's a flaw in your logic. In your example there may be zero connections open for a given tenant because they use a shared pool. So you might has well have separate pools with the minimum set to 2 and still have more connections guaranteed per tenant, and the 10 you were aiming for. Worse, if you hit your max with other tenants, a remaining tenant might not be able to get a connection at all, thus failing to address one of the key requirements in a multi-tenant system - guaranteed availability. Probably true when all the tenants are actively used. As I said, there is always a flexibility in the configuration to use a separate pool for a particular tenant. That should be the default IMO. You're asking for trouble otherwise. Also the application can always provide a configuration flexibility to allow a tenant to use a separate pool instead of sharing it with other tenants (like I said above). This flexibility is provided by the Oracle Universal Connection Poolhttp://docs.oracle.com/**cd/E11882_01/java.112/e12265/** toc.htmhttp://docs.oracle.com/cd/E11882_01/java.112/e12265/toc.htm So if that's a better fit for your requirement, why not use it? It provides the feature I mentioned about by has lock contention issues. Tomcat 7 jdbc pool seems to be better and hence I was trying it out. ! snip If you are programmatically registering the pool, can you not just register it with the MBean server yourself? Ok I will try this and provide an update. Cool. p -- [key:62590808] --**--** - To unsubscribe, e-mail: users-unsubscribe@tomcat.**apache.orgusers-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org --**--**- To unsubscribe, e-mail: users-unsubscribe@tomcat.**apache.orgusers-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Using Tomcat7 JDBC Connection Pool
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Amit, On 2/9/12 11:21 AM, Amit wrote: Any thoughts on the first point about executing multiple SQL queries on physical connection creation? Doesn't Oracle have a CALL() syntax in a regular query? How are you getting parametric information from the client code into the JDBC connection set-up code? ThreadLocals or something like that? Otherwise, I'm not sure how you'd know that the NLS settings should be set to something specific. Can't you pass that stuff in via the URL, too? - -chris -BEGIN PGP SIGNATURE- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk85hHwACgkQ9CaO5/Lv0PC4NgCeKkh0knaDzEsbd5eQDyAXcaH7 bkcAoJJEJnmuH6+3spTmv5Se+I+fQIBw =i/p+ -END PGP SIGNATURE- - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Using Tomcat7 JDBC Connection Pool
Here is an example String query = BEGIN DBMS_LOCK.sleep(seconds = 5.01); END; It is pretty obvious that you can't do SELECT 1; SELECT 1; is this would result in TWO result sets. But you can create a block and execute any number of instructions The above example executes a stored procedure. Filip On 2/9/2012 9:48 AM, Pid wrote: On 09/02/2012 16:21, Amit wrote: Any thoughts on the first point about executing multiple SQL queries on physical connection creation? I have no idea if it'll work, but I'd try: SELECT 1; SELECT 1; If you are controlling the pool (and you are) by passing in username/password parameters each time, then you could do it as an extra transaction thereafter. p On 09-Feb-2012, at 7:05 PM, Pidp...@pidster.com wrote: On 09/02/2012 12:56, amit shah wrote: One more comment below about oracle UCP. snip The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. So why not create multiple controlled pools not run into availability problems? snip What overhead? The application server and database server resources (memory, cpu etc) for keeping the connections open? That's a total connection count dependent metric. So the overhead is virtually the same regardless of whether you have 5 pools or 1, if you have the same total number of connections. For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. There's a flaw in your logic. In your example there may be zero connections open for a given tenant because they use a shared pool. So you might has well have separate pools with the minimum set to 2 and still have more connections guaranteed per tenant, and the 10 you were aiming for. Worse, if you hit your max with other tenants, a remaining tenant might not be able to get a connection at all, thus failing to address one of the key requirements in a multi-tenant system - guaranteed availability. Probably true when all the tenants are actively used. As I said, there is always a flexibility in the configuration to use a separate pool for a particular tenant. That should be the default IMO. You're asking for trouble otherwise. Also the application can always provide a configuration flexibility to allow a tenant to use a separate pool instead of sharing it with other tenants (like I said above). This flexibility is provided by the Oracle Universal Connection Poolhttp://docs.oracle.com/cd/E11882_01/java.112/e12265/toc.htm So if that's a better fit for your requirement, why not use it? It provides the feature I mentioned about by has lock contention issues. Tomcat 7 jdbc pool seems to be better and hence I was trying it out. ! snip If you are programmatically registering the pool, can you not just register it with the MBean server yourself? Ok I will try this and provide an update. Cool. p -- [key:62590808] - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Using Tomcat7 JDBC Connection Pool
On 09/02/2012 17:24, Amit wrote: Comment below On 09-Feb-2012, at 10:18 PM, Pid p...@pidster.com wrote: On 09/02/2012 16:21, Amit wrote: Any thoughts on the first point about executing multiple SQL queries on physical connection creation? I have no idea if it'll work, but I'd try: SELECT 1; SELECT 1; If you are controlling the pool (and you are) by passing in username/password parameters each time, then you could do it as an extra transaction thereafter. Executing the queries after retrieving the connection would not be the right option since they would execute every time the connection is borrowed instead of executing it only on physical connection creation. I was assuming that, as you controlled the pool, you'd be able to figure out when you run the extra commands. Can the jdbc interceptor architecture be extended to provide a method which is called when the physical connection is created? ( similar to disconnect()) Interceptors can do a bunch of things. What have you tried/looked at so far? p p On 09-Feb-2012, at 7:05 PM, Pid p...@pidster.com wrote: On 09/02/2012 12:56, amit shah wrote: One more comment below about oracle UCP. snip The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. So why not create multiple controlled pools not run into availability problems? snip What overhead? The application server and database server resources (memory, cpu etc) for keeping the connections open? That's a total connection count dependent metric. So the overhead is virtually the same regardless of whether you have 5 pools or 1, if you have the same total number of connections. For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. There's a flaw in your logic. In your example there may be zero connections open for a given tenant because they use a shared pool. So you might has well have separate pools with the minimum set to 2 and still have more connections guaranteed per tenant, and the 10 you were aiming for. Worse, if you hit your max with other tenants, a remaining tenant might not be able to get a connection at all, thus failing to address one of the key requirements in a multi-tenant system - guaranteed availability. Probably true when all the tenants are actively used. As I said, there is always a flexibility in the configuration to use a separate pool for a particular tenant. That should be the default IMO. You're asking for trouble otherwise. Also the application can always provide a configuration flexibility to allow a tenant to use a separate pool instead of sharing it with other tenants (like I said above). This flexibility is provided by the Oracle Universal Connection Poolhttp://docs.oracle.com/cd/E11882_01/java.112/e12265/toc.htm So if that's a better fit for your requirement, why not use it? It provides the feature I mentioned about by has lock contention issues. Tomcat 7 jdbc pool seems to be better and hence I was trying it out. ! snip If you are programmatically registering the pool, can you not just register it with the MBean server yourself? Ok I will try this and provide an update. Cool. p -- [key:62590808] - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- [key:62590808] - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- [key:62590808] signature.asc Description: OpenPGP digital signature
Re: Using Tomcat7 JDBC Connection Pool
Comments below. On Wed, Feb 8, 2012 at 9:19 PM, Pid p...@pidster.com wrote: On 08/02/2012 14:59, amit shah wrote: Responses below. Thanks. On Wed, Feb 8, 2012 at 7:14 PM, Pid p...@pidster.com wrote: On 08/02/2012 12:30, amit shah wrote: Thanks for the reply. Responses below. On Wed, Feb 8, 2012 at 5:19 PM, Pid p...@pidster.com wrote: On 08/02/2012 11:41, amit shah wrote: I am trying to use the tomcat 7 jdbc connection pool in our application by using the tomcat-jdbc.jar and tomcat-juli.jar files. The basic connection pool works fine. I have few questions/clarifications 1. Executing multiple statements on connection initialization - The pool provides a flexibility to execute a single sql query when the physical connection is established (initSQL property). I couldn't find a way to execute multiple sql queries on connection initialization. The JDBC Interceptor mechanism also doesn't seem to help out. Any suggestions? Why do you want to execute multiple SQL statements for each connection in the pool? Normally you want to do the absolute minimum to validate the connection. These sql statements are not for validating the connection. We use Oracle as our database server. So I wanted to execute the NLS (National Language Setting) queries after the connection is established. You need to do this because it's multi-tenant (per below) and each tenant may require different settings? Yes you are right. Each tenant could have different language settings. Even if the settings are same for all the tenants, the queries are to be executed on every physical connection creation. These settings cannot be set when the schema's are created. They are to be set per session level. I understand that one way to implement this would be to embed the queries in a stored procedure but I was just trying to understand if there was a simpler way of achieving this through configuration. Let me know if there is a way out. Executing an SP doesn't seem to work out since internally the tomcat jdbc pool code tries to execute the initSQL query using a Statement object instead of a CallableStatement which would be required in this case. Any suggestions/alternatives? 2. alternateUserNameAllowed property - If a connection is requested with the credentials user1/password1 and the connection was previously connected using user2/password2, the connection will be closed, and reopened with the requested credentials. This property was added as an enhancement to bug 50025https://issues.apache.org/bugzilla/show_bug.cgi?id=50025. I didn’t understand the reason behind closing the previous connection. Can the pool not still maintain the previous connection and open a new connection if the user/password combination do not match?. This way the same pool can be used for multiple schemas. The old connection is closed so that the current user (who has different credentials) can't then use that connection. If you want to use the old connection, don't pass in new credentials. Note: this is a pool of connections, not a single connection. Can the pool still not close the old connection and maintain a map of username/password vs connection. So that the same pool can be used for multiple schemas on an Oracle server. This would help out in implementing multi-tenant applications where not all environments are active at the same time. So the same pool can be used for multiple environments. The application can still provides the ability the create a specific pool for individual environments. Let me know if anything is unclear. The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. If the pool kept all of the connections open with different credentials how can you guarantee availability/performance/SLA for each tenant? All the connections can still follow the same configuration rules of timeout. Not relevant if the connections are in use. What is the advantage of a single pool in this case? The benefit we gain is not having many pools (reduces the pool mgmt overhead on the application server) which means less number of application server and database server resources. What overhead? The application server and database server resources (memory, cpu etc) for keeping the
Re: Using Tomcat7 JDBC Connection Pool
One more comment below about oracle UCP. On Thu, Feb 9, 2012 at 5:10 PM, amit shah amits...@gmail.com wrote: Comments below. On Wed, Feb 8, 2012 at 9:19 PM, Pid p...@pidster.com wrote: On 08/02/2012 14:59, amit shah wrote: Responses below. Thanks. On Wed, Feb 8, 2012 at 7:14 PM, Pid p...@pidster.com wrote: On 08/02/2012 12:30, amit shah wrote: Thanks for the reply. Responses below. On Wed, Feb 8, 2012 at 5:19 PM, Pid p...@pidster.com wrote: On 08/02/2012 11:41, amit shah wrote: I am trying to use the tomcat 7 jdbc connection pool in our application by using the tomcat-jdbc.jar and tomcat-juli.jar files. The basic connection pool works fine. I have few questions/clarifications 1. Executing multiple statements on connection initialization - The pool provides a flexibility to execute a single sql query when the physical connection is established (initSQL property). I couldn't find a way to execute multiple sql queries on connection initialization. The JDBC Interceptor mechanism also doesn't seem to help out. Any suggestions? Why do you want to execute multiple SQL statements for each connection in the pool? Normally you want to do the absolute minimum to validate the connection. These sql statements are not for validating the connection. We use Oracle as our database server. So I wanted to execute the NLS (National Language Setting) queries after the connection is established. You need to do this because it's multi-tenant (per below) and each tenant may require different settings? Yes you are right. Each tenant could have different language settings. Even if the settings are same for all the tenants, the queries are to be executed on every physical connection creation. These settings cannot be set when the schema's are created. They are to be set per session level. I understand that one way to implement this would be to embed the queries in a stored procedure but I was just trying to understand if there was a simpler way of achieving this through configuration. Let me know if there is a way out. Executing an SP doesn't seem to work out since internally the tomcat jdbc pool code tries to execute the initSQL query using a Statement object instead of a CallableStatement which would be required in this case. Any suggestions/alternatives? 2. alternateUserNameAllowed property - If a connection is requested with the credentials user1/password1 and the connection was previously connected using user2/password2, the connection will be closed, and reopened with the requested credentials. This property was added as an enhancement to bug 50025https://issues.apache.org/bugzilla/show_bug.cgi?id=50025. I didn’t understand the reason behind closing the previous connection. Can the pool not still maintain the previous connection and open a new connection if the user/password combination do not match?. This way the same pool can be used for multiple schemas. The old connection is closed so that the current user (who has different credentials) can't then use that connection. If you want to use the old connection, don't pass in new credentials. Note: this is a pool of connections, not a single connection. Can the pool still not close the old connection and maintain a map of username/password vs connection. So that the same pool can be used for multiple schemas on an Oracle server. This would help out in implementing multi-tenant applications where not all environments are active at the same time. So the same pool can be used for multiple environments. The application can still provides the ability the create a specific pool for individual environments. Let me know if anything is unclear. The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. If the pool kept all of the connections open with different credentials how can you guarantee availability/performance/SLA for each tenant? All the connections can still follow the same configuration rules of timeout. Not relevant if the connections are in use. What is the advantage of a single pool in this case? The benefit we gain is not having many pools (reduces the pool mgmt overhead on the application server) which means less number of application server and database
Re: Using Tomcat7 JDBC Connection Pool
On 09/02/2012 12:56, amit shah wrote: One more comment below about oracle UCP. snip The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. So why not create multiple controlled pools not run into availability problems? snip What overhead? The application server and database server resources (memory, cpu etc) for keeping the connections open? That's a total connection count dependent metric. So the overhead is virtually the same regardless of whether you have 5 pools or 1, if you have the same total number of connections. For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. There's a flaw in your logic. In your example there may be zero connections open for a given tenant because they use a shared pool. So you might has well have separate pools with the minimum set to 2 and still have more connections guaranteed per tenant, and the 10 you were aiming for. Worse, if you hit your max with other tenants, a remaining tenant might not be able to get a connection at all, thus failing to address one of the key requirements in a multi-tenant system - guaranteed availability. Probably true when all the tenants are actively used. As I said, there is always a flexibility in the configuration to use a separate pool for a particular tenant. That should be the default IMO. You're asking for trouble otherwise. Also the application can always provide a configuration flexibility to allow a tenant to use a separate pool instead of sharing it with other tenants (like I said above). This flexibility is provided by the Oracle Universal Connection Poolhttp://docs.oracle.com/cd/E11882_01/java.112/e12265/toc.htm So if that's a better fit for your requirement, why not use it? It provides the feature I mentioned about by has lock contention issues. Tomcat 7 jdbc pool seems to be better and hence I was trying it out. ! snip If you are programmatically registering the pool, can you not just register it with the MBean server yourself? Ok I will try this and provide an update. Cool. p -- [key:62590808] signature.asc Description: OpenPGP digital signature
Re: Using Tomcat7 JDBC Connection Pool
Any thoughts on the first point about executing multiple SQL queries on physical connection creation? On 09-Feb-2012, at 7:05 PM, Pid p...@pidster.com wrote: On 09/02/2012 12:56, amit shah wrote: One more comment below about oracle UCP. snip The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. So why not create multiple controlled pools not run into availability problems? snip What overhead? The application server and database server resources (memory, cpu etc) for keeping the connections open? That's a total connection count dependent metric. So the overhead is virtually the same regardless of whether you have 5 pools or 1, if you have the same total number of connections. For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. There's a flaw in your logic. In your example there may be zero connections open for a given tenant because they use a shared pool. So you might has well have separate pools with the minimum set to 2 and still have more connections guaranteed per tenant, and the 10 you were aiming for. Worse, if you hit your max with other tenants, a remaining tenant might not be able to get a connection at all, thus failing to address one of the key requirements in a multi-tenant system - guaranteed availability. Probably true when all the tenants are actively used. As I said, there is always a flexibility in the configuration to use a separate pool for a particular tenant. That should be the default IMO. You're asking for trouble otherwise. Also the application can always provide a configuration flexibility to allow a tenant to use a separate pool instead of sharing it with other tenants (like I said above). This flexibility is provided by the Oracle Universal Connection Poolhttp://docs.oracle.com/cd/E11882_01/java.112/e12265/toc.htm So if that's a better fit for your requirement, why not use it? It provides the feature I mentioned about by has lock contention issues. Tomcat 7 jdbc pool seems to be better and hence I was trying it out. ! snip If you are programmatically registering the pool, can you not just register it with the MBean server yourself? Ok I will try this and provide an update. Cool. p -- [key:62590808] - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Using Tomcat7 JDBC Connection Pool
On 09/02/2012 16:21, Amit wrote: Any thoughts on the first point about executing multiple SQL queries on physical connection creation? I have no idea if it'll work, but I'd try: SELECT 1; SELECT 1; If you are controlling the pool (and you are) by passing in username/password parameters each time, then you could do it as an extra transaction thereafter. p On 09-Feb-2012, at 7:05 PM, Pid p...@pidster.com wrote: On 09/02/2012 12:56, amit shah wrote: One more comment below about oracle UCP. snip The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. So why not create multiple controlled pools not run into availability problems? snip What overhead? The application server and database server resources (memory, cpu etc) for keeping the connections open? That's a total connection count dependent metric. So the overhead is virtually the same regardless of whether you have 5 pools or 1, if you have the same total number of connections. For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. There's a flaw in your logic. In your example there may be zero connections open for a given tenant because they use a shared pool. So you might has well have separate pools with the minimum set to 2 and still have more connections guaranteed per tenant, and the 10 you were aiming for. Worse, if you hit your max with other tenants, a remaining tenant might not be able to get a connection at all, thus failing to address one of the key requirements in a multi-tenant system - guaranteed availability. Probably true when all the tenants are actively used. As I said, there is always a flexibility in the configuration to use a separate pool for a particular tenant. That should be the default IMO. You're asking for trouble otherwise. Also the application can always provide a configuration flexibility to allow a tenant to use a separate pool instead of sharing it with other tenants (like I said above). This flexibility is provided by the Oracle Universal Connection Poolhttp://docs.oracle.com/cd/E11882_01/java.112/e12265/toc.htm So if that's a better fit for your requirement, why not use it? It provides the feature I mentioned about by has lock contention issues. Tomcat 7 jdbc pool seems to be better and hence I was trying it out. ! snip If you are programmatically registering the pool, can you not just register it with the MBean server yourself? Ok I will try this and provide an update. Cool. p -- [key:62590808] - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- [key:62590808] signature.asc Description: OpenPGP digital signature
Re: Using Tomcat7 JDBC Connection Pool
Comment below On 09-Feb-2012, at 10:18 PM, Pid p...@pidster.com wrote: On 09/02/2012 16:21, Amit wrote: Any thoughts on the first point about executing multiple SQL queries on physical connection creation? I have no idea if it'll work, but I'd try: SELECT 1; SELECT 1; If you are controlling the pool (and you are) by passing in username/password parameters each time, then you could do it as an extra transaction thereafter. Executing the queries after retrieving the connection would not be the right option since they would execute every time the connection is borrowed instead of executing it only on physical connection creation. Can the jdbc interceptor architecture be extended to provide a method which is called when the physical connection is created? ( similar to disconnect()) p On 09-Feb-2012, at 7:05 PM, Pid p...@pidster.com wrote: On 09/02/2012 12:56, amit shah wrote: One more comment below about oracle UCP. snip The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? Yes right. So why not create multiple controlled pools not run into availability problems? snip What overhead? The application server and database server resources (memory, cpu etc) for keeping the connections open? That's a total connection count dependent metric. So the overhead is virtually the same regardless of whether you have 5 pools or 1, if you have the same total number of connections. For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. There's a flaw in your logic. In your example there may be zero connections open for a given tenant because they use a shared pool. So you might has well have separate pools with the minimum set to 2 and still have more connections guaranteed per tenant, and the 10 you were aiming for. Worse, if you hit your max with other tenants, a remaining tenant might not be able to get a connection at all, thus failing to address one of the key requirements in a multi-tenant system - guaranteed availability. Probably true when all the tenants are actively used. As I said, there is always a flexibility in the configuration to use a separate pool for a particular tenant. That should be the default IMO. You're asking for trouble otherwise. Also the application can always provide a configuration flexibility to allow a tenant to use a separate pool instead of sharing it with other tenants (like I said above). This flexibility is provided by the Oracle Universal Connection Poolhttp://docs.oracle.com/cd/E11882_01/java.112/e12265/toc.htm So if that's a better fit for your requirement, why not use it? It provides the feature I mentioned about by has lock contention issues. Tomcat 7 jdbc pool seems to be better and hence I was trying it out. ! snip If you are programmatically registering the pool, can you not just register it with the MBean server yourself? Ok I will try this and provide an update. Cool. p -- [key:62590808] - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- [key:62590808] - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Using Tomcat7 JDBC Connection Pool
I am trying to use the tomcat 7 jdbc connection pool in our application by using the tomcat-jdbc.jar and tomcat-juli.jar files. The basic connection pool works fine. I have few questions/clarifications 1. Executing multiple statements on connection initialization - The pool provides a flexibility to execute a single sql query when the physical connection is established (initSQL property). I couldn't find a way to execute multiple sql queries on connection initialization. The JDBC Interceptor mechanism also doesn't seem to help out. Any suggestions? 2. alternateUserNameAllowed property - If a connection is requested with the credentials user1/password1 and the connection was previously connected using user2/password2, the connection will be closed, and reopened with the requested credentials. This property was added as an enhancement to bug 50025https://issues.apache.org/bugzilla/show_bug.cgi?id=50025. I didn’t understand the reason behind closing the previous connection. Can the pool not still maintain the previous connection and open a new connection if the user/password combination do not match?. This way the same pool can be used for multiple schemas. 3. JMX Statistics - How can one enable jmx when tomcat 7 jdbc connection pool is used independently? I tried specifying the jmx vm options (-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1617 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false) but they don’t seem to help out? Neither did I found a way to print or access the pool statistics programmatically. Any suggestions? Thank you, Amit
Re: Using Tomcat7 JDBC Connection Pool
On 08/02/2012 11:41, amit shah wrote: I am trying to use the tomcat 7 jdbc connection pool in our application by using the tomcat-jdbc.jar and tomcat-juli.jar files. The basic connection pool works fine. I have few questions/clarifications 1. Executing multiple statements on connection initialization - The pool provides a flexibility to execute a single sql query when the physical connection is established (initSQL property). I couldn't find a way to execute multiple sql queries on connection initialization. The JDBC Interceptor mechanism also doesn't seem to help out. Any suggestions? Why do you want to execute multiple SQL statements for each connection in the pool? Normally you want to do the absolute minimum to validate the connection. 2. alternateUserNameAllowed property - If a connection is requested with the credentials user1/password1 and the connection was previously connected using user2/password2, the connection will be closed, and reopened with the requested credentials. This property was added as an enhancement to bug 50025https://issues.apache.org/bugzilla/show_bug.cgi?id=50025. I didn’t understand the reason behind closing the previous connection. Can the pool not still maintain the previous connection and open a new connection if the user/password combination do not match?. This way the same pool can be used for multiple schemas. The old connection is closed so that the current user (who has different credentials) can't then use that connection. If you want to use the old connection, don't pass in new credentials. Note: this is a pool of connections, not a single connection. 3. JMX Statistics - How can one enable jmx when tomcat 7 jdbc connection pool is used independently? I tried specifying the jmx vm options (-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1617 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false) but they don’t seem to help out? Neither did I found a way to print or access the pool statistics programmatically. Any suggestions? I don't know the answer offhand, but I assume that an examination of the source code would lead to an understanding of how Tomcat handles this. p -- [key:62590808] signature.asc Description: OpenPGP digital signature
Re: Using Tomcat7 JDBC Connection Pool
Thanks for the reply. Responses below. On Wed, Feb 8, 2012 at 5:19 PM, Pid p...@pidster.com wrote: On 08/02/2012 11:41, amit shah wrote: I am trying to use the tomcat 7 jdbc connection pool in our application by using the tomcat-jdbc.jar and tomcat-juli.jar files. The basic connection pool works fine. I have few questions/clarifications 1. Executing multiple statements on connection initialization - The pool provides a flexibility to execute a single sql query when the physical connection is established (initSQL property). I couldn't find a way to execute multiple sql queries on connection initialization. The JDBC Interceptor mechanism also doesn't seem to help out. Any suggestions? Why do you want to execute multiple SQL statements for each connection in the pool? Normally you want to do the absolute minimum to validate the connection. These sql statements are not for validating the connection. We use Oracle as our database server. So I wanted to execute the NLS (National Language Setting) queries after the connection is established. 2. alternateUserNameAllowed property - If a connection is requested with the credentials user1/password1 and the connection was previously connected using user2/password2, the connection will be closed, and reopened with the requested credentials. This property was added as an enhancement to bug 50025https://issues.apache.org/bugzilla/show_bug.cgi?id=50025. I didn’t understand the reason behind closing the previous connection. Can the pool not still maintain the previous connection and open a new connection if the user/password combination do not match?. This way the same pool can be used for multiple schemas. The old connection is closed so that the current user (who has different credentials) can't then use that connection. If you want to use the old connection, don't pass in new credentials. Note: this is a pool of connections, not a single connection. Can the pool still not close the old connection and maintain a map of username/password vs connection. So that the same pool can be used for multiple schemas on an Oracle server. This would help out in implementing multi-tenant applications where not all environments are active at the same time. So the same pool can be used for multiple environments. The application can still provides the ability the create a specific pool for individual environments. Let me know if anything is unclear. 3. JMX Statistics - How can one enable jmx when tomcat 7 jdbc connection pool is used independently? I tried specifying the jmx vm options (-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1617 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false) but they don’t seem to help out? Neither did I found a way to print or access the pool statistics programmatically. Any suggestions? I don't know the answer offhand, but I assume that an examination of the source code would lead to an understanding of how Tomcat handles this. I had a look at the source code. The ConnectionPool class includes a check where a call is made to create an MBean but I couldn't see any calls the register the MBean with the MBeanServer. Hence thought of posting a question. Any suggestions on the statistics part. There are no methods in org.apache.tomcat.jdbc.pool.DataSource for statistics. p -- [key:62590808]
Re: Using Tomcat7 JDBC Connection Pool
On 08/02/2012 12:30, amit shah wrote: Thanks for the reply. Responses below. On Wed, Feb 8, 2012 at 5:19 PM, Pid p...@pidster.com wrote: On 08/02/2012 11:41, amit shah wrote: I am trying to use the tomcat 7 jdbc connection pool in our application by using the tomcat-jdbc.jar and tomcat-juli.jar files. The basic connection pool works fine. I have few questions/clarifications 1. Executing multiple statements on connection initialization - The pool provides a flexibility to execute a single sql query when the physical connection is established (initSQL property). I couldn't find a way to execute multiple sql queries on connection initialization. The JDBC Interceptor mechanism also doesn't seem to help out. Any suggestions? Why do you want to execute multiple SQL statements for each connection in the pool? Normally you want to do the absolute minimum to validate the connection. These sql statements are not for validating the connection. We use Oracle as our database server. So I wanted to execute the NLS (National Language Setting) queries after the connection is established. You need to do this because it's multi-tenant (per below) and each tenant may require different settings? 2. alternateUserNameAllowed property - If a connection is requested with the credentials user1/password1 and the connection was previously connected using user2/password2, the connection will be closed, and reopened with the requested credentials. This property was added as an enhancement to bug 50025https://issues.apache.org/bugzilla/show_bug.cgi?id=50025. I didn’t understand the reason behind closing the previous connection. Can the pool not still maintain the previous connection and open a new connection if the user/password combination do not match?. This way the same pool can be used for multiple schemas. The old connection is closed so that the current user (who has different credentials) can't then use that connection. If you want to use the old connection, don't pass in new credentials. Note: this is a pool of connections, not a single connection. Can the pool still not close the old connection and maintain a map of username/password vs connection. So that the same pool can be used for multiple schemas on an Oracle server. This would help out in implementing multi-tenant applications where not all environments are active at the same time. So the same pool can be used for multiple environments. The application can still provides the ability the create a specific pool for individual environments. Let me know if anything is unclear. The pool returns members at random, so how would you know which cached credentials you were getting? If the pool kept all of the connections open with different credentials how can you guarantee availability/performance/SLA for each tenant? What is the advantage of a single pool in this case? You are asking the wrong question IMHO. 3. JMX Statistics - How can one enable jmx when tomcat 7 jdbc connection pool is used independently? I tried specifying the jmx vm options (-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1617 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false) but they don’t seem to help out? Neither did I found a way to print or access the pool statistics programmatically. Any suggestions? I don't know the answer offhand, but I assume that an examination of the source code would lead to an understanding of how Tomcat handles this. I had a look at the source code. The ConnectionPool class includes a check where a call is made to create an MBean but I couldn't see any calls the register the MBean with the MBeanServer. Hence thought of posting a question. Any suggestions on the statistics part. There are no methods in org.apache.tomcat.jdbc.pool.DataSource for statistics. What statistics do you want? The Interceptor mechanism can be used to create bespoke statistics. [key:62590808] -- [key:62590808] signature.asc Description: OpenPGP digital signature
Re: Using Tomcat7 JDBC Connection Pool
Responses below. Thanks. On Wed, Feb 8, 2012 at 7:14 PM, Pid p...@pidster.com wrote: On 08/02/2012 12:30, amit shah wrote: Thanks for the reply. Responses below. On Wed, Feb 8, 2012 at 5:19 PM, Pid p...@pidster.com wrote: On 08/02/2012 11:41, amit shah wrote: I am trying to use the tomcat 7 jdbc connection pool in our application by using the tomcat-jdbc.jar and tomcat-juli.jar files. The basic connection pool works fine. I have few questions/clarifications 1. Executing multiple statements on connection initialization - The pool provides a flexibility to execute a single sql query when the physical connection is established (initSQL property). I couldn't find a way to execute multiple sql queries on connection initialization. The JDBC Interceptor mechanism also doesn't seem to help out. Any suggestions? Why do you want to execute multiple SQL statements for each connection in the pool? Normally you want to do the absolute minimum to validate the connection. These sql statements are not for validating the connection. We use Oracle as our database server. So I wanted to execute the NLS (National Language Setting) queries after the connection is established. You need to do this because it's multi-tenant (per below) and each tenant may require different settings? Yes you are right. Each tenant could have different language settings. Even if the settings are same for all the tenants, the queries are to be executed on every physical connection creation. These settings cannot be set when the schema's are created. They are to be set per session level. I understand that one way to implement this would be to embed the queries in a stored procedure but I was just trying to understand if there was a simpler way of achieving this through configuration. Let me know if there is a way out. 2. alternateUserNameAllowed property - If a connection is requested with the credentials user1/password1 and the connection was previously connected using user2/password2, the connection will be closed, and reopened with the requested credentials. This property was added as an enhancement to bug 50025https://issues.apache.org/bugzilla/show_bug.cgi?id=50025. I didn’t understand the reason behind closing the previous connection. Can the pool not still maintain the previous connection and open a new connection if the user/password combination do not match?. This way the same pool can be used for multiple schemas. The old connection is closed so that the current user (who has different credentials) can't then use that connection. If you want to use the old connection, don't pass in new credentials. Note: this is a pool of connections, not a single connection. Can the pool still not close the old connection and maintain a map of username/password vs connection. So that the same pool can be used for multiple schemas on an Oracle server. This would help out in implementing multi-tenant applications where not all environments are active at the same time. So the same pool can be used for multiple environments. The application can still provides the ability the create a specific pool for individual environments. Let me know if anything is unclear. The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. If the pool kept all of the connections open with different credentials how can you guarantee availability/performance/SLA for each tenant? All the connections can still follow the same configuration rules of timeout. What is the advantage of a single pool in this case? The benefit we gain is not having many pools (reduces the pool mgmt overhead on the application server) which means less number of application server and database server resources. For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. Also the application can always provide a configuration flexibility to allow a tenant to use a separate pool instead of sharing it with other tenants (like I said above). This flexibility is provided by the Oracle Universal Connection Poolhttp://docs.oracle.com/cd/E11882_01/java.112/e12265/toc.htm . You are asking the wrong question IMHO. 3. JMX Statistics - How can one enable jmx when tomcat 7 jdbc connection pool is used independently? I tried specifying the jmx vm options (-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1617
Re: Using Tomcat7 JDBC Connection Pool
On 08/02/2012 14:59, amit shah wrote: Responses below. Thanks. On Wed, Feb 8, 2012 at 7:14 PM, Pid p...@pidster.com wrote: On 08/02/2012 12:30, amit shah wrote: Thanks for the reply. Responses below. On Wed, Feb 8, 2012 at 5:19 PM, Pid p...@pidster.com wrote: On 08/02/2012 11:41, amit shah wrote: I am trying to use the tomcat 7 jdbc connection pool in our application by using the tomcat-jdbc.jar and tomcat-juli.jar files. The basic connection pool works fine. I have few questions/clarifications 1. Executing multiple statements on connection initialization - The pool provides a flexibility to execute a single sql query when the physical connection is established (initSQL property). I couldn't find a way to execute multiple sql queries on connection initialization. The JDBC Interceptor mechanism also doesn't seem to help out. Any suggestions? Why do you want to execute multiple SQL statements for each connection in the pool? Normally you want to do the absolute minimum to validate the connection. These sql statements are not for validating the connection. We use Oracle as our database server. So I wanted to execute the NLS (National Language Setting) queries after the connection is established. You need to do this because it's multi-tenant (per below) and each tenant may require different settings? Yes you are right. Each tenant could have different language settings. Even if the settings are same for all the tenants, the queries are to be executed on every physical connection creation. These settings cannot be set when the schema's are created. They are to be set per session level. I understand that one way to implement this would be to embed the queries in a stored procedure but I was just trying to understand if there was a simpler way of achieving this through configuration. Let me know if there is a way out. 2. alternateUserNameAllowed property - If a connection is requested with the credentials user1/password1 and the connection was previously connected using user2/password2, the connection will be closed, and reopened with the requested credentials. This property was added as an enhancement to bug 50025https://issues.apache.org/bugzilla/show_bug.cgi?id=50025. I didn’t understand the reason behind closing the previous connection. Can the pool not still maintain the previous connection and open a new connection if the user/password combination do not match?. This way the same pool can be used for multiple schemas. The old connection is closed so that the current user (who has different credentials) can't then use that connection. If you want to use the old connection, don't pass in new credentials. Note: this is a pool of connections, not a single connection. Can the pool still not close the old connection and maintain a map of username/password vs connection. So that the same pool can be used for multiple schemas on an Oracle server. This would help out in implementing multi-tenant applications where not all environments are active at the same time. So the same pool can be used for multiple environments. The application can still provides the ability the create a specific pool for individual environments. Let me know if anything is unclear. The pool returns members at random, so how would you know which cached credentials you were getting? The credentials which are passed to the getConnection(String username, String password) method. When we configure the same pool to be used for multiple schema's the pool will *not *be configured with default username password. OK, so you create a bunch of connections with various credentials, you want to cache those connections and only return them if the creds match for the new request? So you're basically creating an uncontrolled pool per cred pair, inside the outer pool which is controlled? If the pool kept all of the connections open with different credentials how can you guarantee availability/performance/SLA for each tenant? All the connections can still follow the same configuration rules of timeout. Not relevant if the connections are in use. What is the advantage of a single pool in this case? The benefit we gain is not having many pools (reduces the pool mgmt overhead on the application server) which means less number of application server and database server resources. What overhead? For e.g. If we have 5 tenants with 5 pools configured with 10 min pool size, we would have min 50 connections always open to the database server. This count would be for each application server. If we had the same pool for all 5 tenants, there would be just 10 connections open per application server. There's a flaw in your logic. In your example there may be zero connections open for a given tenant because they use a shared pool. So you might has well have separate pools with the minimum set to 2 and still have more connections