Connection pool issue with Bean Datasource

Hi,

I have created a bean data source to connect to my database. My objective of creating this datasource is to switch datasource as per a parameter given. But when I run reports using the bean data source, it does not release the connection back into the pool. My connection pool size is 20, so when I run the 21st report, server hangs printing the following message on the JConsole

Name: pool-7-thread-9
State: WAITING on org.apache.commons.pool.impl.GenericObjectPool@1f8ed84
Total blocked: 0  Total waited: 4
 
Stack trace: 
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:485)
org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:748)
org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
com.loits.jasper.ds.SwitchDS.setReportParameterValues(SwitchDS.java:75)
com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl.fillReport(EngineServiceImpl.java:1725)
com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportFill.runWithDataSource(EngineServiceImpl.java:1086)
com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportFill.runReport(EngineServiceImpl.java:1015)
com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportRunnable.run(EngineServiceImpl.java:908)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
 
Here what I have done in my bean 
package com.loits.jasper.ds;
 
import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import java.sql.SQLException;
 
import net.sf.jasperreports.engine.JRParameter;
 
import org.springframework.security.context.SecurityContextHolder;
 
import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.ReportDataSource;
import com.jaspersoft.jasperserver.api.metadata.jasperreports.service.ReportDataSourceService;
import com.jaspersoft.jasperserver.api.metadata.user.domain.Role;
import com.jaspersoft.jasperserver.api.metadata.user.domain.client.ProfileAttributeImpl;
import com.jaspersoft.jasperserver.api.metadata.user.domain.impl.client.MetadataUserDetails;
import com.jaspersoft.jasperserver.api.common.domain.ExecutionContext;
import com.jaspersoft.jasperserver.api.common.service.BeanForInterfaceImplementationFactory;
import com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.JdbcDataSourceService;
import com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.JdbcReportDataSourceServiceFactory;
import com.jaspersoft.jasperserver.war.common.JasperServerUtil;
import com.jaspersoft.jasperserver.api.metadata.common.service.RepositoryService;
 
public class SwitchDS implements ReportDataSourceService {
 
private JdbcDataSourceService connection; private RepositoryService repositoryService; private BeanForInterfaceImplementationFactory dataSourceServiceFactory;
 
// private DataSourceServiceFactory dataSourceServiceFactory;
 
public SwitchDS(RepositoryService repositoryService,   BeanForInterfaceImplementationFactory dsServiceFactory) {  
    super();  
    this.repositoryService = repositoryService;  
    this.dataSourceServiceFactory = dsServiceFactory;
 
    System.out.println("repositoryService " + repositoryService);  System.out.println("dataSourceServiceFactory "    + dataSourceServiceFactory); 
}
 
@SuppressWarnings({ "unchecked", "rawtypes" }) public void setReportParameterValues(Map parametersValue) {
 
  String ds_name = (String) parametersValue.get("P_SCM");    String ds_uri = "";    
 
  if(ds_name.equalsIgnoreCase("D_001_S")){   
    ds_uri = "/datasources/lolc_fusion";  
  }  
  else if(ds_name.equalsIgnoreCase("D_005_S")){   
    ds_uri = "/datasources/lofc_fusion";  
  }  
  else if(ds_name.equalsIgnoreCase("D_009_S")){   
    ds_uri = "/datasources/lomc_fusion";     
  }  
  else if(ds_name.equalsIgnoreCase("D_010_S")){   
    ds_uri = "/datasources/clc_fusion";  
  }  
  else if(ds_name.equalsIgnoreCase("D_025_S")){   
    ds_uri = "/datasources/lofac_fusion";  
  }
 
 
 
  if(connection == null){   
    connection = getRepositoryDatasource(ds_uri);  
  }
 
  try {   
    parametersValue.put(JRParameter.REPORT_CONNECTION, connection     .getDataSource().getConnection());  
  } catch (SQLException e) {   
    e.printStackTrace();  
  }
 
}
 
public JdbcDataSourceService getRepositoryDatasource(String repositoryURI) {
 
  try {   
    ExecutionContext context = JasperServerUtil.getExecutionContext();   
    ReportDataSource datasource = (ReportDataSource) repositoryService.getResource(context, repositoryURI);
 
    System.out.println("datasource " + datasource.getName());   
    System.out.println("datasource class " + datasource.getClass());
 
   JdbcReportDataSourceServiceFactory factory = (JdbcReportDataSourceServiceFactory) dataSourceServiceFactory.getBean(datasource.getClass());   
   JdbcDataSourceService DSservice = (JdbcDataSourceService) factory     .createService(datasource); 
 
   return DSservice;  
   } 
    catch (Exception ex) {   
    System.out.println(ex);   return null;  
   } 
}
 
@Override public void closeConnection() {  
    if (connection != null) {   
        connection.closeConnection();   
        System.out.println("Connection closed .. "); 
    } 
}
 
public static void main(String[] args) {
 
}
}
dlcathukorala's picture
Joined: May 19 2015 - 10:52pm
Last seen: 6 years 2 weeks ago

0 Answers:

No answers yet
Feedback