No operations allowed after statement closed

风格不统一 提交于 2019-11-30 15:54:14

Create a Utility class for connection management to manage it at single point in whole application.

Don't load the DataSource every time you need a new connection.

Sample code:

public class ConnectionUtil {

    private DataSource dataSource;

    private static ConnectionUtil instance = new ConnectionUtil();

    private ConnectionUtil() {
        try {
            Context initContext = new InitialContext();
            dataSource = (DataSource) initContext.lookup("JNDI_LOOKUP_NAME");
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    public static ConnectionUtil getInstance() {
        return instance;
    }

    public Connection getConnection() throws SQLException {
        Connection connection = dataSource.getConnection();
        return connection;
    }

    public void close(Connection connection) throws SQLException {
        if (connection != null && !connection.isClosed()) {
            connection.close();
        }
        connection = null;
    }

}

Always close the connection and handle it in try-catch-finally

        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = ConnectionUtil.getInstance().getConnection();

            ...
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                ConnectionUtil.getInstance().close(conn);
            }
        }

statement is static, so it's shared among instances (and threads). One thread is probably trying to use that object after another one has closed it.

It is generally a bad idea to share database connections and statements between threads since JDBC does not require connections to be thread-safe.

faizan ahmad

It may be because of you are using the same prepared statement for two different methods and you close(pst.close()) the statement in one method and still try to use same statement in another method.

To solve this, get a new connection in a code block you are facing this error and then use statement.

One thing more if you are using same statement for two different methods and if you do not close statement in any method then you may get this error:

Parameter index out of range (2 > number of parameters, which is 1).

because of same statement . So try to get separate connection and statement for block of code and then close the connection and statement.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!