Bug 136141 Prepared statements not properly cleaned up.
After designing a JDBC query in a report design, I opened the DataSetEditor and choose "Preview Results". There are a number of warnings that came up in the Console indicating there are prepared statements not properly managed or cleaned up. Apr 11, 2006 8:23:04 AM org.eclipse.birt.data.engine.executor.DataSource close WARNING: 1 statements still active. Apr 11, 2006 8:23:05 AM org.eclipse.birt.data.engine.executor.DataSource closeStatement WARNING: statement not found Tracing down the problem a little further, the root cause of the problem is because the DataSourceQuery (in data.engine.executor) is trying to close a dangling reference of a PreparedStatement. The PreparedStatement has been previously dropped from the statementMap of the DataSource when the DataSource.close() was called. But DataSourceQuery is still holding on to a reference of it. The sequence is as follows: 1) DataSourceQuery prepares a statement. This in turn makes DataSource prepare a statement, and creates a PreparedStatement object, adds it to the statementMap. 2) During DataEngineImpl.defineDataSource(), the existing DataSource is closed, replaced by the supplied DataSourceDesign. The DataSource still have statements in its map. And a warning is logged indicating this is a resource leak. It then cleans the statementMap and closes all its open connections. 3) When DataSourceQuery tries to close the dangling statement, it cannot find it. It logs a message "Statement not found". Then, it still proceeds to close it.
data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/impl/DataEngineImpl.java
/**
	 * Returns the runtime defn of a data source. If data source is not found,
	 * returns null.
	 */
	DataSourceRuntime getDataSourceRuntime( String name )
	{
		return (DataSourceRuntime) dataSources.get( name );
	}
	/**
	 * Returns the design of a data set. If data set is not found, returns null.
	 */
	IBaseDataSetDesign getDataSetDesign( String name )
	{
		return (IBaseDataSetDesign) dataSetDesigns.get( name );
	}
	/**
	 * Verifies the elements of a report query spec
	 * and provides a hint to the query to prepare and optimize 
	 * an execution plan.
	 * The given querySpec could be a ReportQueryDefn 
	 * (raw data transform) spec generated by the factory 
	 * based on static definition found in a report design.
	 * <p> 
	 * This report query spec could be further refined by FPE 
	 * during engine execution after having resolved any related
	 * runtime condition.  This is probably not in BIRT Release 1.
	 * For example, a nested report item might not be rendered based
	 * on a runtime condition.  Thus its associated data expression
	 * could be removed from the report query defn given to 
	 * DtE to prepare.