2014-02-07 1 views
0
.

. Примерно через месяц обычная система рабочей нагрузки вызывает ошибку при выполнении процедуры. ora 29532 java.io.filenotfoundexception слишком много открытых файлов.Oracle 10g, использование Java для создания PDF-файлов. Слишком много открытых файлов.

Я считаю, что закрываю ручки, где я их открываю.

ОС: Win2003 x64 Oracle 10.0.2.1 Database EE

java.io.FileNotFoundException: Слишком много открытых файлов на java.io.FileInputStream.open (Native Method) в java.io. FileInputStream. (FileInputStream.java:106) в java.io.FileInputStream. (FileInputStream.java:66) на sun.net.www.protocol.file.FileURLConnection.connect (FileURLConnection.java:69) на солнце. net.www.protocol.file.FileURLConnection.getInputStream (FileURLConnection.java:156) на java.net.URL.openStream (URL.java:924) на oracle.xml.parser.v2.XMLReader.openURL (XMLReader.java:2366) на oracle.xml.parser.v2.XMLReader.pushXMLReader (XMLReader.java:279) на oracle.xml.parser.v2. NonValidatingParser.pushExternalDTD (NonValidatingParser.java:542) на oracle.xml.parser.v2.NonValidatingParser.parseDoctypeDecl (NonValidatingParser.java:479) в oracle.xml.parser.v2.NonValidatingParser.parseProlog (NonValidatingParser.java:311) на oracle.xml.parser.v2.NonValidatingParser.parseDocument (NonValidatingParser.java:290) в oracle.xml.parser.v2.XMLParser.parse (XMLParser.java:200) в oracle.xml.jaxp.JXDocumentBuilder. parse (JXDocumentBuilder.java:155) в oracle.xml.jaxp.JXDocumentBuilder.parse (JXDocumentBuilder.java:111) на domain.pdf.java_html_to_pdf.print_PDF (JAVA_HTML_TO_PDF: 71) в domain.pdf.java_html_to_pdf.convetr_html_to_pdf (JAVA_HTML_TO_PDF: 135) Слишком много открытых файлов

create or replace and compile java source named WEB.java_html_to_pdf as 
package domain.pdf; 

import java.io.ByteArrayOutputStream; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.*; 

import oracle.sql.BLOB; 
import oracle.sql.CLOB; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

import org.w3c.dom.Document; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.xhtmlrenderer.pdf.ITextRenderer; 

import com.lowagie.text.Rectangle; 
import com.lowagie.text.pdf.BaseFont; 

import org.w3c.tidy.Tidy; 
import org.w3c.tidy.Configuration; 

// -------------------------------------------------------------------------------------- 
public class java_html_to_pdf 
{ 
    public static int ERR_PDF_PRINTING = 10; 
    public static int ERR_IO_PROCESSES = 20; 
    public static int ERR_VALIDATING = 30; 
    protected static int error = 0; 

