Назад | Перейти на главную страницу

Microsoft SQL постепенно увеличивает потребление оперативной памяти при использовании моего веб-сайта

Я разрабатываю веб-сайт, размещенный на Apache 8.5, который подключается к серверу Microsoft SQL с помощью Hybernate и структуры entity / dao / bean.

Когда я запускаю сервер, на котором находится MS SQL, и открываю диспетчер задач, я вижу, что он потребляет около 500 МБ ОЗУ. Затем я начинаю использовать свой веб-сайт (к которому уже обращаются некоторые клиенты компании), который часто закрывается и снова открывается, и происходит то, что потребление оперативной памяти сервера MS SQL начинает расти (сам Apache остается в порядке). Это происходит до тех пор, пока не возникнет ошибка Java Heap Space, и мне придется перезагрузить компьютер (на самом деле облачный сервер).

У меня вопрос: что могло привести к постепенному увеличению потребления оперативной памяти SQL Server?

Если с этой проблемой столкнулся Apache, я подозреваю, что произошла утечка памяти, хотя мой веб-сайт основан на Java, и сборщик мусора должен запускаться пару раз в течение 3-4 дней, пока не возникнет ошибка JHS. Но это не apache, а сам SQL сервер! Если бы мне не нужно было помещать objects = null в свой код, потому что сборщик мусора Java позаботится об освобождении памяти, нужно ли мне реализовать что-то подобное в кодах entity / dao / bean?

Вот примеры моих кодов, касающихся базы данных (обратите внимание: некоторые мелкие детали вырезаны для уменьшения размера текста):

Сущность:

@Entity
@Table(name = "BANDEIRAS", schema="dbo", catalog=Global.DATABASE_NAME
)
public class Bandeiras implements java.io.Serializable {

    private BigDecimal id;
    private String descricao;
    private Double valorKwh;

    public Bandeiras() {
    }

    public Bandeiras(BigDecimal id) {
        this.id = id;
    }

    public Bandeiras(BigDecimal id, String descricao, Double valorKwh) {
        this.id = id;
        this.descricao = descricao;
        this.valorKwh = valorKwh;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public BigDecimal getId() {
        return this.id;
    }

    public void setId(BigDecimal id) {
        this.id = id;
    }

    @Column(name = "DESCRICAO", length = 30)
    public String getDescricao() {
        return this.descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @Column(name = "VALOR_KWH", precision = 126, scale = 0)
    public Double getValorKwh() {
        return this.valorKwh;
    }

    public void setValorKwh(Double valorKwh) {
        this.valorKwh = valorKwh;
    }
}

Дао:

public class BandeirasDao implements Serializable {

    private Session session = null;
    private List<Bandeiras> list;

    public BandeirasDao() {
    }

    public List<Bandeiras> getListBandeiras() {
        try {
            session = HibernateUtil.getSessionFactory().openSession();

            session.beginTransaction();

            Criteria cri = session.createCriteria(Bandeiras.class);        
            this.list = cri.list();
        }
        catch (Exception e)
        {
            if (session.isOpen())
                session.close();
        }   

        return list;
    }

    public boolean edit(Bandeiras b) {
        boolean editado;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.update(b);
            session.getTransaction().commit();
            editado = true;

            session.close();
        } catch (Exception e) {
            editado = false;

            if (session.isOpen())
                session.close();
        }
        return editado;
    }

    public boolean create(Bandeiras b) {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.save(b);
            session.getTransaction().commit();

            session.close();

            return true;
        } catch (Exception e) {
            session.getTransaction().rollback();

            if (session.isOpen())
                session.close();

            return false;
        }
    }

    public boolean remove(Bandeiras b) {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.delete(b);
            session.getTransaction().commit();

            session.close();

            return true;
        } catch (Exception e) {
            session.getTransaction().rollback();

            if (session.isOpen())
                session.close();

            return false;
        }
    }
}

Фасоль:

@ManagedBean(name = "bandBean")
@SessionScoped
public class BandeirasBean implements Serializable {

    private Bandeiras bandeira;
    private Bandeiras novaBandeira;
    private Bandeiras auxBandeira;
    private BandeirasDao bandeiraDao;
    private ArrayList<Bandeiras> ListBandeira;
    UsuariosBean usrBean;

    public Bandeiras getAuxBandeira() {
        return auxBandeira;
    }

    public void setAuxBandeira(Bandeiras auxBandeira) {
        this.auxBandeira = auxBandeira;
    }

    public BandeirasBean() {
        this.bandeira = new Bandeiras();
        this.novaBandeira = new Bandeiras();
        this.bandeiraDao = new BandeirasDao();
    }

