Conexões em rotina automática [RESOLVIDO]

Bom dia,

Eu tenho uma rotina automática de envio de emails c/ boletins em anexo.
Estou tendo uma problema c/ as conexões pois para o envio dos boletins eu preciso de conexões c/ o banco para a geração dos mesmos !
O problema é que ele chama os métodos para a abertura de conexões mas deixa elas abertas e qdo o nº de conexões chega a 1000 ele estoura o pool do banco e para a minha rotina por falta de conexões.
O erro apresentado no log é o seguinte:

java.sql.SQLException: ORA-01000: maximum open cursors exceeded

segue uma parte da classe de TaskManager

	public void contextInitialized(ServletContextEvent sce) {
		timer = new Timer ();
		java.util.Date agora = Calendar.getInstance().getTime();
		System.out.println("AGORA É : " + agora);
		Calendar c = Calendar.getInstance();
		if (c.get(Calendar.MINUTE) > -1 && c.get(Calendar.MINUTE) < 15 ) {
			c.set(Calendar.MINUTE,15 ) ;
		} else
			if (c.get(Calendar.MINUTE) > 14 && c.get(Calendar.MINUTE) < 30 ) {
				c.set(Calendar.MINUTE,30) ;
			} else
				if (c.get(Calendar.MINUTE) > 29 && c.get(Calendar.MINUTE) < 45 ) {
					c.set(Calendar.MINUTE, 45) ;
				} else 
					if (c.get(Calendar.MINUTE) > 44 && c.get(Calendar.MINUTE) <= 59 ) {
						c.add(Calendar.HOUR,1) ;
						c.set(Calendar.MINUTE,0) ;
					}
		c.set(Calendar.SECOND,0);
		java.util.Date horaAgendada = c.getTime();
		
		System.out.println("Hora Agendada: " + horaAgendada);
		System.out.println("É agendada: " + agora.after(horaAgendada));
		
		if (! agora.after(horaAgendada)){
			/*
			 * 1segundo = 1000 milisegundos
			 * 1 minuto = 60000 milisegundos
			 * 1 hora = 3600000 milisegundos
			 * 1 dia = 24 horas = 86400000 milisegundos 
			 */
			long delay = horaAgendada.getTime() - agora.getTime();
			long period = 60000 * 15;
			
			System.out.println("  Tempo para primeira execução: " + delay/60000 + " minutos ");
			
			timer.scheduleAtFixedRate(new TimerTask() {
				public void run() {
					System.out.println("TASK MANAGER em execução ...");
					
					cria_conexao_jpdw();
					cria_conexao_sigind();
					cria_conexao_siagri();
					cria_conexao_logix();

					bol_industrial.processo(conn_jpdw, conn_sigind);
					bol_indicador_agricola.processo(conn_jpdw, conn_siagri);
					bol_adiantamento_cliente.processo(conn_jpdw, conn_logix);
										
				}
			}, delay, period);
		}
	}
	
	public void contextDestroyed(ServletContextEvent sce){}
	
	private void cria_conexao_jpdw() {
		if (conn_jpdw == null) {
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn_jpdw = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "portaljp", "portaljp");
			} catch (SQLException e) {
				e.printStackTrace() ;
			} catch (ClassNotFoundException e) {
				e.printStackTrace() ;
			}			
		}
	}	
	private void cria_conexao_sigind() {
		if (conn_sigind == null) {
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn_sigind = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "sigind", "sigind");
			} catch (SQLException e) {
				e.printStackTrace() ;
			} catch (ClassNotFoundException e) {
				e.printStackTrace() ;
			}			
		}
	}
	private void cria_conexao_siagri() {
		if (conn_siagri == null) {
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn_siagri = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "siagri", "siagri");
			} catch (SQLException e) {
				e.printStackTrace() ;
			} catch (ClassNotFoundException e) {
				e.printStackTrace() ;
			}			
		}
	}
	private void cria_conexao_logix() {
		if (conn_logix == null) {
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn_logix = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "logix", "logix2000");
			} catch (SQLException e) {
				e.printStackTrace() ;
			} catch (ClassNotFoundException e) {
				e.printStackTrace() ;
			}			
		}
	}
}

