DAO方法和同步

Jam*_* P. 8 java synchronization dao jdbc

以下是我目前在抽象DAO类中使用的方法.如果有并发呼叫,它们是安全的还是应该同步使用?我知道如果存在对方法范围之外的属性的引用,则应该使用同步,但是我不清楚如何使用外部资源来处理事情.

public Connection getConnection() {
    // Call to singleton handling JDBC stuff
    return Database.getInstance().getCon();
}

public boolean isConnectionAvailable(){     
    if( getConnection() != null ){
        return true;
    }

    return false;
}

public PreparedStatement getPreparedStatement( String sqlStatement ){
    Connection connection = getConnection();
    PreparedStatement pS = null;

    if( connection != null ){
        try {
            pS = connection.prepareStatement( sqlStatement );
        } catch (SQLException e) {
            return null;
        }
    }

    return pS;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我可能会重新编写这个问题,以包含有关编写DAO的信息,因为它在这里很重要.

duf*_*ymo 13

我根本不同意这种实施方式.

首先,应通过拥有工作单位和交易的服务向DAO提供其连接信息.

其次,我没有看到界面.

第三,我没有看到模型或域对象.

第四,准备好的陈述应该只是内部实施的一部分.如果他们从你的DAO中泄漏出来,你做错了.

第五,将准备好的陈述从对象中传出,使得关闭它并清理得更不清楚.你的DAO很快就会死于资源泄漏.

这是一个通用DAO的接口.你会注意到它是所有的CRUD操作,没有提到java.sql包中的连接或任何接口:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
    T find(K id);
    List<T> find();
    List<T> find(T example);
    List<T> find(String queryName, String [] paramNames, Object [] bindValues);

    K save(T instance);
    void update(T instance);
    void delete(T instance);
}
Run Code Online (Sandbox Code Playgroud)

你可以走很长的路.这是一个更好的抽象.这T是您的业务对象类型,并且K是主键.

  • Spring有一个不错的DAO框架:http://static.springsource.org/spring/docs/2.5.x/reference/dao.html (2认同)