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

Carl Franklin Hall closed DBUTILS-145.
--------------------------------------
    Resolution: Duplicate

Closing this is a duplicate of DBUTILS-135 where the issue was resolved.

> org.apache.commons.dbutils.BeanProcessor doesn't work in multi-thread 
> environment
> ---------------------------------------------------------------------------------
>
>                 Key: DBUTILS-145
>                 URL: https://issues.apache.org/jira/browse/DBUTILS-145
>             Project: Commons DbUtils
>          Issue Type: Bug
>    Affects Versions: 1.7
>         Environment: Checked on Windows 10 and CentOS 7.5 with Java 8 and 
> Java 11.
>            Reporter: Jan Jurcik
>            Priority: Blocker
>         Attachments: test-commons-dbutils-multithread.zip
>
>
> Using of BeanProcessor class with multiple threads fails, even every thread 
> has its own instance. Th reason is this part of code:
>  
> /**
>  * ServiceLoader to find <code>ColumnHandler</code> implementations on the 
> classpath. The iterator for this is
>  * lazy and each time <code>iterator()</code> is called.
>  */
>  // FIXME: I think this instantiates new handlers on each iterator() call. 
> This might be worth caching upfront.
>  private static final ServiceLoader<ColumnHandler> columnHandlers = 
> ServiceLoader.load(ColumnHandler.class);
> /**
>  * ServiceLoader to find <code>PropertyHandler</code> implementations on the 
> classpath. The iterator for this is
>  * lazy and each time <code>iterator()</code> is called.
>  */
>  // FIXME: I think this instantiates new handlers on each iterator() call. 
> This might be worth caching upfront.
>  private static final ServiceLoader<PropertyHandler> propertyHandlers = 
> ServiceLoader.load(PropertyHandler.class);
>  
> and then using as Iterable:
>  
> for (ColumnHandler handler : columnHandlers) {
>  if (handler.match(propType)) {
>  retval = handler.apply(rs, index);
>  break;
>  }
>  }
> As per ServiceLoader javadoc, this class is not thread safe: 
> [https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html] and 
> using the same instance in multiple threads causes either 
> NoSuchElementException or ClassCastException.
> Attached is very simple maven java 8 project (the same happens also in other 
> versions of Java), which executes simple query and tries to convert it to 
> Java Bean. Run it in multi processor environment to simulate the issue. part 
> of the project is also fixed version of the class *FixedBeanProcessor* which 
> should work on Java 6+.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to