[ 
https://issues.apache.org/jira/browse/DBCP-563?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Phil Steitz closed DBCP-563.
----------------------------
    Resolution: Not A Problem

This is a driver bug.  I can reproduce using mysql-connector-java-5.x but not 
with mysql-connector-java-8.  DBCP can't change connections under the handles 
held by clients and even that would not explain the result.  See 
[https://bugs.mysql.com/bug.php?id=99495]

> query return previous result when previous request cause 
> MySQLTimeoutException by one connection
> ------------------------------------------------------------------------------------------------
>
>                 Key: DBCP-563
>                 URL: https://issues.apache.org/jira/browse/DBCP-563
>             Project: Commons DBCP
>          Issue Type: Bug
>    Affects Versions: 2.1.1
>            Reporter: jode
>            Priority: Major
>
> when run JdbcLocalDemo, you can get wrong result。query a record,then return b 
> record。
> {code:java}
> import org.apache.commons.dbcp2.BasicDataSource;
> import org.apache.commons.dbcp2.BasicDataSourceFactory;
> import java.sql.Connection;
> import java.sql.PreparedStatement;
> import java.sql.ResultSet;
> import java.sql.SQLException;
> import java.util.concurrent.ExecutorService;
> import java.util.concurrent.Executors;
> import java.util.concurrent.ThreadLocalRandom;
> import java.util.concurrent.TimeUnit;
> import java.util.concurrent.atomic.AtomicInteger;
> import static java.sql.ResultSet.CLOSE_CURSORS_AT_COMMIT;
> import static java.sql.ResultSet.CONCUR_READ_ONLY;
> import static java.sql.ResultSet.TYPE_FORWARD_ONLY;
> public class JdbcLocalDemo {
>     private static final AtomicInteger count = new AtomicInteger(0);
>     static BasicDataSource basicDataSource = null;
>     static {
>         try {
>             basicDataSource = 
> BasicDataSourceFactory.createDataSource(PropertiesUtils.loadFromClassPath("application-local.properties"));
>         } catch (Exception e) {
>             e.printStackTrace();
>         }
>     }
>     public static void main(String[] args) throws Exception {
>         SqlRunnable r1 = new SqlRunnable("a");
>         SqlRunnable r2 = new SqlRunnable("b");
>         ExecutorService executorService = Executors.newFixedThreadPool(5);
>         for(int i = 1; i <= 2000; ++i) {
>             executorService.submit(r1);
>             executorService.submit(r2);
>         }
>         executorService.shutdown();
>         executorService.awaitTermination(1, TimeUnit.MINUTES);
>     }
>     private static class SqlRunnable implements Runnable {
>         private final String value;
>         private SqlRunnable(String value) {
>             this.value = value;
>         }
>         @Override
>         public void run() {
>             PreparedStatement preparedStatement = null;
>             ResultSet resultSet = null;
>             Connection connection = null;
>             System.out.println(count.incrementAndGet());
>             try {
>                 connection = basicDataSource.getConnection();
>                 preparedStatement = connection.prepareStatement("select \"" + 
> value + "\" as v, sleep(?);", TYPE_FORWARD_ONLY, CONCUR_READ_ONLY, 
> CLOSE_CURSORS_AT_COMMIT);
>                 preparedStatement.setQueryTimeout(1);
>                 preparedStatement.setFetchSize(0);
>                 preparedStatement.setMaxRows(0);
> //                preparedStatement.setString(1, value);
>                 
> preparedStatement.setDouble(1,ThreadLocalRandom.current().nextInt(2000) / 
> 1000.0);
>                 resultSet = preparedStatement.executeQuery();
>                 while (resultSet.next()) {
>                     String v = resultSet.getString("v");
>                     if (!value.equals(v)) {
>                         System.err.println("wrong result 
> !=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=: " + value);
>                         System.exit(-1);
>                     }
>                 }
>             } catch (Exception e) {
>                 e.printStackTrace();
>             } finally {
>                 if (resultSet != null) {
>                     try {
>                         resultSet.close();
>                     } catch (SQLException e) {
>                         e.printStackTrace();
>                     }
>                 }
>                 if (preparedStatement != null) {
>                     try {
>                         preparedStatement.close();
>                     } catch (SQLException e) {
>                         e.printStackTrace();
>                     }
>                 }
>                 if (connection != null) {
>                     try {
>                         connection.close();
>                     } catch (SQLException e) {
>                         e.printStackTrace();
>                     }
>                 }
>             }
>         }
>     }
> }
> {code}
> {code:java}
> // application-local.properties
> defaultQueryTimeout=1000
> driverClassName=com.mysql.jdbc.Driver
> maxTotal=10
> maxIdle=10
> minIdle=5
> initialSize=5
> testOnBorrow=false
> username=root
> password=12345678
> url=jdbc:mysql://127.0.0.1:3306/db_paymra_router?characterEncoding=UTF8&socketTimeout=1005&allowMulti
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to