    public static byte[] normalise_html(byte [] inptByteArray) 
    { 
    ByteArrayOutputStream fos = new ByteArrayOutputStream(); 
     try 
     { 
      ByteArrayInputStream fis = new ByteArrayInputStream(inptByteArray); 
      Tidy tidy = new Tidy(); 
      tidy.setXHTML(true); 
      tidy.setTidyMark(false); 
      tidy.setMakeClean(true); 
      tidy.setCharEncoding(Configuration.UTF8); 
      tidy.parse(fis, fos); 
      fis.close(); 

      fos.close(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      System.err.println(e.getMessage()); 
      error = ERR_VALIDATING; 
      return null; 
     } 
     return fos.toByteArray(); 
    } 

    public static byte[] print_PDF(byte[] inpt) 
    //public static byte[] print_PDF(InputStream inpt) 
    { 
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    try 
    { 
     DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     db.setEntityResolver(new md.cadastre.pdf.entity_resolver()); 
     Document d = db.parse(new ByteArrayInputStream(inpt)); 
     //Document d = db.parse(inpt); 
     ITextRenderer renderer = new ITextRenderer(); 
     renderer.getFontResolver().addFont("D:\\oracle\\HTML_TO_PDF\\FONTS\\ARIAL.TTF", BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
     renderer.getFontResolver().addFont("D:\\oracle\\HTML_TO_PDF\\FONTS\\ARIALBD.TTF", BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
     renderer.getFontResolver().addFont("D:\\oracle\\HTML_TO_PDF\\FONTS\\ARIALBI.TTF", BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
     renderer.getFontResolver().addFont("D:\\oracle\\HTML_TO_PDF\\FONTS\\ARIALI.TTF", BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
     renderer.getFontResolver().addFont("D:\\oracle\\HTML_TO_PDF\\FONTS\\ARIALCE.TTF", BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
     renderer.getFontResolver().addFont("D:\\oracle\\HTML_TO_PDF\\FONTS\\ARIALCEBD.TTF", BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
     renderer.getFontResolver().addFont("D:\\oracle\\HTML_TO_PDF\\FONTS\\ARIALCEBI.TTF", BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
     renderer.getFontResolver().addFont("D:\\oracle\\HTML_TO_PDF\\FONTS\\ARIALCEI.TTF", BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
     renderer.setDocument(d, null); 
     renderer.layout(); 
     renderer.createPDF(os, false); 
     renderer.finishPDF(); 
     os.close(); 
     //os = null; ??????? 
    } 
     catch (Exception e) 
     { 
     e.printStackTrace(); 
     System.err.println(e.getMessage()); 
     error = ERR_PDF_PRINTING; 
     return null; 
     } 
     return os.toByteArray(); 
    } 

    private static Connection getConnection() throws SQLException 
    { 
    return DriverManager.getConnection("jdbc:default:connection:"); 
    } 


    public static BLOB convetr_html_to_pdf(CLOB clob) 
    { 
     Writer writer = null; 
     Reader reader = null; 
    Connection con = null; 
    BLOB blob = null; 
    OutputStream out = null; 
    InputStream in = null; 
     ByteArrayOutputStream ostr = null; 
     byte[] tmp; 
     try 
     { 
      ostr = new ByteArrayOutputStream(); 
      writer = new BufferedWriter(new OutputStreamWriter(ostr)); 
      reader = new BufferedReader(clob.getCharacterStream()); 
      int length; 
      char[] cbuf = new char[clob.getChunkSize()]; 
      while ((length = reader.read(cbuf, 0, clob.getChunkSize())) != -1) 
      { 
       writer.write(cbuf, 0, length); 
      } 
      writer.close(); 
      reader.close(); 
      tmp = ostr.toByteArray(); 
      // for validating input HTML doc uncomment next lines 
      tmp = normalise_html(tmp); 
      if (error != 0) 
      { 
       return null; 
      } 
      tmp = print_PDF(tmp); 
      if (error != 0) 
      { 
       return null; 
      } 

     con = getConnection(); 
     blob = BLOB.createTemporary(con, true, BLOB.DURATION_SESSION); 
     out = blob.getBinaryOutputStream(); 
     in = new BufferedInputStream(new ByteArrayInputStream(tmp)); 
     int chunkSize = blob.getChunkSize(); 
     byte[] bbuf = new byte[chunkSize]; 
     while ((length = in.read(bbuf)) != -1) 
     { 
     out.write(bbuf, 0, length); 
     } 
     if (in != null) {in.close();} 
     if (out != null) {out.close();} 
     if (con != null) {con.close();} 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      System.err.println(e.getMessage()); 
      return null; 
     } 
     return blob; 
    } 
} 

Хотя он является общим для Linux/Unix рекомендации по увеличению количества обработчиков, в среде Microsoft Windows, я считаю, что она ограничена 16k.

Я не могу найти преступника, из которого происходит слишком много файлов.

ответ

0

Вы проверили свой журнал на наличие исключений? Я подозреваю, что у вас есть закрытые объекты, когда вы сталкиваетесь с исключением, потому что вы не выполняете закрытие ресурсов внутри блока finally.

+0

Есть ли способ увидеть, какие файлы открыты? – user3282858

Смежные вопросы