Java / JDBC: El mejor patrón de diseño para cerrar la conexión de base de datos cuando se produce una excepción

Soy nuevo en Java (estoy usando Java 6). He estado utilizando el siguiente patrón de diseño para todos mis POJOs de Java y servlets para acceder a una base de datos Oracle 11G a través del servidor web GlassFish 3.1.2.

Recibo un error de la base de datos intermitente (ORA-12519) cuando se consumen todos los procesos disponibles (o sesiones, no estoy seguro de cuál es la diferencia), lo que me lleva a pensar de alguna manera que la aplicación no está liberando los procesos.

Mirando el patrón de diseño a continuación, ¿hay una mejor manera de asegurarse de que la conexión JDBC a la base de datos se libere en caso de una excepción? Por ejemplo, ¿también debería colocar elif ( conn != null) conn.close(); código DENTRO del bloque catch? O, ¿hay un patrón de diseño mejor? Gracias de antemano por cualquier comentario / sugerencias.

public String MyFunction() throws Exception {     

    Connection conn;
    CallableStatement cs;

  try {

      Context context = new InitialContext();
      DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
      conn = ds.getConnection();        

      cs = conn.prepareCall( "{call my_sproc (?)}" );

      cs.registerOutParameter(1, Types.VARCHAR);

      cs.execute();

      String outParam = cs.getString(1); 

      if ( conn != null )  // close connection
         conn.close();

  } catch (Exception e) {
      outParam = "an error occurred";
  }
    return outparam;
}