Já tentei fechar as conexões nas classes chamadas e também aqui nesta do TaskManager, o problema é que ela fecha e não abre na próx. verificação.

Alguém tem alguma idéia de como resolver este problema de abrir e fechar as conexões a cada verificação da rotina ???

desde já agradeço a atenção !!!

Você já tentou fechar as conexões nos seus métodos bol_industrial.processo(), bol_indicador_agricola.processo() e bol_adiantamento_cliente.processo()?

Não deveria haver problemas para abrir outra conexão, visto que você requisita uma totalmente nova para o DriverManager…

Sim … não sei ao certo o motivo, mas ele não abre novas conexões para as próx. execuções !

repare que nos métodos de criar as conexões eu já faço uma verificação para ver se a conexão é nula !

private void cria_conexao_sigind() {
		if (conn_sigind == null) {
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn_sigind = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "sigind", "sigind");
			} catch (SQLException e) {
				e.printStackTrace() ;
			} catch (ClassNotFoundException e) {
				e.printStackTrace() ;
			}			
		}
	}

mas mesmo assim ele cria novas conexões a cada rotina.
ainda não fiz o teste por motivos operacionais aqui na empresa, mas se eu modificasse cada método e dando um retorno de um objeto do tipo Connection.
Será que resolvera meu problema ?

	private Connection cria_conexao_jpdw() {
		if (conn_jpdw == null) {
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn_jpdw = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "portaljp", "portaljp");
			} catch (SQLException e) {
				e.printStackTrace() ;
			} catch (ClassNotFoundException e) {
				e.printStackTrace() ;
			}
			return conn_jpdw;
		}else{
			return null;
		}
	}

Tente fazer assim:

	private Connection cria_conexao_jpdw() {
		if (conn_jpdw == null) {
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn_jpdw = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "portaljp", "portaljp");
			} catch (SQLException e) {
				e.printStackTrace() ;
			} catch (ClassNotFoundException e) {
				e.printStackTrace() ;
			}
		}
		return conn_jpdw;
	}

Ou seja, se a conexão for igual a null (ainda não foi instanciada) cria a conexão (se já foi, pula essa parte). Depois retorna a conexão existente.

Eu fiz as modificações, a rotina continuou na mesma, funcionando normal.

mas o meu problema continua … ele vai abrindo mais cursores na mesma sessão !!!

alguém sabe o porque disso ???

Voce tem que criar um metodo para fechar as conexoes, apos o email ser enviado vc chama o metodo.
O problema que percebi eh que vc verifica sempre if (conn_jpdw == null)
entao no metodo que fecha a conexao vc deve setar conn_jpdw = null.

vou fazer este teste aqui !!! já posto a resposta!!!

Vc pode postar os meus metodos processo?

Eu tenho a impressão que vc não esta fechando o ResultSets de forma adequada nesse método, por isso vc tem o erro:

ORA-01000: maximum open cursors exceeded

Esse erro é por não fechar os resultsets.

segue o metodo implementado na classe:

