netrainbow 2012-03-14 00:21
浏览 261
已采纳

请教,Struts2 中对数据库连接使用单例模式

我的同事设计了在Struts2中对数据库连接使用单例模式,我问他如果连接只有一个实例,多用户下怎么办;他说Struts2可以确保多线程,我不太懂,这样设计行吗?

程序如下:
public class DatabaseInteraction {

private static Statement m_statement;
private static Connection m_connection;
private boolean m_stateConnection = false;
private boolean m_stateStatement = false;
private ProjectProperties m_databaseProperties;

private static final DatabaseInteraction INSTANCE = new DatabaseInteraction();

private DatabaseInteraction(){
    try{
        this.m_databaseProperties = ProjectProperties.getInstance();
        String sDriver = m_databaseProperties.getM_driver();
        Class.forName(sDriver);

        String url = "";
            url = "jdbc:mysql://" + m_databaseProperties.getM_hostname() + ":" + this.m_databaseProperties.getM_port() + "/" + m_databaseProperties.getM_sid() + "?"
                    + "user=" + m_databaseProperties.getM_login() + "&password=" + m_databaseProperties.getM_password() + "&autoReconnect=true&failOverReadOnly=false";
            m_connection = DriverManager.getConnection(url);

        if(m_connection != null)
            m_stateConnection = true;

        m_statement = m_connection.createStatement();

        if(m_statement != null)
            m_stateStatement = true;

    } catch (Exception e) {
        Log4jInteraction.getInstance().getLogger().error("DatabaseInteraction.DatabaseInteraction(), database wrong!\n" + e.getMessage() + "\n" + e.getStackTrace());
        //TODO:
        //INSTANCE = null;
    }
}


/*
 returnning the only object for accessing the database
 */
public static DatabaseInteraction getInstance() {
     return INSTANCE;
 }


public Object execute(String query){
    boolean bResult = false;

    try{
        bResult = m_statement.execute(query);

        if (bResult){
            return m_statement.getResultSet();
        }else{
            return new Integer(m_statement.getUpdateCount());
        }
    }
    catch (CommunicationsException ce){
        return "";
    }
    catch (SQLException e){
        Log4jInteraction.getInstance().getLogger().error("DatabaseInteraction.execute, wrong!\n" + e.getMessage() + "\n" + e.getStackTrace() + "\n");
        return e.getErrorCode() + "";
    }
}


/*
 close the database connection object
 */
public boolean close(){
    try{
        m_statement.close();
        m_connection.close();
        return true;
    }
    catch (Exception e){
        Log4jInteraction.getInstance().getLogger().error("DatabaseInteraction.close, wrong!\n" + e.getMessage() + "\n" + e.getStackTrace());
        return false;
    }
} 



// Getter and Setter
public boolean isM_stateConnection() {
    return m_stateConnection;
}

public boolean isM_stateStatement() {
    return m_stateStatement;
}

}

  • 写回答

10条回答 默认 最新

  • guazixing 2012-03-14 16:04
    关注

    我来说一点吧,这里的单例模式的代码是没有问题的。只是要看你的系统是不是适合这种用法;如果你的程序里边没有涉及到事物(数据库事物)神马的,这样写完全可以,也没有什么问题,但是如果使用了事物,那就不行了,因为事物没有办法控制了。

    从你的说法上来看(你说:Struts2 + 单例模式数据库连接),这样来说你们的系统应该没有涉及到事物,因为没有使用spring,(这年头,谁使用事物不用spring呀),所以我敢说,这样的用法在你们的系统里是没有问题的,而且在一定程度上还会提高程序的效率。还要说一点:这里没有判断链接是否可用,如果这个链接空闲时间太长,数据库服务器可能(只是可能,因为这个在数据库上是可以设置的)会关闭这个链接,如果链接被关闭的话,那就不可用了。

    至于事物这东西,如果想多了解些,就自己再google一下吧。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题