commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Josh Landin (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (POOL-363) Evictor Thread prevents Spring Context shutdown in standalone app
Date Tue, 26 Mar 2019 20:20:00 GMT

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

Josh Landin updated POOL-363:
-----------------------------
    Description: 
Given a DBCP2 connection pool configured in a Spring Application context with the POOL evictor
thread enabled, a standalone main() application hangs on shutdown. Example below:

Maven pom.xml:
{code:xml}
  <dependencies>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.6.0</version><!-- Uses commons-pool2 : 2.6.1 -->
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
  </dependencies>
{code}
MainTest.java:
{code:java}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

public class MainTest
{
  @Configuration
  public static class Config 
  {
    @Bean
    public DataSource getBasicDataSource()
    {
      BasicDataSource d = new BasicDataSource();
      d.setUrl("jdbc:mysql://localhost:3306/anydb");
      d.setUsername("myuser");
      d.setPassword("mypass");
      d.setTimeBetweenEvictionRunsMillis(1000); // Turn on Evictor Thread.
      return d;
    }
  }

  public static void main(String[] args)
  {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
    ctx.registerShutdownHook(); // Ensures context.close() on JVM shutdown.
    
    try(
        Connection conn = ctx.getBean(BasicDataSource.class).getConnection(); 
        Statement stmt = conn.createStatement();
        ResultSet result = stmt.executeQuery("SELECT 1");
    )
    {
      int records = result.last() ? result.getRow() : 0;
      System.out.println("Records: "+records);
    }
    catch(SQLException e)
    {
      e.printStackTrace();
    }
    System.out.println("End.");
  }
}
{code}
The issue is not present when turning off the eviction thread by setting {{timeBetweenEvictionRunsMillis}}
to {{-1}}.

Jconsole thread summary attached for reference.

  was:
Given a DBCP2 connection pool configured in a Spring Application context with the POOL evictor
thread enabled, a standalone main() application hangs on shutdown. Example below:

Maven pom.xml:
{code:xml}
  <dependencies>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.6.0</version><!-- Uses commons-pool2 : 2.6.1 -->
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
  </dependencies>
{code}
MainTest.java:
{code:java}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

public class MainTest
{
  @Configuration
  public static class Config 
  {
    @Bean
    public DataSource getBasicDataSource()
    {
      BasicDataSource d = new BasicDataSource();
      d.setUrl("jdbc:mysql://localhost:3306/anydb");
      d.setUsername("myuser");
      d.setPassword("mypass");
      d.setTimeBetweenEvictionRunsMillis(1000); // Turn on Evictor Thread.
      return d;
    }
  }

  public static void main(String[] args)
  {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
    ctx.registerShutdownHook(); // Ensures context.close() on JVM shutdown.
    
    try(
        Connection conn = ctx.getBean(BasicDataSource.class).getConnection(); 
        Statement stmt = conn.createStatement();
        ResultSet result = stmt.executeQuery("SELECT 1");
    )
    {
      int records = result.last() ? result.getRow() : 0;
      System.out.println("Records: "+records);
    }
    catch(SQLException e)
    {
      e.printStackTrace();
    }
    System.out.println("End.");
  }
}
{code}
The issue is not present when turning off the eviction thread by setting `timeBetweenEvictionRunsMillis`
to `-1`.

Jconsole thread summary attached for reference.


> Evictor Thread prevents Spring Context shutdown in standalone app
> -----------------------------------------------------------------
>
>                 Key: POOL-363
>                 URL: https://issues.apache.org/jira/browse/POOL-363
>             Project: Commons Pool
>          Issue Type: Bug
>    Affects Versions: 2.6.1
>            Reporter: Josh Landin
>            Priority: Major
>         Attachments: 2019.03.26_screen281.jpg
>
>
> Given a DBCP2 connection pool configured in a Spring Application context with the POOL
evictor thread enabled, a standalone main() application hangs on shutdown. Example below:
> Maven pom.xml:
> {code:xml}
>   <dependencies>
>     <dependency>
>       <groupId>org.apache.commons</groupId>
>       <artifactId>commons-dbcp2</artifactId>
>       <version>2.6.0</version><!-- Uses commons-pool2 : 2.6.1 -->
>     </dependency>
>     <dependency>
>       <groupId>mysql</groupId>
>       <artifactId>mysql-connector-java</artifactId>
>       <version>8.0.15</version>
>     </dependency>
>     <dependency>
>       <groupId>org.springframework</groupId>
>       <artifactId>spring-context</artifactId>
>       <version>5.1.5.RELEASE</version>
>     </dependency>
>   </dependencies>
> {code}
> MainTest.java:
> {code:java}
> import java.sql.Connection;
> import java.sql.ResultSet;
> import java.sql.SQLException;
> import java.sql.Statement;
> import javax.sql.DataSource;
> import org.apache.commons.dbcp2.BasicDataSource;
> import org.springframework.context.annotation.AnnotationConfigApplicationContext;
> import org.springframework.context.annotation.Bean;
> import org.springframework.context.annotation.Configuration;
> public class MainTest
> {
>   @Configuration
>   public static class Config 
>   {
>     @Bean
>     public DataSource getBasicDataSource()
>     {
>       BasicDataSource d = new BasicDataSource();
>       d.setUrl("jdbc:mysql://localhost:3306/anydb");
>       d.setUsername("myuser");
>       d.setPassword("mypass");
>       d.setTimeBetweenEvictionRunsMillis(1000); // Turn on Evictor Thread.
>       return d;
>     }
>   }
>   public static void main(String[] args)
>   {
>     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
>     ctx.registerShutdownHook(); // Ensures context.close() on JVM shutdown.
>     
>     try(
>         Connection conn = ctx.getBean(BasicDataSource.class).getConnection(); 
>         Statement stmt = conn.createStatement();
>         ResultSet result = stmt.executeQuery("SELECT 1");
>     )
>     {
>       int records = result.last() ? result.getRow() : 0;
>       System.out.println("Records: "+records);
>     }
>     catch(SQLException e)
>     {
>       e.printStackTrace();
>     }
>     System.out.println("End.");
>   }
> }
> {code}
> The issue is not present when turning off the eviction thread by setting {{timeBetweenEvictionRunsMillis}}
to {{-1}}.
> Jconsole thread summary attached for reference.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message