日期:2014-05-18  浏览次数:20869 次

SAX解析导入数据库,郁闷了两周~代码分享中
需求是这样的,从一个包含一个或多个表记录的XML中读取数据,插入到其对应的数据库表中,如果数据库有这条记录,则更新,没有的话做插入,执行下来效率很低,首先2000条速度还可以,但是一到后面就会很慢慢,过了一阵子又恢复一下,我怀疑是代码内存没有释放好,请大家帮忙看看~~!
public   void   startDocument()   throws   SAXException   {
str   =   new   StringBuffer();
conn   =   connect.getConnection();
try   {
conn.setAutoCommit(false);
}   catch   (SQLException   e)   {
//   TODO   Auto-generated   catch   block
e.printStackTrace();
}
}
public   void   processingInstruction(String   taget,   String   data)   throws   SAXException   {

}

public   void   startElement(String   uri,   String   localName,   String   qName,   Attributes   attr)   throws   SAXException   {

if( "TABLE ".equals(qName))//如果是TABLE这个标记开头的,证明是一条记录的开始
{
for(int   i   =   0;i <attr.getLength();i++)
{
tableName   =   attr.getValue(i); //将表名读出来

}

if(adm!=null)
{
  MARKISNEW =adm.getMARKISNEW();
  DELETEON   =   adm.getDELETEON();
  TMPDATA   =   adm.getTMPDATA();
}
sql.append(tableName   +   "   values( ");//将前半段SQL语句组织好
if(!table.equals(tableName))//table用来保存表名,如果table这个变量的值与表名不一致,证明是另一张表需要重新查一次主键列
{
sql1.append( "select   *   from   syscolumns   where   id=object_id( ' "+   tableName   +   " ') ");
rs1   =   connect.executeQuery(sql1.toString());
try   {
    rs1.last();
                            int   row   =   rs1.getRow();
                            column   =   new   String[row];//new一个行数大小的数组
                            rs1.beforeFirst();//把游标置到最顶端,不然用while循环将取不到任何数据,因为前面已经把游标放到最后了
                           
                            while(rs1.next())//做循环
                                    {
                            for(int   i=0;i <row;i++)
                                    {
                            column[i]   =   rs1.getString( "name ");//把每一列的列名存到数组中
                            tableid   =   rs1.getString( "id ");
                            rs1.next();
    &n