大虾们,小弟有个问题请教各位。希望大家积极发言,呵呵。保证给分啊。
小弟现在用Jdom作XML的解析,服务器端需要同时起10个线程,每个线程要生成一个10M大的XML文件。这些文件的内容是从数据库中读出来的,先将数据从数据库中取出来再写进XML文件中。
问题是每次起10个线程生成文件总有2个线程生成失败,原因是服务器内存溢出。
各位,请问有什么好的办法来调优啊。听说用SAX解析XML效率要高些,但是小弟不会啊。谁能给小弟一个用SAX解析XML的一个简单例子(读XML文件个写XML文件的)。
小弟,在此先谢谢各位了!

解决方案 »

  1.   

    问题是每次起10个线程生成文件总有2个线程生成XML文件失败。上面的没怎么说清楚
      

  2.   

    简单!
    import java.io.*;import org.xml.sax.*;
    import org.xml.sax.helpers.DefaultHandler;
    import org.xml.sax.ext.LexicalHandler;import javax.xml.parsers.SAXParserFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;public class Echo12 extends DefaultHandler
       implements LexicalHandler
    {
        public static void main(String argv[])
        {
            if (argv.length != 1) {
                System.err.println("Usage: cmd filename");
                System.exit(1);
            }
            
            // Use an instance of ourselves as the SAX event handler
            Echo12 handler = new Echo12();
            // Use the validating parser
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setValidating(true);
            //factory.setNamespaceAware(true);
            try {
                // Set up output stream
                out = new OutputStreamWriter(System.out, "UTF8");            // Parse the input
                SAXParser saxParser = factory.newSAXParser();
                XMLReader xmlReader = saxParser.getXMLReader();
                xmlReader.setProperty(
                    "http://xml.org/sax/properties/lexical-handler",
                     handler
                     );            
                saxParser.parse( new File(argv[0]), handler);        } catch (SAXParseException spe) {
               // Error generated by the parser
               System.out.println("\n** Parsing error"
                  + ", line " + spe.getLineNumber()
                  + ", uri " + spe.getSystemId());
               System.out.println("   " + spe.getMessage() );           // Use the contained exception, if any
               Exception  x = spe;
               if (spe.getException() != null)
                   x = spe.getException();
               x.printStackTrace();        } catch (SAXException sxe) {
               // Error generated by this application
               // (or a parser-initialization error)
               Exception  x = sxe;
               if (sxe.getException() != null)
                   x = sxe.getException();
               x.printStackTrace();        } catch (ParserConfigurationException pce) {
                // Parser with specified options can't be built
                pce.printStackTrace();        } catch (IOException ioe) {
               // I/O error
               ioe.printStackTrace();
            }        System.exit(0);
        }    static private Writer  out;
        private String indentString = "    "; // Amount to indent
        private int indentLevel = 0;    public void setDocumentLocator(Locator l)
        {
            // Save this to resolve relative URIs or to give diagnostics.
            try {
              out.write("LOCATOR");
              out.write("\n SYS ID: " + l.getSystemId() );
              out.flush();
            } catch (IOException e) {
                // Ignore errors
            }
        }    public void startDocument()
        throws SAXException
        {
            nl();
            nl();
            emit("START DOCUMENT");
            nl();
            emit("<?xml version='1.0' encoding='UTF-8'?>");
        }    public void endDocument()
        throws SAXException
        {
            nl(); emit("END DOCUMENT");
            try {
                nl();
                out.flush();
            } catch (IOException e) {
                throw new SAXException("I/O error", e);
            }
        }    public void startElement(String namespaceURI,
                                 String lName, // local name
                                 String qName, // qualified name
                                 Attributes attrs)
        throws SAXException
        {
            indentLevel++;
            nl(); emit("ELEMENT: ");
            String eName = lName; // element name
            if ("".equals(eName)) eName = qName; // namespaceAware = false
            emit("<"+eName);
            if (attrs != null) {
                for (int i = 0; i < attrs.getLength(); i++) {
                    String aName = attrs.getLocalName(i); // Attr name 
                    if ("".equals(aName)) aName = attrs.getQName(i);
                    nl();
                    emit("   ATTR: ");
                    emit(aName);
                    emit("\t\"");
                    emit(attrs.getValue(i));
                    emit("\"");
                }
            }
            if (attrs.getLength() > 0) nl();
            emit(">");
        }    public void endElement(String namespaceURI,
                               String sName, // simple name
                               String qName  // qualified name
                              )
        throws SAXException
        {
            nl();
            emit("END_ELM: ");
            emit("</"+sName+">");
            indentLevel--;
        }    public void characters(char buf[], int offset, int len)
        throws SAXException
        {
            nl(); emit("CHARS:   ");
            String s = new String(buf, offset, len);
            if (!s.trim().equals("")) emit(s);
        }    public void ignorableWhitespace(char buf[], int offset, int len)
        throws SAXException
        {
            // Ignore it
        }    public void processingInstruction(String target, String data)
        throws SAXException
        {
            nl();
            emit("PROCESS: ");
            emit("<?"+target+" "+data+"?>");
        }    //===========================================================
        // SAX ErrorHandler methods
        //===========================================================    // treat validation errors as fatal
        public void error(SAXParseException e)
        throws SAXParseException
        {
            throw e;
        }    // dump warnings too
        public void warning(SAXParseException err)
        throws SAXParseException
        {
            System.out.println("** Warning"
                + ", line " + err.getLineNumber()
                + ", uri " + err.getSystemId());
            System.out.println("   " + err.getMessage());
        }    //===========================================================
        // LexicalEventListener methods
        //===========================================================
          
        public void comment(char[] ch, int start, int length)
        throws SAXException
        {
        }    public void startCDATA()
        throws SAXException
        {
           nl(); emit("START CDATA SECTION");
        }    public void endCDATA()
        throws SAXException
        {
           nl(); emit("END CDATA SECTION");
        }    public void startEntity(java.lang.String name)
        throws SAXException
        {
           nl(); emit("START ENTITY: "+name);
        }    public void endEntity(java.lang.String name)
        throws SAXException
        {
           nl(); emit("END ENTITY: "+name);
        }
        
        public void startDTD(String name, String publicId, String systemId)
        throws SAXException
        {
           nl(); emit("START DTD: "+name
                   +"\n           publicId=" + publicId
                   +"\n           systemId=" + systemId);
        }
        
        public void endDTD()
        throws SAXException
        {
           nl(); emit("END DTD");
        }    //===========================================================
        // Utility Methods ...
        //===========================================================    // Wrap I/O exceptions in SAX exceptions, to
        // suit handler signature requirements
        private void emit(String s)
        throws SAXException
        {
            try {
                out.write(s);
                out.flush();
            } catch (IOException e) {
                throw new SAXException("I/O error", e);
            }
        }    // Start a new line
        // and indent the next line appropriately
        private void nl()
        throws SAXException
        {
            String lineEnd =  System.getProperty("line.separator");
            try {
                out.write(lineEnd);
                for (int i=0; i < indentLevel; i++) out.write(indentString);
            } catch (IOException e) {
                throw new SAXException("I/O error", e);
            }
        }
    }
      

  3.   

    有时间可以看看教材:
    http://java.sun.com/webservices/jaxp/dist/1.1/docs/tutorial/
      

  4.   

    yuzl32(Hello!有酒醉) ,非常感谢!小弟先试试。