Я разрабатываю веб-сайт, размещенный на 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: он использует всю оперативную память, которую мы позволяем использовать для кэширования.
вы можете ограничить это простой конфигурацией:
Шаги подробно описаны Вот
С Уважением,