我在应用中使用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次的时候不再运行了,就像是死锁了。
分享到:
相关推荐
用于mvn项目中导入、导出数据库表的文件 mvn dbunit:export 导出 mvn dbunit:operation 导入
Dbunit-2.4.7.jar 文件是Dbunit的核心库,包含了所有必要的类和方法,用于在Java项目中直接使用Dbunit的功能。开发者可以将这个JAR文件添加到项目的类路径中,以便调用Dbunit的API。 LICENSE.txt 文件通常包含软件...
在Java应用程序的测试过程中,确保数据库状态的一致性是非常重要的,DBUnit 提供了这样的功能,它允许开发者导入和导出数据库数据,以进行精确的测试。 在使用 DBUnit 时,有几个必需的 Jar 包是必不可少的,这些 ...
通过深入学习这些 API,开发者可以自定义数据导入导出格式,实现与特定数据库系统的兼容,或者扩展 DBUnit 的功能。同时,结合单元测试框架(如 JUnit 或 TestNG),可以编写高效且可靠的数据库测试用例。 在实际...
在DBUnit中,我们可以创建数据的快照,即一个数据库的完整或部分镜像。这通常通过导出数据库到一个文件(如XML或CSV)来实现。导出过程中,DBUnit将根据预定义的格式(如Flat XML或Ibatis XML)将表数据转换为文本...
3. **数据集**:在DBUnit中,数据以数据集的形式存在,可以是XML文件或CSV文件。数据集定义了测试用例的数据输入和期望的输出结果。 4. **连接数据库**:DBUnit 可以与各种关系型数据库(如MySQL、Oracle、SQL ...
1. **数据导入/导出**:DBUnit可以将数据从数据库导出到XML或CSV文件,也可以将这些文件中的数据导入到数据库,这在数据迁移或备份时非常有用。 2. **数据比较**:DBUnit提供了断言机制,可以比较数据库的实际状态...
1. 数据导入导出:DbUnit 支持从XML文件导入和导出数据库数据,这样可以方便地创建和恢复数据库的特定状态。XML格式的数据集提供了结构化的数据表示,方便编写和维护。 2. 数据库操作:它提供了一系列API来填充...
7. **异常处理**:在测试过程中,如果数据导入或导出出现错误,DBUnit会抛出异常,帮助定位问题。 在给出的链接中,博主Virgoooos分享了一个具体的DBUnit使用案例,可能涉及了如何创建和使用数据集,以及如何将...
1. **DBUnit 概述**:DBUnit 提供了一套 XML 数据格式(如 FlatXML 和 IbatisXML),用于导入和导出数据库数据。它支持多种数据库,包括 Oracle、MySQL、SQL Server 等,并且与 JUnit 集成紧密,允许在测试用例执行...
DBUnit 是一个开源的 Java 库,专门用于数据库测试,它提供了一种方式来管理和操作数据库的数据,包括数据的导入导出、备份和恢复。在本文中,我们将深入探讨如何利用 DBUnit 进行数据库的备份与恢复。 首先,我们...
在IT行业中,数据库管理和数据导入导出是至关重要的任务,特别是在使用DBUnit这样的工具时。DBUnit是一款用于数据库测试的Java库,它允许开发者在测试前后对比数据库状态,确保数据处理的正确性。然而,当遇到...
DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库,它可以在...
Dbunit是一款强大的Java库,它扩展了JUnit,为数据库提供了结构化数据的导入和导出,使得测试更加方便和可靠。下面将详细介绍如何在Spring中使用Dbunit进行Dao的集成单元测试。 首先,我们需要理解集成测试的概念。...
- 在这里,`dbunit` 任务同样指定数据库连接属性,但操作类型为 `export`,将数据导出到 `data.xml` 文件中。 - `<query>` 和 `<table>` 标签用于指定要导出的特定查询和表。 3. **操作类型(Operation Types)**...
JAR文件是Java应用程序的归档文件,通常包含了编译后的类文件、资源文件以及其他必要的组件,便于开发人员在项目中直接引用。HTML文档可能包括DBUnit的用户手册、API参考或其他技术文档,帮助开发者理解如何使用这个...
DbUnit的使用通常与JUnit结合,首先需要在测试类中导入DbUnit的相关库,并配置数据库连接信息。在测试前,使用DbUnit的DatabaseConfig和DataSet来加载XML或CSV格式的测试数据到数据库。典型的流程包括:连接数据库、...
DBUnit 是一个开源的 Java 库,专门用于数据库...学习和掌握 DBUnit 能够显著提高数据库测试的效率和质量,确保应用程序在不同环境中的一致表现。对于任何处理大量数据库操作的项目,DBUnit 都是一个非常有价值的工具。
DbUnit 是一个针对数据库驱动项目的JUnit...在实际项目中,结合使用DbUnit和其他单元测试框架(如JUnit或TestNG),可以形成强大的测试解决方案,确保整个应用程序的质量,特别是在金融等对数据精确度要求极高的领域。