    public Bandeiras getBandeira() {
        return bandeira;
    }

    public void setBandeira(Bandeiras b) {
        this.bandeira = b;
    }

    public Bandeiras getNovaBandeira() {
        return novaBandeira;
    }

    public void setNovaBandeira(Bandeiras nB) {
        this.novaBandeira = nB;
    }

    public BigDecimal getId() {
        return this.bandeira.getId();
    }

    public ArrayList<Bandeiras> getListBandeiras() {
        ListBandeira = null;
        ListBandeira = new ArrayList(this.bandeiraDao.getListBandeiras());
        return ListBandeira;
    }

    public ArrayList<SelectItem> getComboListTarifas(BigDecimal empr) {
        ArrayList<Bandeiras> tmp = getListBandeiras();
        ArrayList<SelectItem> itemCombo = new ArrayList<>();

        for (Bandeiras bd : tmp) {
            SelectItem si = new SelectItem();
            si.setLabel(bd.getDescricao());
            si.setValue(bd.getId());
            itemCombo.add(si);
        }

        return itemCombo;
    }

    public Bandeiras getDadosEditBandeiras() {
        return auxBandeira;
    }

    public void getBandeirasEdit(BigDecimal id) {
        auxBandeira = null;
        auxBandeira = new Bandeiras();

        getListBandeiras();

        for (Bandeiras b : ListBandeira) {
            if (b.getId().equals(id)) {
                auxBandeira = b;
                break;
            }
        }
    }

    public void removeBandeira(BigDecimal id) {
        auxBandeira = null;
        auxBandeira = new Bandeiras();

        getListBandeiras();

        for (Bandeiras b : ListBandeira) {
            if (b.getId().equals(id)) {
                auxBandeira = b;
                break;
            }
        }

        if (this.bandeiraDao.remove(auxBandeira)) {
            String correctText = "Bandeira excluída com sucesso";

            FacesContext.getCurrentInstance().addMessage(
                    "datatable_form:hiddenInput",
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                            correctText, ""));

            auxBandeira = null;
        } else {
            String correctText = "Erro na remoção da bandeira";

            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_WARN,
                            correctText, ""));

            auxBandeira = null;
        }
    }

    public void editBandeira(String hidden_info)
    {
        try{
            if(new BandeirasDao().edit(this.auxBandeira)){
                String correctText;

                FacesContext.getCurrentInstance().addMessage(
                        hidden_info,
                        new FacesMessage(FacesMessage.SEVERITY_INFO,
                        correctText, " "));
            }
            else{
                String correctText;

                FacesContext.getCurrentInstance().addMessage(
                        hidden_info,
                        new FacesMessage(FacesMessage.SEVERITY_INFO,
                        correctText, " "));
            }
        }
        catch(Exception e){
            //this.auxBandeira = new Bandeiras();
        }    
        finally{
            //this.auxBandeira = new Bandeiras();
        }
    }

    public String criaTarifa(String page) {
        //BigDecimal emp = new BigDecimal(idEmp);
        //EmpresasDao eprsa = new EmpresasDao();
        //novaBandeira.setEmpresas(eprsa.getUser(emp));
        if (this.bandeiraDao.create(novaBandeira)) {
            String correctText;

            FacesContext.getCurrentInstance().addMessage(
                    "datatable_form:hiddenInput",
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                            correctText, ""));
            novaBandeira = new Bandeiras();
            return page;
        } else {
            String correctText;

            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_WARN,
                            correctText, ""));
            novaBandeira = new Bandeiras();

            return page;
        }
    }

    public String editTarifa(Bandeiras b, String page) {
        if (this.bandeiraDao.edit(b)) {
            String correctText;

            FacesContext.getCurrentInstance().addMessage(
                    "datatable_form:hiddenInput",
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                            correctText, ""));
            return page;
        } else {
            String correctText;

            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_WARN,
                            correctText, ""));
            return page;
        }
    }

    public UsuariosBean getUsrBean() {
        return usrBean;
    }

    public void setUsrBean(UsuariosBean usrBean) {
        this.usrBean = usrBean;
    }
}

Это нормальное поведение движка MS SQL Server: он использует всю оперативную память, которую мы позволяем использовать для кэширования.

вы можете ограничить это простой конфигурацией:

  • подключиться к экземпляру с помощью SQL Management Studio
  • щелкните правой кнопкой мыши имя экземпляра / Свойства
  • в объем памяти вкладку, вы можете установить максимальная память сервера значение, чтобы позволить достаточно памяти для системы и вашего приложения

Шаги подробно описаны Вот

С Уважением,