public void processo(Connection conn_jpdw, Connection conn_prod) {
		this.conn_jpdw = conn_jpdw;
		this.conn_prod = conn_prod;
		
		dt_atual = new Formatados().data(-1);
		
		GregorianCalendar vd_agora = new GregorianCalendar() ;
		GregorianCalendar vd_agenda = new GregorianCalendar() ;
		
		System.out.println("  Iniciando o processo de verificação do Boletim de Consumo de Combustivel: " + vd_agora.getTime());
		
		try {
			System.out.println("    Verificando agenda ...");
			
			sql = "";
			sql+= "select t.id_tela, t.hora_agendamento, to_char(tea.data,'dd/mm/rrrr hh24:mi') dt_envio, to_char(tea.data-1,'dd/mm/rrrr') dt_boletim, tea.repeticao";
			sql+= "  from portaljp.seg_tela_email_agenda tea";
			sql+= "     , portaljp.seg_tela t";
			sql+= " where t.id_tela   = ?";
			sql+= "   and tea.id_tela = t.id_tela";
			
			pstmt = conn_jpdw.prepareStatement(sql);
			pstmt.setInt(1, id_tela);
			rs_jpdw = pstmt.executeQuery();
			rs_jpdw.next();

			dt_boletim = rs_jpdw.getString("dt_boletim");
			hr_boletim = rs_jpdw.getString("hora_agendamento");
			hr_envio   = rs_jpdw.getString("dt_envio").substring(11,16);
			
			vd_agenda.set(Calendar.DAY_OF_MONTH,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(0,2)));
			vd_agenda.set(Calendar.MONTH,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(3,5))-1);
			vd_agenda.set(Calendar.YEAR,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(6,10)));
			vd_agenda.set(Calendar.HOUR_OF_DAY,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(11,13)));
			vd_agenda.set(Calendar.MINUTE,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(14,16))+2);
			rs_jpdw.close();
			pstmt.close();
			
			if (VerificaPeriodo(vd_agora, vd_agenda)) {
				/* Verificando se é dia e hora de envio */
				if (dt_boletim.equals(dt_atual)){
					if (hr_envio.equals(hr_boletim)){
						System.out.println("    Enviando os Boletim de Consumo de Combustivel de todas as unidades");
						
						sql = "";
						sql+= " select cod_empresa,to_char(sysdate, 'MM') mes_corrente,to_char(sysdate, 'YYYY') ano_corrente from portaljp.seg_empresa where planta = 1 and cod_empresa in ('01') ";
						pstmt   = conn_jpdw.prepareStatement(sql);
						rs_jpdw_laco = pstmt.executeQuery();
						
						while(rs_jpdw_laco.next()){
							System.out.println("      Preparando para o envio do boletim da Unidade: " + rs_jpdw_laco.getString("cod_empresa"));
							
							geraAnexo(rs_jpdw_laco.getString("cod_empresa"));
						}
						rs_jpdw_laco.close();
		
						System.out.println("    Reagendando para a semana seguinte.");
						
						/* Relatório Agendado SEMANAL */
						sql = "";
						sql+= "update portaljp.seg_tela_email_agenda ";
						sql+= "   set data      = to_date(to_char(data + 7, 'dd/mm/rrrr') || '" + hr_boletim.trim() + "','dd/mm/rrrr hh24:mi') ";
						sql+= " where id_tela = ?";
						
						pstmt = conn_jpdw.prepareStatement(sql);
						pstmt.setInt(1, id_tela);
						pstmt.executeUpdate();
					}
				}
			}
			pstmt.close();
			rs_jpdw.close();
			rs_jpdw_empresa.close();
			rs_jpdw_laco.close();
			rs_prod.close();
		}catch (SQLException e) {
			e.printStackTrace();
		}
	}

na classe eu declaro os segintes ResultSets:

	private ResultSet rs_jpdw = null;
	private ResultSet rs_jpdw_laco = null;
	private ResultSet rs_jpdw_empresa = null;
	private ResultSet rs_prod = null;

e uso eles em outros metodos da mesma classe.

depois dessa modificação que eu fiz no método, de fechar todos os ResultSet que eu declarei…
comecei a ter problemas na classe do TaskManager !!!

Exception in thread “Timer-0” java.lang.NullPointerException

alguém sabe a ligação que o ResultSet tem com este erro !?

e como eu poderia fechar eles para que não ficasse criando cursores a cada envio ?!

O erro ORA-01000 indica que o seu sistema está abrindo mais cursores que ele suporta. Tem um parametro no oracle que parametriza o valor máximo, mas eu não lembro o nome.
De qquer forma o seu sistema não pode ficar abrindo cursores e deixando-os aberto.
O que o metodo geraAnexo() faz? ele abre resultset’s tbém?

