Autor
Mensagem
Galera!, pode ser que o assunto seja ou esteja meio repetitivo, mas pelo menos aqui, ainda nao foi solucionado, entao peço encarecidamente a ajuda de voces...
É o seguinte, tenho uma aplicacao (JSF+JPA+hibernate, com MySQL server 5.0 com servidor GlassFish),
que tem uma configuração de conexao (Factory) assim:
public HibernateUtil(){
sessionFactory = new AnnotationConfiguration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver")
.setProperty("hibernate.connection.url","jdbc:mysql://localhost:3306/apollo")
.setProperty("hibernate.connection.username","root")
.setProperty("hibernate.connection.password","*******")
.setProperty("hibernate.hbm2dll.auto","none")
.setProperty("hibernate.show_sql","true")
.setProperty("hibernate.format_sql","true")
.setProperty("hibernate.c3p0.acquire_increment","2")
sessionFactory = new AnnotationConfiguration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver")
.setProperty("hibernate.connection.url","jdbc:mysql://localhost:3306/apollo")
.setProperty("hibernate.connection.username","root")
.setProperty("hibernate.connection.password","*******")
.setProperty("hibernate.hbm2dll.auto","none")
.setProperty("hibernate.show_sql","true")
.setProperty("hibernate.format_sql","true")
.setProperty("hibernate.c3p0.acquire_increment","2")
.setProperty("hibernate.c3p0.idle_test_period","50")
.setProperty("hibernate.c3p0.max_size","20") //antes 1000
.setProperty("hibernate.c3p0.max_statements","100") //ULTIMA ALTERAO SAO OS VALORES DE 1000, isso porque dava um erro de processamento apos N instancia no servidor//
.setProperty("hibernate.c3p0.min_size","1")
.setProperty("hibernate.c3p0.timout","1800")
.setProperty("hibernate.c3p0.validate", "true")
.setProperty("hibernate.c3p0.maxIdleTimeExcessConnections", "10")
.setProperty("transaction.factory_class","org.hibernate.transaction.JDBCTransactionFactory")
.setProperty("current_session_context_class", "thread")
.setProperty("hibernate.c3p0.max_size","20") //antes 1000
.setProperty("hibernate.c3p0.max_statements","100") //ULTIMA ALTERAO SAO OS VALORES DE 1000, isso porque dava um erro de processamento apos N instancia no servidor//
.setProperty("hibernate.c3p0.min_size","1")
.setProperty("hibernate.c3p0.timout","1800")
.setProperty("hibernate.c3p0.validate", "true")
.setProperty("hibernate.c3p0.maxIdleTimeExcessConnections", "10")
.setProperty("transaction.factory_class","org.hibernate.transaction.JDBCTransactionFactory")
.setProperty("current_session_context_class", "thread")
----------------------
O PROBLEMA, :
---------------------
é que ao chegar nas "20" conexoes (ou 1000 como estava antes , na linha em destaque...), a conexao cai, o sistema nao vai nem a pa.........
Já tentei de tudo, alguem tem uma luz??? Pra vcs falta alguma propriedade a ser configurada?
Grato.
olhem só...
public HibernateUtil(){
sessionFactory = new AnnotationConfiguration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver")
.setProperty("hibernate.connection.url","jdbc:mysql://localhost:3306/apollo")
.setProperty("hibernate.connection.username","root")
.setProperty("hibernate.connection.password","*****")
.setProperty("hibernate.hbm2dll.auto","none")
.setProperty("hibernate.show_sql","true")
.setProperty("hibernate.format_sql","true")
.setProperty("hibernate.c3p0.acquire_increment","2")
.setProperty("hibernate.c3p0.idle_test_period","50")
.setProperty("hibernate.c3p0.max_size","20")
.buildSessionFactory();
public Session getSession(){
Session toReturn = sessionFactory.openSession();
toReturn.beginTransaction();
return toReturn;
}
/*Inicia (Start) to Hibernate*/
public static HibernateUtil getInstance(){
if (me==null){
me = new HibernateUtil();
HibernateUtil.java
------------------------
public class HibernateUtil implements java.io.Serializable{
private static final long serialVersionUID =1L;
private static HibernateUtil me;
private SessionFactory sessionFactory;
private static HibernateUtil me;
private SessionFactory sessionFactory;
public HibernateUtil(){
sessionFactory = new AnnotationConfiguration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver")
.setProperty("hibernate.connection.url","jdbc:mysql://localhost:3306/apollo")
.setProperty("hibernate.connection.username","root")
.setProperty("hibernate.connection.password","*****")
.setProperty("hibernate.hbm2dll.auto","none")
.setProperty("hibernate.show_sql","true")
.setProperty("hibernate.format_sql","true")
.setProperty("hibernate.c3p0.acquire_increment","2")
.setProperty("hibernate.c3p0.idle_test_period","50")
.setProperty("hibernate.c3p0.max_size","20")
.setProperty("hibernate.c3p0.max_statements","0")
.setProperty("hibernate.c3p0.min_size","1")
.setProperty("hibernate.c3p0.timout","1800")
.setProperty("hibernate.c3p0.min_size","1")
.setProperty("hibernate.c3p0.timout","1800")
.setProperty("hibernate.c3p0.validate", "true")
.setProperty("hibernate.c3p0.maxIdleTimeExcessConnections", "10")
.setProperty("transaction.factory_class","org.hibernate.transaction.JDBCTransactionFactory")
.setProperty("current_session_context_class", "thread")
.setProperty("hibernate.c3p0.maxIdleTimeExcessConnections", "10")
.setProperty("transaction.factory_class","org.hibernate.transaction.JDBCTransactionFactory")
.setProperty("current_session_context_class", "thread")
..
... minhas classes anotadas aqui...(certinho)
.buildSessionFactory();
}
public Session getSession(){
Session toReturn = sessionFactory.openSession();
toReturn.beginTransaction();
return toReturn;
}
/*Inicia (Start) to Hibernate*/
public static HibernateUtil getInstance(){
if (me==null){
me = new HibernateUtil();
}
return(me);
}
}
return(me);
}
}
-----------------------------------------------------------------------------------
E a cada manipulacao dos meus DAO's , uso um GenericDAO
-----------------------------------------------------------------------------------
public abstract class GenericDAO {
private static final long serialVersionUID = 1L;
protected boolean atualizar;
protected boolean atualizar;
protected Session getSession() {
return HibernateUtil.getInstance().getSession();
}
return HibernateUtil.getInstance().getSession();
}
protected void saveOrUpdatePojo(Serializable pojo) {
Object classe = pojo.getClass().getName();
Object classe = pojo.getClass().getName();
int setor = Integer.parseInt(jcUtil.getSessao("posto").toString());
int usuario = Integer.parseInt(jcUtil.getSessao("usuario").toString());
String hist;
int usuario = Integer.parseInt(jcUtil.getSessao("usuario").toString());
String hist;
classe = classe.toString().replace("com.Bean.", "");
Session ses = getSession();
ses.saveOrUpdate(pojo);
ses.getTransaction().commit();
ses.refresh(pojo);
ses.close();
ses.saveOrUpdate(pojo);
ses.getTransaction().commit();
ses.refresh(pojo);
ses.close();
Object reg = pojo.toString();
if (isAtualizar()) {
hist = "Alterou um registro na tabela: " + classe + ". Registro: " + reg;
} else {
hist = "Inseriu um registro na tabela: " + classe + ". Registro: " + reg;
}
adicionarLog(setor, usuario, hist);
}
hist = "Alterou um registro na tabela: " + classe + ". Registro: " + reg;
} else {
hist = "Inseriu um registro na tabela: " + classe + ". Registro: " + reg;
}
adicionarLog(setor, usuario, hist);
}
protected <T extends Serializable> T getPojo(Class<T> classToSearch, Serializable key) {
Session ses = getSession();
Serializable toReturn = (Serializable) ses.get(classToSearch, key);
ses.getTransaction().commit();
ses.close();
return (T) toReturn;
}
Session ses = getSession();
Serializable toReturn = (Serializable) ses.get(classToSearch, key);
ses.getTransaction().commit();
ses.close();
return (T) toReturn;
}
protected void removePojo(Serializable pojoToRemove) {
Object classe = pojoToRemove.getClass().getName();
Object reg = pojoToRemove.toString();
Object classe = pojoToRemove.getClass().getName();
Object reg = pojoToRemove.toString();
int setor = Integer.parseInt(jcUtil.getSessao("posto").toString());
int usuario = Integer.parseInt(jcUtil.getSessao("usuario").toString());
String hist;
int usuario = Integer.parseInt(jcUtil.getSessao("usuario").toString());
String hist;
classe = classe.toString().replace("com.Bean.", "");
hist = "Apagou um registro na tabela: " + classe + ". Registro: " + reg;
Session ses = getSession();
ses.delete(pojoToRemove);
hist = "Apagou um registro na tabela: " + classe + ". Registro: " + reg;
Session ses = getSession();
ses.delete(pojoToRemove);
ses.getTransaction().commit();
ses.close();
ses.close();
adicionarLog(setor, usuario, hist);
}
}
protected <T extends Serializable> List<T> getPureList(Class<T> classtoCast, String query, Object... params) {
Session ses = getSession();
Query qr = ses.createQuery(query);
for (int i = 1; i <= params.length; i++) {
qr.setParameter(i, params[i - 1]);
}
Session ses = getSession();
Query qr = ses.createQuery(query);
for (int i = 1; i <= params.length; i++) {
qr.setParameter(i, params[i - 1]);
}
está ai....Dyego...Abracos
@SuppressWarnings("unchecked")
List<T> toReturn = qr.list();
@SuppressWarnings("unchecked")
List<T> toReturn = qr.list();
ses.getTransaction().commit();
ses.close();
ses.close();
return toReturn;
}
}
protected Serializable getPurePojo(String query, Object... params) {
Session ses = getSession();
Query qr = ses.createQuery(query);
for (int i = 1; i <= params.length; i++) {
qr.setParameter(i, params[i - 1]);
}
Object toReturn = qr.uniqueResult();
Session ses = getSession();
Query qr = ses.createQuery(query);
for (int i = 1; i <= params.length; i++) {
qr.setParameter(i, params[i - 1]);
}
Object toReturn = qr.uniqueResult();
ses.getTransaction().commit();
ses.close();
ses.close();
return (Serializable) toReturn;
}
}
protected void adicionarLog(int posto, int usuario, String historico) {
Session ses = getSession();
Session ses = getSession();
try {
Date data = new Date();
Calendar cal = Calendar.getInstance();
String hora = cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND);
Date data = new Date();
Calendar cal = Calendar.getInstance();
String hora = cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND);
Auditoria aud = new Auditoria(posto, usuario);
aud.setAudData(data);
aud.setAudHora(hora);
aud.setAudHistorico(historico);
aud.setAudData(data);
aud.setAudHora(hora);
aud.setAudHistorico(historico);
ses.save(aud);
} finally {
ses.getTransaction().commit();
ses.close();
setAtualizar(false);
}
} finally {
ses.getTransaction().commit();
ses.close();
setAtualizar(false);
}
}
protected boolean isAtualizar() {
return atualizar;
}
protected boolean isAtualizar() {
return atualizar;
}
protected void setAtualizar(boolean atualizar) {
this.atualizar = atualizar;
}
this.atualizar = atualizar;
}
protected Object jaExiste(String classe, String clausula) {
Session ses = getSession();
Session ses = getSession();
try {
Query q = ses.createQuery("SELECT obj FROM "+classe+" obj WHERE "+clausula);
return q.uniqueResult();
} finally {
ses.close();
}
}
}
Query q = ses.createQuery("SELECT obj FROM "+classe+" obj WHERE "+clausula);
return q.uniqueResult();
} finally {
ses.close();
}
}
}
E... continuando pelo que vejo, ao realizar uma consulta abre uma nova conexao...
ao inserir abre outra conexao.. e assim por diante...
o sistema esta abrindo uma conexao pra cada manipulacao no banco...
ou seja a propriedade timout nao é o problema...
(já aumentei ou reduzi.. e o problema continua)
eu acho q está relacionado , da maneira q esta a conexao (getInstance) e (ou) a propriedade selecionada:
.setProperty("hibernate.c3p0.max_size","20")
pois ao alcancar a 20a. (vigesima) conexao.. o sistema cai... (trava)....
e assim por diante...
alguem viu algo de errado no meu codigo (factory)??
Ola, grande Dyego!...
Entao, de acordo com o código do meu GenericDAO, ele já não está fechando a cada Session?, dá um olhadinha, pois só estou fechando por lá...
OU seja meu GenericDao , pega o session criado pelo Hibernate, usa-o, e fecha a cada ses.close() ,
não seria isso?
Sim é MYSQL server 5.1 Community
Na primeira tela, já disparando várias conexoes...
10, 'root', 'localhost:53375', 'requisicao', 'Sleep', 392, '', ''
13, 'root', 'localhost:53390', 'requisicao', 'Sleep', 237, '', ''
14, 'root', 'localhost:53391', 'requisicao', 'Sleep', 160, '', ''
19, 'root', 'localhost:53405', 'requisicao', 'Sleep', 159, '', ''
20, 'root', 'localhost:53406', 'requisicao', 'Sleep', 148, '', ''
22, 'root', 'localhost:53408', 'requisicao', 'Sleep', 148, '', ''
23, 'root', 'localhost:53409', 'requisicao', 'Sleep', 147, '', ''
24, 'root', 'localhost:53410', 'requisicao', 'Sleep', 133, '', ''
25, 'root', 'localhost:53413', 'requisicao', 'Sleep', 132, '', ''
26, 'root', 'localhost:53414', 'requisicao', 'Sleep', 132, '', ''
27, 'root', 'localhost:53415', 'requisicao', 'Sleep', 132, '', ''
32, 'root', 'localhost:53434', 'quantum', 'Sleep', 0, '', ''
33, 'root', 'localhost:53435', 'quantum', 'Query', 0, '', ''
13, 'root', 'localhost:53390', 'requisicao', 'Sleep', 237, '', ''
14, 'root', 'localhost:53391', 'requisicao', 'Sleep', 160, '', ''
19, 'root', 'localhost:53405', 'requisicao', 'Sleep', 159, '', ''
20, 'root', 'localhost:53406', 'requisicao', 'Sleep', 148, '', ''
22, 'root', 'localhost:53408', 'requisicao', 'Sleep', 148, '', ''
23, 'root', 'localhost:53409', 'requisicao', 'Sleep', 147, '', ''
24, 'root', 'localhost:53410', 'requisicao', 'Sleep', 133, '', ''
25, 'root', 'localhost:53413', 'requisicao', 'Sleep', 132, '', ''
26, 'root', 'localhost:53414', 'requisicao', 'Sleep', 132, '', ''
27, 'root', 'localhost:53415', 'requisicao', 'Sleep', 132, '', ''
32, 'root', 'localhost:53434', 'quantum', 'Sleep', 0, '', ''
33, 'root', 'localhost:53435', 'quantum', 'Query', 0, '', ''
aí conforme vou usando, o numero de conexoes, vai crescendo...
10, 'root', 'localhost:53375', 'requisicao', 'Sleep', 566, '', ''
13, 'root', 'localhost:53390', 'requisicao', 'Sleep', 411, '', ''
14, 'root', 'localhost:53391', 'requisicao', 'Sleep', 334, '', ''
19, 'root', 'localhost:53405', 'requisicao', 'Sleep', 333, '', ''
20, 'root', 'localhost:53406', 'requisicao', 'Sleep', 322, '', ''
22, 'root', 'localhost:53408', 'requisicao', 'Sleep', 322, '', ''
23, 'root', 'localhost:53409', 'requisicao', 'Sleep', 321, '', ''
24, 'root', 'localhost:53410', 'requisicao', 'Sleep', 307, '', ''
25, 'root', 'localhost:53413', 'requisicao', 'Sleep', 306, '', ''
26, 'root', 'localhost:53414', 'requisicao', 'Sleep', 306, '', ''
32, 'root', 'localhost:53434', 'quantum', 'Sleep', 0, '', ''
34, 'root', 'localhost:53439', 'requisicao', 'Sleep', 75, '', ''
35, 'root', 'localhost:53440', 'requisicao', 'Sleep', 34, '', ''
37, 'root', 'localhost:53445', 'requisicao', 'Sleep', 20, '', ''
39, 'root', 'localhost:53447', 'requisicao', 'Sleep', 4, '', ''
41, 'root', 'localhost:53449', 'requisicao', 'Sleep', 4, '', ''
42, 'root', 'localhost:53450', 'quantum', 'Query', 0, '', ''
13, 'root', 'localhost:53390', 'requisicao', 'Sleep', 411, '', ''
14, 'root', 'localhost:53391', 'requisicao', 'Sleep', 334, '', ''
19, 'root', 'localhost:53405', 'requisicao', 'Sleep', 333, '', ''
20, 'root', 'localhost:53406', 'requisicao', 'Sleep', 322, '', ''
22, 'root', 'localhost:53408', 'requisicao', 'Sleep', 322, '', ''
23, 'root', 'localhost:53409', 'requisicao', 'Sleep', 321, '', ''
24, 'root', 'localhost:53410', 'requisicao', 'Sleep', 307, '', ''
25, 'root', 'localhost:53413', 'requisicao', 'Sleep', 306, '', ''
26, 'root', 'localhost:53414', 'requisicao', 'Sleep', 306, '', ''
32, 'root', 'localhost:53434', 'quantum', 'Sleep', 0, '', ''
34, 'root', 'localhost:53439', 'requisicao', 'Sleep', 75, '', ''
35, 'root', 'localhost:53440', 'requisicao', 'Sleep', 34, '', ''
37, 'root', 'localhost:53445', 'requisicao', 'Sleep', 20, '', ''
39, 'root', 'localhost:53447', 'requisicao', 'Sleep', 4, '', ''
41, 'root', 'localhost:53449', 'requisicao', 'Sleep', 4, '', ''
42, 'root', 'localhost:53450', 'quantum', 'Query', 0, '', ''
E ASSIM vai indo.. o problema, é que ao chegar no numero máximo de conexões , estilpulado na nossa factory(acima tem o codigo), o sistema trava tudo.
Entao... no meu caso, removendo a linha de max_size , das connections, parece que estabilizou, nao travou mais... pou seja essa linha é quantidade que o sistema pode alcancar de conexoes que ficam abertas e paralizava o sistema ao alcançar o tal limite, certo?
Se vc concorda, Acho q fechou...





