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

Mark Thomas resolved DBCP-369.
------------------------------

       Resolution: Fixed
    Fix Version/s:     (was: 1.4.1)
                   2.0
                   1.5.1

Thanks for the report and the test case. Sorry it has taken so long to address 
this.

I've fixed trunk for the 2.x series the 1.5.x branch. It will be included in 
the next release of each.

If there are further 1.3.x and 1.4.x releases (currently being discussed on the 
dev mailing list) my expectation is that they will be generated from the 1.5.x 
branch so will pick up this fix too.

> Exception when using SharedPoolDataSource concurrently
> ------------------------------------------------------
>
>                 Key: DBCP-369
>                 URL: https://issues.apache.org/jira/browse/DBCP-369
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 1.4
>         Environment: Java Hotspot Server VM 1.6.0_07, Linux
>            Reporter: Michael Pradel
>             Fix For: 1.5.1, 2.0
>
>         Attachments: DBCP-369.patch
>
>
> Hi,
> I get a ConcurrentModificationException when using instances of 
> SharedPoolDataSource concurrently. The problem occurs when one thread calls 
> setDataSourceName() while another thread calls close(), either on the same 
> instance of SharedPoolDataSource or on different instances. I'll attach a 
> short example program that leads to an exception for almost every run on my 
> machine.
> The cause of the exception seems to be in InstanceKeyObjectFactory. 
> registerNewInstance() is synchronized, but removeInstance() isn't. This 
> allows concurrent accesses to the non-thread-safe 'instanceMap'.
> Is this a bug? Or are SharedPoolDataSource and InstanceKeyObjectFactory not 
> supposed to be thread-safe?
> Thanks!
> import java.util.ArrayList;
> import org.apache.commons.dbcp.datasources.SharedPoolDataSource;
> public class SharedPoolDataSourceTest {
>       public static void main(String[] args) {
>               new SharedPoolDataSourceTest().run();
>       }
>       
>       private void run() {
>               final ArrayList<SharedPoolDataSource> dataSources = new 
> ArrayList<SharedPoolDataSource>();
>               for (int j = 0; j < 10000; j++) {
>                       SharedPoolDataSource dataSource = new 
> SharedPoolDataSource();
>                       dataSources.add(dataSource);
>               }
>       
>               Thread t1 = new Thread(new Runnable() {
>                       public void run() {
>                               for (SharedPoolDataSource dataSource : 
> dataSources) {
>                                       dataSource.setDataSourceName("a");      
>                               }                                       
>                       }
>               });
>               Thread t2 = new Thread(new Runnable() {
>                       public void run() {
>                               for (SharedPoolDataSource dataSource : 
> dataSources) {
>                                       try { dataSource.close(); } catch 
> (Exception e) {}      
>                               }
>                               
>                       }
>               });
>               t1.start();
>               t2.start();
>               try {
>                       t1.join();
>                       t2.join();
>               } catch (InterruptedException ie) {}
>       }       
> }
> Exception in thread "Thread-0" java.util.ConcurrentModificationException
>       at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
>       at java.util.HashMap$KeyIterator.next(HashMap.java:828)
>       at 
> org.apache.commons.dbcp.datasources.InstanceKeyObjectFactory.registerNewInstance(InstanceKeyObjectFactory.java:51)
>       at 
> org.apache.commons.dbcp.datasources.InstanceKeyDataSource.setDataSourceName(InstanceKeyDataSource.java:246)
>       at 
> potentialBugs.SharedPoolDataSourceTest$1.run(SharedPoolDataSourceTest.java:23)
>       at java.lang.Thread.run(Thread.java:619)



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to