Sim, eu declaro os ResultSet’s na minha classe e uso eles em todos os métodos da classe.

Mas eu fecho todos depois de usa-los !!!

segue uma das classes chamadas pelo TaskManager.

package br.com.jpessoa.sendreport;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Properties;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;


import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;

import br.com.jpessoa.bd.TelaEmail;
import br.com.jpessoa.bd.MailText;
import br.com.jpessoa.diversos.Formatados;

public class Bol_Consumo_Combustivel {
	/**
	 * Boletim de Consumo de Comnustivel - Envio Semanal - tela = 375
	 * Envio c/ informações da semana anterior
	 * Setor: Motomecanização.
	 * Criado em 15/10/2008.
	 * André Hebeler.
	 * 
	 * ***BOLETIM DESATIVADO***
	 */

	/* Variáveis de configuração */
	private String urlBase;
	private String pageRoot;
	
	private String dt_atual = new Formatados().data(-1);
	private String dt_ini   = new Formatados().data(-7);	
	
	/* Variável que indica a tela que deve ser enviada */
	private int id_tela    = 375;
	
	/* Variáveis de controle de visualização do boletim */
	private String dia_mes = (new Formatados().data().substring(0,2) + new Formatados().data().substring(3,5));
	private String anexo   = id_tela + dia_mes + "Boletim_Consumo_Combustivel.pdf";
	private String cod_rel = id_tela + dia_mes;

	/* Data e hora dos dados para envio do Boletim de Consumo de Combustivel */
	private String dt_boletim = "";
	private String hr_boletim = "";
	
	/* Hora de envio do Boletim de Consumo de Combustivel */
	private String hr_envio = "";
	
	/* Variáveis de consulta a banco de dados */
	private String sql = "";
	
	private Connection conn_jpdw = null;
	private Connection conn_prod = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs_jpdw = null;
	private ResultSet rs_jpdw_laco = null;
	private ResultSet rs_jpdw_empresa = null;
	private ResultSet rs_prod = null;
	
	private TelaEmail tela_email = new TelaEmail();
	private MailText mailtext    = new MailText();

	public Bol_Consumo_Combustivel(String urlBase, String pageRoot) {
		this.urlBase = urlBase;
		this.pageRoot = pageRoot;
	}

	private boolean VerificaPeriodo(GregorianCalendar vd_inicio, GregorianCalendar vd_meio) {
		GregorianCalendar vd_fim ;
		if (vd_inicio.get(Calendar.MINUTE) > -1 && vd_inicio.get(Calendar.MINUTE) < 15 ) {
			vd_inicio.set(Calendar.MINUTE,0 ) ;
		} else
			if (vd_inicio.get(Calendar.MINUTE) > 14 && vd_inicio.get(Calendar.MINUTE) < 30 ) {
				vd_inicio.set(Calendar.MINUTE,15) ;
			} else
				if (vd_inicio.get(Calendar.MINUTE) > 29 && vd_inicio.get(Calendar.MINUTE) < 45 ) {
					vd_inicio.set(Calendar.MINUTE, 30) ;
				} else 
					if (vd_inicio.get(Calendar.MINUTE) > 44 && vd_inicio.get(Calendar.MINUTE) <= 59 ) {
						vd_inicio.set(Calendar.MINUTE,45) ;
					}
		vd_fim = (GregorianCalendar)vd_inicio.clone() ;
		vd_fim.add(Calendar.MINUTE,15) ;
		
		if (vd_inicio.before(vd_meio) && vd_fim.after(vd_meio)) {
			return true ;
		} else {
			return false ;
		}
	}
	
