java - 向界面添加信息

标签 java sql servlets connection

连接.java

public interface Connect {
void commit();
void close();
void setTransactional();
void executeCommand();
}

MainApp.java

public class MainApp {
    public static void main(String[] args) {
        Connect conn=MainApp.getTransactionalConnection();
        conn.executeCommand();
        conn.executeCommand();
        conn.executeCommand();
        conn.executeCommand();
        closeConnection(conn);      
    }
    public static Connect getNormalConnection(){
        return DriverManager.getConnection(); //returns class i have no access to , dont even know its name
    }
    public static Connect getTransactionalConnection(){
        Connect conn =  getNormalConnection();
        conn.setTransactional();
        return conn;
    }
    private static void closeConnection(Connect conn) {
        //something like if connection is transactional then conn.commit();

        conn.close();
    }

}

我有大约 100 个看起来像 main() 的函数。问题是我不想更改这 100 个函数的代码,只想将 1 行 getNormalConnection 更改为 getTransactionalConnection 。我无权访问也不知道实现 Connect 接口(interface)的类的名称。我只想添加对 closeConnection() 的提交,无论是否创建了事务连接。

最佳答案

一个简单的答案是拥有自己的 Connect 实现,它要么公开 isTransactional 属性,要么在事务性时自动提交,将其他所有内容委托(delegate)给底层连接:

public class AutoCommitConnect implements Connect {
    private final Connect connect;
    private boolean transactional = false;
    private boolean committed = false;

    public AutoCommitConnect(Connect delegate) {
        this.delegate = delegate;
    }

    public void commit() {
        delegate.commit();
        committed = true;
    }

    public void setTransactional() {
        transactional = true;
        delegate.setTransactional();
    }

    public void close() {
        if (transactional && !committed) {
            commit();
        }
        delegate.close();
    }

    public void executeCommand() {
        delegate.executeCommand();
    }
}

然后更改连接返回方法来使用它:

public static Connect getNormalConnection() {
    // getTransactionalConnection will call setTransactional on the wrapper,
    // which will remember that it needs to commit
    return new AutoCommitConnect(DriverManager.getConnection());
}

关于java - 向界面添加信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20759556/

相关文章:

java - Java 的 SQL 解析器库 - 检索 SQL 语句中存在的表名列表

c# - 填充空数据表会出现 SQL 异常 "Invalid Column Name"——这没有意义?

sql - 在SQLite中选择具有最大/最小值的行

java - 从 apache tomcat 发送邮件

java - 在 token ","上出现语法错误,{预期在此 token 之后

java - Log4j 最大文件大小

java - JPA/hibernate 。如何防止自动继承字段get的类前缀

asp.net - 如何使用 IIS 授予 IIS APPPOOL\DefaultAppPool 对 Asp.net 中存储过程的访问权限?

ajax - 我不了解Servlets 3.0 API中的异步支持

java.lang.NoSuchMethodError : javax. servlet.ServletContext.getContextPath()Ljava/lang/String;