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

Phil Steitz updated DBCP-369:
-----------------------------

    Fix Version/s: 1.4.1
    
> 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.4.1
>
>
> 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 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

        

Reply via email to