[ https://issues.apache.org/jira/browse/DBCP-342?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13256647#comment-13256647 ]
Frederic Tardif commented on DBCP-342: -------------------------------------- We just hit that same error with version 1.4. The consequence of leaking pools that spawn connections (min pooled connection per pool) can be pretty nasty. Great to know there is a fix. Any ETA about when dbcp will release a new version with this fix officially included? > Not cleaned up commons pool's evictor task when SQLException occurs after the > GenericObjectPool is initialized in createDataSource. > ----------------------------------------------------------------------------------------------------------------------------------- > > Key: DBCP-342 > URL: https://issues.apache.org/jira/browse/DBCP-342 > Project: Commons Dbcp > Issue Type: Bug > Affects Versions: 1.3, 1.4 > Environment: * commons-pool : 1.4 > * commons-dbcp : 1.4, 1.3 both > * dbms : MSSQL 2007 > Reporter: byungchol.kim > Fix For: 1.3.1, 1.4.1 > > Attachments: dbcp_orphan_evictor_fix_patch.txt > > > JIRA DBCP-93 bts is not fixed correctly > (JIRA DBCP-93 : If SQLException occurs after the GenericObjectPool is > initialized in createDataSource, the evictor task is not cleaned up) > Only one evictor timer thread leaves but evictor timer task queued as many as > createDataSource() method called. > queued evictor will keep tries to make connection to meet min idle connection. > if suddenly dbms become stable and can accept connection again, > then every queued evictor will try to make connection simultaneously. > In my case there were more then 100000 user requests while I set wrong > password to database, > when I change my password to correct in database > more then 100000 evictor tries to make connection > and finally mssql makes connections as many as integer limit and dbms dies. > here is my test. > {code:title=TestBasicDataSource.java} > public void testCreateDataSourceCleanupEvictor() throws Exception { > ds.close(); > ds = null; > ds = createDataSource(); > > ds.setDriverClassName("org.apache.commons.dbcp.TesterConnRequestCountDriver"); > ds.setUrl("jdbc:apache:commons:testerConnRequestCountDriver"); > ds.setValidationQuery("SELECT DUMMY FROM DUAL"); > ds.setUsername("username"); > > // Make password incorrect, so createDataSource will throw > ds.setPassword("wrong"); > // Set timeBetweenEvictionRuns > 0, so evictor will be created > ds.setTimeBetweenEvictionRunsMillis(100); > // Set min idle > 0, so evictor will try to make connection as many as > idle count > ds.setMinIdle(2); > > Class.forName("org.apache.commons.dbcp.TesterConnRequestCountDriver"); > TesterConnRequestCountDriver testerDriver = > (TesterConnRequestCountDriver) > DriverManager.getDriver("jdbc:apache:commons:testerConnRequestCountDriver"); > testerDriver.initConnRequestCount(); > > // user request 10 times > for (int i=0; i<10; i++) { > try { > @SuppressWarnings("unused") > DataSource ds2 = ds.createDataSource(); > } catch (SQLException e) { > // Ignore > } > } > // sleep 1000ms. evictory will invoked 10 times. > Thread.sleep(1000); > > // if orphan evictor is alive, connection request count will be 100 > which is denoted from (ds.createDataSource() count * evictor invoke count) > // if DBMS connection is back to stable in 10 minutes then this test > case will make 120000 connections simultaneously > // 120000 connections = ds.createDataSource() count (10) * > evictor invoke count (6000) * min idle (2) > // but if evictor is cleaned up, connection request count will be only > 10 (ds.createDataSource() count ) > assertEquals(10, testerDriver.getConnectionRequestCount()); > > // fail to create datasource then clean up orphan connection pool and > evictor in connnection pool > assertNull(ds.connectionPool); > } > } > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira