commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Phil Steitz (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DBCP-442) All connections to MS SQL Server fail when SharedPoolDataSource has testOnBorrow set
Date Sun, 26 Jul 2015 01:54:04 GMT

    [ https://issues.apache.org/jira/browse/DBCP-442?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14641821#comment-14641821
] 

Phil Steitz commented on DBCP-442:
----------------------------------

I did not fully answer 1. in the ticket.  What is going on is that
in 2.0, we added the feature that when you ask for validateOnBorrow
but do not supply a validation query, we just test isValid on the
connection.  What I did to fix KeyedCPDSConnectionFactory#validate
was to make sure that on the null query validation path, we close
the logical connection created by the validation code.  You were
correct to point out that CPDSConnectionFactory  has the same problem.

Many thanks and thanks in advance for any patches / suggestions for
improvement you have.

Phil






> All connections to MS SQL Server fail when SharedPoolDataSource has testOnBorrow set
> ------------------------------------------------------------------------------------
>
>                 Key: DBCP-442
>                 URL: https://issues.apache.org/jira/browse/DBCP-442
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 2.0.1, 2.1
>         Environment: Windows 7, fully updated as of 2015-07-24, Cygwin, Oracle Java 1.8.0_40,
DBCP 2.1, MS SQL Server driver sqljdbc42.jar
>            Reporter: Jeff Greif (work)
>             Fix For: 2.2
>
>
> When testOnBorrow is set on a SharedPoolDataSource with connections on MS SQL Server,
the first (and all subsequent) connections retrieved from the pool get the exception in this
stack trace as a result of executing Connection.isValid() in the validation on borrow.
> java -cp ".;$CLASSPATH" Dbcp2TestOnBorrowFailure 'jdbc:sqlserver://myserver.example.com;databasename=mydb'
myuser mypassword
> Iteration: 0
> PooledConnection was reused, withoutits previous Connection being closed.
> java.sql.SQLException: PooledConnection was reused, withoutits previous Connection being
closed.
>         at org.apache.commons.dbcp2.cpdsadapter.PooledConnectionImpl.getConnection(PooledConnectionImpl.java:183)
>         at org.apache.commons.dbcp2.datasources.InstanceKeyDataSource.getConnection(InstanceKeyDataSource.java:951)
>         at Dbcp2TestOnBorrowFailure.getConnection(Dbcp2TestOnBorrowFailure.java:30)
>         at Dbcp2TestOnBorrowFailure.main(Dbcp2TestOnBorrowFailure.java:42)
> The code for this example is pasted in here (the preview shows that the code indentation
and formatting is lost -- sorry):
> ----------------------------------------------------------------------
> import java.sql.Connection;
> import java.sql.Driver;
> import java.sql.SQLException;
> import java.util.Properties;
> import org.apache.commons.dbcp2.cpdsadapter.DriverAdapterCPDS;
> import org.apache.commons.dbcp2.datasources.SharedPoolDataSource;
> public final class Dbcp2TestOnBorrowFailure {
>     private static final int MAX_CONNECTIONS = 3;
>     private final SharedPoolDataSource poolDataSource
>         = new SharedPoolDataSource();
>     public Dbcp2TestOnBorrowFailure(String jdbcUrl) {
>         DriverAdapterCPDS cpds = new DriverAdapterCPDS();
>         cpds.setUrl(jdbcUrl);
>         poolDataSource.setConnectionPoolDataSource(cpds);
>         poolDataSource.setMaxTotal(MAX_CONNECTIONS);
>         poolDataSource.setMaxConnLifetimeMillis(300000);
>         poolDataSource.setDefaultMaxWaitMillis(1000);
>         poolDataSource.setDefaultAutoCommit(Boolean.TRUE);
>         poolDataSource.setDefaultTestOnBorrow(true);
>         poolDataSource.setValidationQueryTimeout(3000);
>     }
>     public Connection getConnection(String user, String pwd) throws Exception {
>         return poolDataSource.getConnection(user, pwd);
>     }
>     public static void main(String[] args) {
>         if (args.length != 3) {
>             usage();
>         }
>         Dbcp2TestOnBorrowFailure poolFailure = new Dbcp2TestOnBorrowFailure(args[0]);
>         for (int i = 0; i < 10; ++i) {
>             System.err.println("Iteration: " + i);
>             Connection conn = null;
>             try {
>                 conn = poolFailure.getConnection(args[1], args[2]);
>                 conn.close();
>                 conn = null;
>             }
>             catch (Exception e) {
>                 System.err.println(e.getMessage());
>                 e.printStackTrace(System.err);
>                 System.exit(88);
>             }
>             finally {
>                 try {
>                     if (conn != null) {
>                         conn.close();
>                     }
>                 } catch (SQLException e) {
>                 }
>             }
>         }
>     }
>     private static void usage() {
>         System.err.println("Usage: java -cp ... Dbcp2TestOnBorrowFailure jdbcUrl user
password");
>         System.exit(77);
>     }
> }



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message