Hibernate X Problema de conexao
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") .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") ---------------------- 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.
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") ---------------------- 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.
Carlos Mazzi
Curtidas 0
Respostas
Angelo Santos
26/04/2010
Carlos,
Sugiro que você aumente o timeout, pois quando sua aplicação atingir o numero máximo de conexão, as conexões que ultrapassam o limite vão para um queue (fila), se o timeout estiver com um valor pequeno as conexões serão recusadas, já que as mesmas estão esperando em uma fila.
GOSTEI 0
Carlos Mazzi
26/04/2010
Entao... hoje esta em "1800"... vc sugere que quanto, seria o suficiente? Quanto vc usa normalmente ?
Mas tbm, pq são necessarias tantas conexoes?
GOSTEI 0
Angelo Santos
26/04/2010
Carlos,
Coloque 5000 e teste.
Coloque 5000 e teste.
GOSTEI 0
Dyego Carmo
26/04/2010
Estranho hein ? Voce tá abrindo uma conexao com o banco para CADA usuario conectado ?
Como que vc esta criando suas sessionfactorys... pode colar o codigo aqui ?
Como que vc esta criando suas sessionfactorys... pode colar o codigo aqui ?
GOSTEI 0
Carlos Mazzi
26/04/2010
olhem só...
HibernateUtil.java
------------------------
public class HibernateUtil implements java.io.Serializable{
private static final long serialVersionUID =1L;
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.validate", "true")
.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);
}
}
----------------------------------------------------------------------------------- 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 Session getSession() {
return HibernateUtil.getInstance().getSession();
} protected void saveOrUpdatePojo(Serializable pojo) {
Object classe = pojo.getClass().getName(); int setor = Integer.parseInt(jcUtil.getSessao("posto").toString());
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(); 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);
} 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;
} protected void removePojo(Serializable pojoToRemove) {
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; classe = classe.toString().replace("com.Bean.", "");
hist = "Apagou um registro na tabela: " + classe + ". Registro: " + reg;
Session ses = getSession();
ses.delete(pojoToRemove); ses.getTransaction().commit();
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]);
} está ai....Dyego...Abracos
@SuppressWarnings("unchecked")
List<T> toReturn = qr.list(); ses.getTransaction().commit();
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(); ses.getTransaction().commit();
ses.close(); return (Serializable) toReturn;
} protected void adicionarLog(int posto, int usuario, String historico) {
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); Auditoria aud = new Auditoria(posto, usuario);
aud.setAudData(data);
aud.setAudHora(hora);
aud.setAudHistorico(historico); ses.save(aud);
} finally {
ses.getTransaction().commit();
ses.close();
setAtualizar(false);
} }
protected boolean isAtualizar() {
return atualizar;
} protected void setAtualizar(boolean atualizar) {
this.atualizar = atualizar;
}
protected Object jaExiste(String classe, String clausula) {
Session ses = getSession(); try {
Query q = ses.createQuery("SELECT obj FROM "+classe+" obj WHERE "+clausula);
return q.uniqueResult();
} finally {
ses.close();
}
}
}
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.validate", "true")
.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);
}
}
----------------------------------------------------------------------------------- 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 Session getSession() {
return HibernateUtil.getInstance().getSession();
} protected void saveOrUpdatePojo(Serializable pojo) {
Object classe = pojo.getClass().getName(); int setor = Integer.parseInt(jcUtil.getSessao("posto").toString());
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(); 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);
} 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;
} protected void removePojo(Serializable pojoToRemove) {
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; classe = classe.toString().replace("com.Bean.", "");
hist = "Apagou um registro na tabela: " + classe + ". Registro: " + reg;
Session ses = getSession();
ses.delete(pojoToRemove); ses.getTransaction().commit();
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]);
} está ai....Dyego...Abracos
@SuppressWarnings("unchecked")
List<T> toReturn = qr.list(); ses.getTransaction().commit();
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(); ses.getTransaction().commit();
ses.close(); return (Serializable) toReturn;
} protected void adicionarLog(int posto, int usuario, String historico) {
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); Auditoria aud = new Auditoria(posto, usuario);
aud.setAudData(data);
aud.setAudHora(hora);
aud.setAudHistorico(historico); ses.save(aud);
} finally {
ses.getTransaction().commit();
ses.close();
setAtualizar(false);
} }
protected boolean isAtualizar() {
return atualizar;
} protected void setAtualizar(boolean atualizar) {
this.atualizar = atualizar;
}
protected Object jaExiste(String classe, String clausula) {
Session ses = getSession(); try {
Query q = ses.createQuery("SELECT obj FROM "+classe+" obj WHERE "+clausula);
return q.uniqueResult();
} finally {
ses.close();
}
}
}
GOSTEI 0
Carlos Mazzi
26/04/2010
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)??
GOSTEI 0
Dyego Carmo
26/04/2010
A cada openSession que voce gera , voce PRECISA fechar ela...
session.close();
Experimente e me diga !
session.close();
Experimente e me diga !
GOSTEI 0
Carlos Mazzi
26/04/2010
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?
GOSTEI 0
Dyego Carmo
26/04/2010
Muito Estranho...
Voce esta usando MySQL ?
Poderia dar um SHOW PROCESS LIST na hora que trava e colar aqui ?
Voce esta usando MySQL ?
Poderia dar um SHOW PROCESS LIST na hora que trava e colar aqui ?
GOSTEI 0
Carlos Mazzi
26/04/2010
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, '', '' 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, '', '' 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.
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, '', '' 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.
GOSTEI 0
Dyego Carmo
26/04/2010
Muito Estranho...
Qual a versão do Hibernate ?
Tá usando GlassFish ou Tomcat ?
Quais versoes ?
Qual a versão do Hibernate ?
Tá usando GlassFish ou Tomcat ?
Quais versoes ?
GOSTEI 0
Carlos Mazzi
26/04/2010
Hibernate 3.2
GlassFish v3 prelude domain
GOSTEI 0
Carlos Mazzi
26/04/2010
Olha eu removi (no caso comentei a linha), das max_size, de conexões, agora tá rodando bem...
ela abre umas 30, 50 conexoes... depois vai fechando se osciosas..
é assim mesmo?(resolvido)?
GOSTEI 0
Dyego Carmo
26/04/2010
O funcionamento eh assim mesmo , para CADA sessao aberta é uma conexão ao banco...
conforme voce vai fechando as session ele NAO FECHA a conexao , prq se alguem pedir mais uma conexao ele nao precisa abrir , apenas passa...
quando dá o timeout ele fecha :)
conforme voce vai fechando as session ele NAO FECHA a conexao , prq se alguem pedir mais uma conexao ele nao precisa abrir , apenas passa...
quando dá o timeout ele fecha :)
GOSTEI 0
Carlos Mazzi
26/04/2010
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...
GOSTEI 0
Dyego Carmo
26/04/2010
Exato.
GOSTEI 0
Carlos Mazzi
26/04/2010
Então, ... fechado companheiro.. Muito Obrigado, forte abraço.
GOSTEI 0
Dyego Carmo
26/04/2010
Valeu !
GOSTEI 0
Faustino Junior
26/04/2010
Senhores.
Finalmente um post com informações bastante úteis.
Tenho software asp.net com C#, e estou com os mesmos problemas que o amigo acima descreveu.
Alguém pode recomendar um post sobre o assunto ? ou poderia responder sobre as conexões asp.net c#.
Finalmente um post com informações bastante úteis.
Tenho software asp.net com C#, e estou com os mesmos problemas que o amigo acima descreveu.
Alguém pode recomendar um post sobre o assunto ? ou poderia responder sobre as conexões asp.net c#.
GOSTEI 0