I am getting the Exception with the signature No operations allowed after statement closed.
inside my Java code where I am trying to insert values into the data
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.
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.
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);
}
}