0

我正在使用以下代码为我的简单 jsp/servlet 登录项目(即单例)连接到数据库。当我第一次登录时,它在我成功注销后工作。现在问题开始了,当我再次尝试登录时出现错误提示“严重:错误消息:连接关闭后不允许操作。” 但是,当我删除代码关闭连接时,它又可以正常工作了。请建议我应该使用它还是避免它。

public class ConnectionMgr {

    private static ConnectionMgr instance = null;

    private static final String USERNAME = "root";
    private static final String PASSWORD = "";
    private static final String M_CONN_STRING = "jdbc:mysql://localhost:3306/generator";
    private static final String H_CONN_STRING = "jdbc:hsqldb:data/generator";

    private DBType dbType = DBType.MYSQL;

    private Connection conn = null;


    private ConnectionMgr() {
    }

    public static ConnectionMgr getInstance() {
        if (instance == null) {
            instance = new ConnectionMgr();
        }
        return instance;
    }

    public void setDBType(DBType dbType) {
        this.dbType = dbType;
    }

    private boolean openConnection() {
        try {
            switch (dbType) {

                case MYSQL:
                    Class.forName("com.mysql.jdbc.Driver");
                    conn = DriverManager.getConnection(M_CONN_STRING, USERNAME, PASSWORD);
                    return true;

                case HSQL:
                    conn = DriverManager.getConnection(H_CONN_STRING, USERNAME, PASSWORD);
                    return true;

                default:
                    return false;
            }
        } catch (SQLException | ClassNotFoundException e) {
            System.err.println(e);
            DBUtil.processException((SQLException) e);
            return false;
        }
    }

    public Connection getConnection() {
        if (conn == null) {
            if (openConnection()) {
                System.out.println("Connection opened");
                return conn;
            } else {
                return null;
            }
        }
        return conn;
    }

    public void processException(SQLException e) {
        System.err.println("Silgleton connection()Error -->");
        System.err.println("Erroe message:" + e.getMessage());
        System.err.println("Error code:" + e.getErrorCode());
        System.err.println("Error State:" + e.getSQLState());
    }

    public void close() {
        System.out.println("Closing connection");
        try {
            conn.close();
            conn = null;
        } catch (Exception e) {
        }
    }
}
4

2 回答 2

1

您的连接管理器不是线程安全的。因此,当一个用户尝试使用单个实例读取数据时,另一个用户的线程可能最终会关闭正在使用的连接。

而是使用类似Apache DBCP的东西,它也会给你一个连接池。

如果您仍想使用上面的代码,请将连接管理器更改为常规对象而不是单例。

于 2015-06-15T17:32:30.167 回答
0

您可能正在保存对第一个请求的“连接”实例的引用,然后将该引用重新用于您的第二个请求。

尝试确保getConnection()每次有新请求到达 servlet 时都在调用。

在 ConnectionMgr 类的所有方法中添加一个System.out.println("your-method-name-")

于 2015-06-15T17:47:43.183 回答