|
44 | 44 | import java.util.Map; |
45 | 45 | import java.util.Properties; |
46 | 46 | import java.util.Set; |
47 | | -import java.util.concurrent.locks.Lock; |
48 | | -import java.util.concurrent.locks.ReentrantLock; |
49 | 47 |
|
50 | 48 | import org.apache.commons.lang.StringUtils; |
51 | 49 | import org.apache.commons.vfs2.FileObject; |
@@ -181,8 +179,6 @@ public class Database implements VariableSpace, LoggingObjectInterface, Closeabl |
181 | 179 | private DataSource dataSource; |
182 | 180 | private String ownerName; |
183 | 181 |
|
184 | | - private static final Lock lock = new ReentrantLock(); |
185 | | - |
186 | 182 | static { |
187 | 183 | initValueMetaPluginClasses(); |
188 | 184 | // listen for changes to make sure the valueMetaPluginClasses list is accurate. |
@@ -2732,26 +2728,27 @@ public Object[] getRow( ResultSet rs, ResultSetMetaData dummy, RowMetaInterface |
2732 | 2728 | long startTime = System.currentTimeMillis(); |
2733 | 2729 |
|
2734 | 2730 | try { |
2735 | | - lock.lock(); |
2736 | | - |
2737 | | - int nrcols = rowInfo.size(); |
2738 | | - Object[] data = RowDataUtil.allocateRowData( nrcols ); |
| 2731 | + // PDI-19750 - synchronize on the connection to prevent data inconsistency |
| 2732 | + // when multiple Database objects share the same connection and access ResultSets concurrently |
| 2733 | + synchronized ( connection ) { |
| 2734 | + int nrcols = rowInfo.size(); |
| 2735 | + Object[] data = RowDataUtil.allocateRowData( nrcols ); |
2739 | 2736 |
|
2740 | | - if ( rs.next() ) { |
2741 | | - for ( int i = 0; i < nrcols; i++ ) { |
2742 | | - ValueMetaInterface val = rowInfo.getValueMeta( i ); |
| 2737 | + if ( rs.next() ) { |
| 2738 | + for ( int i = 0; i < nrcols; i++ ) { |
| 2739 | + ValueMetaInterface val = rowInfo.getValueMeta( i ); |
2743 | 2740 |
|
2744 | | - data[ i ] = databaseMeta.getValueFromResultSet( rs, val, i ); |
| 2741 | + data[ i ] = databaseMeta.getValueFromResultSet( rs, val, i ); |
| 2742 | + } |
| 2743 | + } else { |
| 2744 | + data = null; |
2745 | 2745 | } |
2746 | | - } else { |
2747 | | - data = null; |
2748 | | - } |
2749 | 2746 |
|
2750 | | - return data; |
| 2747 | + return data; |
| 2748 | + } |
2751 | 2749 | } catch ( Exception ex ) { |
2752 | 2750 | throw new KettleDatabaseException( "Couldn't get row from result set", ex ); |
2753 | 2751 | } finally { |
2754 | | - lock.unlock(); |
2755 | 2752 | if ( log.isGatheringMetrics() ) { |
2756 | 2753 | long time = System.currentTimeMillis() - startTime; |
2757 | 2754 | log.snap( Metrics.METRIC_DATABASE_GET_ROW_SUM_TIME, databaseMeta.getName(), time ); |
|
0 commit comments