`
pub10
  • 浏览: 2686 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

dbunit 在系统应用(文件导入和导出)中的资源释放问题

阅读更多
我在应用中使用dbunit做文件的导入和导出功能,现在导入和导出功能都能很好的实现,但是有一个资源释放的问题,一直都没找着原因,现把代码贴出来,望同志们发表高见。
public abstract class BaseImportor extends AbstractStep implements Importor {
    private final static Log log = LogFactory.getLog(BaseImportor.class);
    
    private static final String batchID = "http://www.dbunit.org/features/batchedStatements";
    private static DataSource ds;
    
    protected IDataSet srcDataSet;

    protected String _type = TYPE_CLEAN_INSERT;
    private boolean _transaction = false;
    private DatabaseOperation _operation;
    protected boolean _forwardOperation = true;
    
    /**
     * 通过spring注射dataSource
     * @param dataSource
     */
    public final void setDataSource(final DataSource dataSource){
    	ds = dataSource;
    }
    public BaseImportor() {
        
    }
    /**
     * 获取连接
     * @return
     * @throws DatabaseUnitException
     */
    protected IDatabaseConnection getConnection() throws DatabaseUnitException{
    	IDatabaseConnection iDataBaseConnection = null;
		try {
			String schema = ds.getConnection().getMetaData().getUserName();
			iDataBaseConnection = new DatabaseConnection(ds.getConnection(), schema);
			DatabaseConfig config = iDataBaseConnection.getConfig();
			if (!config.getFeature(batchID)) {
			    config.setFeature(batchID, true);
			}
			log.debug("get database connection with schema '"+schema+"'");
		} catch (SQLException e) {
			log.error(e);
			throw new DatabaseUnitException(e);
		}
        return iDataBaseConnection;
    }

    public String getType()
    {
        return _type;
    }

    public DatabaseOperation getDbOperation()
    {
        return _operation;
    }

    public boolean isTransaction()
    {
        return _transaction;
    }
    /**
     * 设置操作类型
     */
    public void setType(String type)
    {
        if (TYPE_UPDATE.equals(type))
        {
            _operation = DatabaseOperation.UPDATE;
            _forwardOperation = true;
        }
        else if (TYPE_INSERT.equals(type))
        {
            _operation = DatabaseOperation.INSERT;
            _forwardOperation = true;
        }
        else if (TYPE_REFRESH.equals(type))
        {
            _operation = DatabaseOperation.REFRESH;
            _forwardOperation = true;
        }
        else if (TYPE_DELETE.equals(type))
        {
            _operation = DatabaseOperation.DELETE;
            _forwardOperation = false;
        }
        else if (TYPE_DELETE_ALL.equals(type))
        {
            _operation = DatabaseOperation.DELETE_ALL;
            _forwardOperation = false;
        }
        else if (TYPE_CLEAN_INSERT.equals(type))
        {
            _operation = DatabaseOperation.CLEAN_INSERT;
            _forwardOperation = false;
        }
        else if (TYPE_NONE.equals(type))
        {
            _operation = DatabaseOperation.NONE;
            _forwardOperation = true;
        }
        else if (TYPE_MSSQL_CLEAN_INSERT.equals(type))
        {
            _operation = InsertIdentityOperation.CLEAN_INSERT;
            _forwardOperation = false;
        }
        else if (TYPE_MSSQL_INSERT.equals(type))
        {
            _operation = InsertIdentityOperation.INSERT;
            _forwardOperation = true;
        }
        else if (TYPE_MSSQL_REFRESH.equals(type))
        {
            _operation = InsertIdentityOperation.REFRESH;
            _forwardOperation = true;
        }
        else
        {
            throw new IllegalArgumentException("Type must be one of: UPDATE, INSERT,"
                    + " REFRESH, DELETE, DELETE_ALL, CLEAN_INSERT, MSSQL_INSERT, "
                    + " or MSSQL_REFRESH but was: " + type);
        }
        _type = type;
    }


    public void setTransaction(boolean transaction)
    {
        _transaction = transaction;
    }

    public void execute(IDatabaseConnection connection) throws DatabaseUnitException
    {
        if (_operation == null)
        {
            throw new DatabaseUnitException("Inputor.execute(): setType(String) must be called before execute()!");
        }

        if (_operation == DatabaseOperation.NONE)
        {
            return;
        }

        try
        {
        	DatabaseOperation operation = (_transaction ? new TransactionOperation(_operation) : _operation);
            operation.execute(connection, getSrcDataSet());
        }
        catch (SQLException e)
        {
            throw new DatabaseUnitException(e);
        }finally{
			try {
				connection.close();
			} catch (Exception e) {	}
			finally{connection = null;}//显示关闭连接
		}
    }

    public String getLogMessage()
    {
        return "";
    }
    
    public abstract IDataSet getSrcDataSet();
    



}

public class ExcelImportor extends BaseImportor{
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(ExcelImportor.class);

	private InputStream inputStream;
	
	/* (非 Javadoc)
	 * @see com.harmony.ioput.BaseInputor#getSrcDataSet()
	 */
	@Override
	public IDataSet getSrcDataSet(){
		// TODO
		IDataSet dataSet = null;
		try {
			if(inputStream != null){
				dataSet = new XlsDataSet(inputStream);

			}else{
				throw new IllegalArgumentException("请在file和inputStream中选择一种数据源");
			}
		} catch (DataSetException e) {
			logger.error(e);
			throw new DatabaseUnitRuntimeException(e);
		} catch (IOException e) {
			logger.error(e);
			throw new RuntimeException(e);
		}finally{
			try{//释放资源
				inputStream.close();
			}catch(Exception e){}finally{
				inputStream = null;
			}
		}
		return dataSet;
	}

	/* (非 Javadoc)
	 * @see com.harmony.ioput.Inputor#setFile(java.io.File)
	 */
	public void setFile(File src) {
		try {
			this.inputStream = new FileInputStream(src);
		} catch (FileNotFoundException e) {
			throw new IllegalArgumentException(e);
		}

	}

	/* (非 Javadoc)
	 * @see com.harmony.ioput.Inputor#setInputStream(java.io.InputStream)
	 */
	public void setInputStream(InputStream in) {
		this.inputStream = in;
	}

	/**
	 * @return inputStream
	 */
	public InputStream getInputStream() {
		return inputStream;
	}
	/**
	 * 执行导入操作
	 */
	public void execute() {
		try {
			super.execute(getConnection());
		} catch (DatabaseUnitException e) {
			logger.error(e);
			throw new DatabaseUnitRuntimeException(e);
		}
		
	}

}

在代码中,我都有显示的释放connection和关闭inputstrean,但是为什么程序运行到第8次的时候不再运行了,就像是死锁了。
分享到:
评论
1 楼 pub10 2008-04-25  
问题已解决,都是编程不小心造成的。
    protected IDatabaseConnection getConnection() throws DatabaseUnitException{
    	IDatabaseConnection iDataBaseConnection = null;
		try {
			Connection _connection = ds.getConnection();
			String schema = _connection.getMetaData().getUserName();
			iDataBaseConnection = new DatabaseConnection(_connection, schema);
			DatabaseConfig config = iDataBaseConnection.getConfig();
			if (!config.getFeature(batchID)) {
			    config.setFeature(batchID, true);
			}
			log.debug("get database connection with schema '"+schema+"'");
		} catch (SQLException e) {
			log.error(e);
			throw new DatabaseUnitException(e);
		}
        return iDataBaseConnection;
    }

相关推荐

    用于导入导出项目中数据库表的文件pom.xml

    用于mvn项目中导入、导出数据库表的文件 mvn dbunit:export 导出 mvn dbunit:operation 导入

    Dbunit数据库连接下载

    Dbunit-2.4.7.jar 文件是Dbunit的核心库,包含了所有必要的类和方法,用于在Java项目中直接使用Dbunit的功能。开发者可以将这个JAR文件添加到项目的类路径中,以便调用Dbunit的API。 LICENSE.txt 文件通常包含软件...

    dbunit使用必需Jar包

    在Java应用程序的测试过程中,确保数据库状态的一致性是非常重要的,DBUnit 提供了这样的功能,它允许开发者导入和导出数据库数据,以进行精确的测试。 在使用 DBUnit 时,有几个必需的 Jar 包是必不可少的,这些 ...

    dbunit-2.4.9 源码

    通过深入学习这些 API,开发者可以自定义数据导入导出格式,实现与特定数据库系统的兼容,或者扩展 DBUnit 的功能。同时,结合单元测试框架(如 JUnit 或 TestNG),可以编写高效且可靠的数据库测试用例。 在实际...

    DBUnit最佳实践之数据备份与恢复

    在DBUnit中,我们可以创建数据的快照,即一个数据库的完整或部分镜像。这通常通过导出数据库到一个文件(如XML或CSV)来实现。导出过程中,DBUnit将根据预定义的格式(如Flat XML或Ibatis XML)将表数据转换为文本...

    dbunit2.2

    3. **数据集**:在DBUnit中,数据以数据集的形式存在,可以是XML文件或CSV文件。数据集定义了测试用例的数据输入和期望的输出结果。 4. **连接数据库**:DBUnit 可以与各种关系型数据库(如MySQL、Oracle、SQL ...

    dbunit帮助文档(HTML版)

    1. **数据导入/导出**:DBUnit可以将数据从数据库导出到XML或CSV文件,也可以将这些文件中的数据导入到数据库,这在数据迁移或备份时非常有用。 2. **数据比较**:DBUnit提供了断言机制,可以比较数据库的实际状态...

    dbunit-2.2.3-prj.rar_DbUnit 2.2_dbunit_单元测试

    1. 数据导入导出:DbUnit 支持从XML文件导入和导出数据库数据,这样可以方便地创建和恢复数据库的特定状态。XML格式的数据集提供了结构化的数据表示,方便编写和维护。 2. 数据库操作:它提供了一系列API来填充...

    DBUnit 进行单元测试

    7. **异常处理**:在测试过程中,如果数据导入或导出出现错误,DBUnit会抛出异常,帮助定位问题。 在给出的链接中,博主Virgoooos分享了一个具体的DBUnit使用案例,可能涉及了如何创建和使用数据集,以及如何将...

    dbunit测试demo

    1. **DBUnit 概述**:DBUnit 提供了一套 XML 数据格式(如 FlatXML 和 IbatisXML),用于导入和导出数据库数据。它支持多种数据库,包括 Oracle、MySQL、SQL Server 等,并且与 JUnit 集成紧密,允许在测试用例执行...

    如何使用DBUnit做数据备份恢复

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它提供了一种方式来管理和操作数据库的数据,包括数据的导入导出、备份和恢复。在本文中,我们将深入探讨如何利用 DBUnit 进行数据库的备份与恢复。 首先,我们...

    DBUnit导数据报表名超长和MBCS字段被截断日志

    在IT行业中,数据库管理和数据导入导出是至关重要的任务,特别是在使用DBUnit这样的工具时。DBUnit是一款用于数据库测试的Java库,它允许开发者在测试前后对比数据库状态,确保数据处理的正确性。然而,当遇到...

    DBUNIT使用

    DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库,它可以在...

    主题:在Spring中结合Dbunit对Dao进行集成单元测试

    Dbunit是一款强大的Java库,它扩展了JUnit,为数据库提供了结构化数据的导入和导出,使得测试更加方便和可靠。下面将详细介绍如何在Spring中使用Dbunit进行Dao的集成单元测试。 首先,我们需要理解集成测试的概念。...

    DBUnit使用文档

    - 在这里,`dbunit` 任务同样指定数据库连接属性,但操作类型为 `export`,将数据导出到 `data.xml` 文件中。 - `<query>` 和 `<table>` 标签用于指定要导出的特定查询和表。 3. **操作类型(Operation Types)**...

    dbunit_jar_and_htmldoc

    JAR文件是Java应用程序的归档文件,通常包含了编译后的类文件、资源文件以及其他必要的组件,便于开发人员在项目中直接引用。HTML文档可能包括DBUnit的用户手册、API参考或其他技术文档,帮助开发者理解如何使用这个...

    单元测试JUnit4和DbUnit

    DbUnit的使用通常与JUnit结合,首先需要在测试类中导入DbUnit的相关库,并配置数据库连接信息。在测试前,使用DbUnit的DatabaseConfig和DataSet来加载XML或CSV格式的测试数据到数据库。典型的流程包括:连接数据库、...

    dbunit-2.4.7所有jar以及dbunit入门教程

    DBUnit 是一个开源的 Java 库,专门用于数据库...学习和掌握 DBUnit 能够显著提高数据库测试的效率和质量,确保应用程序在不同环境中的一致表现。对于任何处理大量数据库操作的项目,DBUnit 都是一个非常有价值的工具。

    介绍dbunit的使用和原理,核心组件介绍

    DbUnit 是一个针对数据库驱动项目的JUnit...在实际项目中,结合使用DbUnit和其他单元测试框架(如JUnit或TestNG),可以形成强大的测试解决方案,确保整个应用程序的质量,特别是在金融等对数据精确度要求极高的领域。

Global site tag (gtag.js) - Google Analytics