	public void processo(Connection conn_jpdw, Connection conn_prod) {
		this.conn_jpdw = conn_jpdw;
		this.conn_prod = conn_prod;
		
		dt_atual = new Formatados().data(-1);
		
		GregorianCalendar vd_agora = new GregorianCalendar() ;
		GregorianCalendar vd_agenda = new GregorianCalendar() ;
		
		System.out.println("  Iniciando o processo de verificação do Boletim de Consumo de Combustivel: " + vd_agora.getTime());
		
		try {
			System.out.println("    Verificando agenda ...");
			
			sql = "";
			sql+= "select t.id_tela, t.hora_agendamento, to_char(tea.data,'dd/mm/rrrr hh24:mi') dt_envio, to_char(tea.data-1,'dd/mm/rrrr') dt_boletim, tea.repeticao";
			sql+= "  from portaljp.seg_tela_email_agenda tea";
			sql+= "     , portaljp.seg_tela t";
			sql+= " where t.id_tela   = ?";
			sql+= "   and tea.id_tela = t.id_tela";
			
			pstmt = conn_jpdw.prepareStatement(sql);
			pstmt.setInt(1, id_tela);
			rs_jpdw = pstmt.executeQuery();
			rs_jpdw.next();

			dt_boletim = rs_jpdw.getString("dt_boletim");
			hr_boletim = rs_jpdw.getString("hora_agendamento");
			hr_envio   = rs_jpdw.getString("dt_envio").substring(11,16);
			
			vd_agenda.set(Calendar.DAY_OF_MONTH,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(0,2)));
			vd_agenda.set(Calendar.MONTH,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(3,5))-1);
			vd_agenda.set(Calendar.YEAR,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(6,10)));
			vd_agenda.set(Calendar.HOUR_OF_DAY,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(11,13)));
			vd_agenda.set(Calendar.MINUTE,Integer.parseInt(rs_jpdw.getString("dt_envio").substring(14,16))+2);
			rs_jpdw.close();
			pstmt.close();
			
			if (VerificaPeriodo(vd_agora, vd_agenda)) {
				/* Verificando se é dia e hora de envio */
				if (dt_boletim.equals(dt_atual)){
					if (hr_envio.equals(hr_boletim)){
						System.out.println("    Enviando os Boletim de Consumo de Combustivel de todas as unidades");
						
						sql = "";
						sql+= " select cod_empresa,to_char(sysdate, 'MM') mes_corrente,to_char(sysdate, 'YYYY') ano_corrente from portaljp.seg_empresa where planta = 1 and cod_empresa in ('01') ";
						pstmt   = conn_jpdw.prepareStatement(sql);
						rs_jpdw_laco = pstmt.executeQuery();
						
						while(rs_jpdw_laco.next()){
							System.out.println("      Preparando para o envio do boletim da Unidade: " + rs_jpdw_laco.getString("cod_empresa"));
							
							geraAnexo(rs_jpdw_laco.getString("cod_empresa"));
						}
						rs_jpdw_laco.close();
		
						System.out.println("    Reagendando para a semana seguinte.");
						
						/* Relatório Agendado SEMANAL */
						sql = "";
						sql+= "update portaljp.seg_tela_email_agenda ";
						sql+= "   set data      = to_date(to_char(data + 7, 'dd/mm/rrrr') || '" + hr_boletim.trim() + "','dd/mm/rrrr hh24:mi') ";
						sql+= " where id_tela = ?";
						
						pstmt = conn_jpdw.prepareStatement(sql);
						pstmt.setInt(1, id_tela);
						pstmt.executeUpdate();
					}
				}
			}
			pstmt.close();
		}catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private void geraAnexo(String cod_empresa) {
		Calendar vd_data = Calendar.getInstance();
		vd_data.add(Calendar.DAY_OF_MONTH, -1);
		
		try {
			dt_atual = new Formatados().data(-1);
			String vs_relatorio = "rel_core/agricola/report/Siagri_Consumo_Combustivel.jrxml";			
			String script = pageRoot + urlBase + "rel_core/agricola/sql/consumo_combustivel.txt";
			
			/* Gerando o boletim */
			BufferedReader archive;
			archive = new BufferedReader(new FileReader(script));			
			/* Extraindo a instrução SQL do arquivo .txt */
			sql = "";
			try{
				while(archive.ready()){
					sql+= archive.readLine() + " ";
				}
				archive.close();
			}catch(FileNotFoundException e){
				e.printStackTrace();
			}
			
			/* Ativando/Desativando as macros do script */			
			/* Macro referente ao campo Período - Obrigatória */
			sql = sql.replace("$MACRO_CAMPO_01", "'" + dt_ini + " à " + dt_atual + "' PERIODO");
			
			/* Macro referente ao parametro código da empresa - Obrigatória */
            sql = sql.replace("$MACRO_PARAM_01", "'" + cod_empresa + "'");
			
			/* Macro referente ao parametro Data Inicial - Obrigatória */
			sql = sql.replace("$MACRO_PARAM_02", "'" + dt_ini + "'");
	              
			/* Macro referente ao parametro Data Final - Obrigatória */
			sql = sql.replace("$MACRO_PARAM_03", "'" + dt_atual + "'");
			
			/* Macro referente ao parametro Frota - Não Obrigatória */
			sql = sql.replace("$MACRO_01", "");
				    
			/* Macro referente ao parametro Tipo Proprietário - Não Obrigatória */
			sql = sql.replace("$MACRO_02", "");
						
			pstmt = conn_prod.prepareStatement(sql);
			rs_prod = pstmt.executeQuery();
			
			if (rs_prod.next()){
				rs_prod.close();
				pstmt.close();
				
				pstmt = conn_prod.prepareStatement(sql);
				rs_prod = pstmt.executeQuery();
				
				JRResultSetDataSource jrRS = new JRResultSetDataSource(rs_prod);
				JasperReport relatorio     = JasperCompileManager.compileReport(pageRoot + urlBase + vs_relatorio);
				JasperPrint impressao      = JasperFillManager.fillReport(relatorio, new HashMap(), jrRS);
				JasperExportManager.exportReportToPdfFile(impressao, pageRoot + urlBase + "relatorios/" + cod_empresa + anexo);
				
				//Inserção na tabela de controle de Boletins Gerados na pasta
				sql="";
				sql = " insert into portaljp.envio_boletim (codigo, nome) values (?,?) ";
				PreparedStatement pstmt = conn_jpdw.prepareStatement(sql);
				pstmt.setString(1, cod_empresa + cod_rel);
				pstmt.setString(2, cod_empresa + anexo);
				pstmt.executeUpdate();
				pstmt.close();
	
				envio(cod_empresa);

				rs_prod.close();
				pstmt.close();
			}else{
				rs_prod.close();
				pstmt.close();
				
				System.out.println("      Unidade " + cod_empresa + " sem informações para o período");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	private void envio(String cod_empresa){
		try {
			PreparedStatement preparedstatement = conn_jpdw.prepareStatement("select nome_empresa from portaljp.seg_empresa where cod_empresa = ?");
			preparedstatement.setString(1, cod_empresa);
			rs_jpdw_empresa = preparedstatement.executeQuery();
			rs_jpdw_empresa.next();

			String mailsubject  = "Bol. Consumo Combustivel: " + rs_jpdw_empresa.getString("nome_empresa");
			String nome    = "Boletim de Consumo de Combustivel";			
			String periodo = "Envio semanal, toda segunda-feira c/ período de informações referente a semana anterior.";
			String setor   = "Motomecanização.";
			
			String link    = &quot;<a href='http://10.0.99.33:8088/sic/relatorios/relatorio.jsp?id=" + cod_empresa + cod_rel + "&dt_hr=" + dt_boletim + " " + hr_boletim + "'> ";
			dt_atual       = new Formatados().data();
			String unidade = (String)rs_jpdw_empresa.getString("nome_empresa");			

			// Mensagem SEM ANEXO
			preparedstatement = conn_jpdw.prepareStatement(tela_email.sql_select_empresa_sem_anexo);
			preparedstatement.setInt(1, id_tela);
			preparedstatement.setString(2, cod_empresa);
			preparedstatement.setString(3, cod_empresa);
			rs_jpdw = preparedstatement.executeQuery();
			
			if(rs_jpdw.next()){													
				/* Mensagem do corpo do email em HTML */
				String mensagem = mailtext.retornaMailTextLink(nome, dt_atual, unidade, link, periodo, setor);

			    // Captura as configurações do sistema
			    Properties props = System.getProperties();
			
			    // Setup do servidor de email (POP3)
			    props.put("mail.smtp.host", "smtp.cbaa.ind.br");
			
			    // Cria sessão
			    Session sessao = Session.getInstance(props, null);
			
			    // Define mensagem
			    Message message = new MimeMessage(sessao);
			    message.setFrom(new InternetAddress("nao_responder@cbaa.ind.br","Tecnologia da Informação"));
			
			    // Define quem receberá a mensagem
			    String recipiente = "";
			    do{
			    	recipiente = rs_jpdw.getString("email");
			    	message.addRecipient(Message.RecipientType.BCC, new InternetAddress(recipiente));				    	
			    } while (rs_jpdw.next());
			    
			    message.setSubject(mailsubject);
			    
			    MimeBodyPart mbp1 = new MimeBodyPart();
			    mbp1.setContent(mensagem, "text/html; charset=iso-8859-1");
			    
			    Multipart multipart = new MimeMultipart();
			    multipart.addBodyPart(mbp1);
			    
			    message.setContent(multipart);				
			    // Envia a mensagem
			    Transport.send(message);
			    
				System.out.println("      Enviando boletim da Unidade: " + cod_empresa + " sem anexo");
				
			}else{
				System.out.println("      " + cod_empresa + " não passui usuários sem anexo"); 
			}
			
			// Mensagem COM ANEXO
			preparedstatement = conn_jpdw.prepareStatement(tela_email.sql_select_empresa_com_anexo);
			preparedstatement.setInt(1, id_tela);
			preparedstatement.setString(2, cod_empresa);
			preparedstatement.setString(3, cod_empresa);
			rs_jpdw = preparedstatement.executeQuery();
			
			if(rs_jpdw.next()){
				String mailfilename = cod_empresa + anexo;
				
				/* Mensagem do corpo do email em HTML */
				String mensagem = mailtext.retornaMailTextAnexo(nome, dt_atual, unidade, periodo, setor);
				
			    // Captura as configurações do sistema
			    Properties props = System.getProperties();
			
			    // Setup do servidor de email (POP3)
			    props.put("mail.smtp.host", "smtp.cbaa.ind.br");
			
			    // Cria sessão
			    Session sessao = Session.getInstance(props, null);
			
			    // Define mensagem
			    Message message = new MimeMessage(sessao);
			    message.setFrom(new InternetAddress("nao_responder@cbaa.ind.br","Tecnologia da Informação"));
			
			    // Define quem receberá a mensagem
			    String recipiente = "";
			    do{
			    	recipiente = rs_jpdw.getString("email");
			    	message.addRecipient(Message.RecipientType.BCC, new InternetAddress(recipiente));
			    } while (rs_jpdw.next());
			    
			    message.setSubject(mailsubject);
			    
			    MimeBodyPart mbp1 = new MimeBodyPart();
			    mbp1.setContent(mensagem, "text/html; charset=iso-8859-1");
			    
			    Multipart multipart = new MimeMultipart();
			    multipart.addBodyPart(mbp1);
			
			    // Cria a outra parte do corpo da mensagem
			    BodyPart bp3 = new MimeBodyPart();
			
			    // Captura o arquivo anexo
			    DataSource source = new FileDataSource(pageRoot + urlBase + "relatorios/" + cod_empresa + anexo);
			    bp3.setDataHandler(new DataHandler(source));
			    bp3.setFileName(mailfilename);
			
			    // Adiciona no corpo da mensagem
			    multipart.addBodyPart(bp3);
			    
			    message.setContent(multipart);
			
			    // Envia a mensagem
			    Transport.send(message);
			    
				System.out.println("      Enviando boletim da Unidade: " + cod_empresa + " com anexo");
				
			}else{
				System.out.println("      " + cod_empresa + " não passui usuários com anexo");
			}
			
			rs_jpdw.close();
			rs_jpdw_empresa.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

Oi andre.hebeler,

Posso ter me enganado...mas não encontrei nenhuma linha (nos códigos enviados nos posts) onde está escrito [b]conn_jpdw.close();[/b].

Detalhe ao fechar a conexão todos os cursores (resultsets) são fechados o inverso não é verdadeiro.

vlws

Então fantomas, foi oq eu disso nas msg anteriores !

se eu fecho a conexão ! ele não abre na prox. execução e os envio param !!!

Verdade!

O que acontece quando vc tenta abrir a próxima conexão?

Vc recebe uma exception ou simplesmente não acontece nada?

Notei que tem um if no método que cria a conexão, vc verificou se a lógica está correta? Pois se entendi bem será criada uma próxima conexão apenas se a anterior for fechada e a referencia for nula.

flws

Ele me da um erro do banco

“Not logged on”

vou faze algumas modificações aqui na minha classe TaskManager para tentar fechar a conexão e abrir a cada execução

Resolvi o problema !!!

modifiquei minha classe TaskManager, tirei o if que verifica se a conexão é nula nos métodos de abrir conexao e fiz um metodo para fechar cada conexão que eu abro apos a verificação de cada classe de boletim

segue o techo da classe modificada.

					bol_consumo_combustivel.processo(conn_jpdw, conn_siagri);
					
					fecha_conexao_jpdw();
					fecha_conexao_sigind();
					fecha_conexao_siagri();
					fecha_conexao_logix();
										
				}
			}, delay, period);
		}
	}
	
	public void contextDestroyed(ServletContextEvent sce){}
	
	private void cria_conexao_jpdw() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn_jpdw = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "portaljp", "portaljp");
		} catch (SQLException e) {
			e.printStackTrace() ;
		} catch (ClassNotFoundException e) {
			e.printStackTrace() ;
		}	
	}	
	private void cria_conexao_sigind() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn_sigind = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "sigind", "sigind");
		} catch (SQLException e) {
			e.printStackTrace() ;
		} catch (ClassNotFoundException e) {
			e.printStackTrace() ;
		}	
	}
	private void cria_conexao_siagri() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn_siagri = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "siagri", "siagri");
		} catch (SQLException e) {
			e.printStackTrace() ;
		} catch (ClassNotFoundException e) {
			e.printStackTrace() ;
		}		
	}
	private void cria_conexao_logix() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn_logix = DriverManager.getConnection("jdbc:oracle:thin:@10.0.99.30:1521:teste", "logix", "logix2000");
		} catch (SQLException e) {
			e.printStackTrace() ;
		} catch (ClassNotFoundException e) {
			e.printStackTrace() ;
		}		
	}
	
	private void fecha_conexao_jpdw(){
		try{
			this.conn_jpdw.close();
		}catch(SQLException e) {
			e.printStackTrace() ;
		}			
	}
	
	private void fecha_conexao_sigind(){
		try{
			this.conn_sigind.close();
		}catch(SQLException e) {
			e.printStackTrace() ;
		}			
	}
	
	private void fecha_conexao_siagri(){
		try{
			this.conn_siagri.close();
		}catch(SQLException e) {
			e.printStackTrace() ;
		}			
	}
	
	private void fecha_conexao_logix(){
		try{
			this.conn_logix.close();
		}catch(SQLException e) {
			e.printStackTrace() ;
		}			
	}
}

Agradeço a todos que ajudaram !

um abraço !!!