Java Hibernate-Verbindung Leck
Einsatz von Hibernate mit Struts2, gesamte Strömung wie:
hibernate.cfg.xml
:
<hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.url">jdbc:oracle:thin:@xx.xx.xxx.xx:1521:TEST</property>
<property name="connection.username">xxxx</property>
<property name="connection.password">xxxxyyy</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<mapping class="test.models.administration.Menus" />
<mapping resource="Dual.hbm.xml" />
</session-factory>
</hibernate-configuration>
Und für DAO eine Verlängerung AbstractSimpleGenericDao
:
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;
@SuppressWarnings("unchecked")
public abstract class AbstractSimpleGenericDao<C, I extends Serializable> {
Class<C> entityClass;
@SessionTarget
protected Session hSession;
@TransactionTarget
protected Transaction hTransaction;
{
entityClass = (Class<C>) ((ParameterizedType)
getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public List<C> getAll()
{
try
{
return hSession.createCriteria(entityClass).list();
}
catch (HibernateException e)
{
throw e;
}
}
public C get(I id)
{
try
{
return (C) hSession.get(entityClass, id);
}
catch (HibernateException e)
{
throw e;
}
}
public void save(C object)
{
try
{
hSession.save(object);
}
catch (HibernateException e)
{
hTransaction.rollback();
throw e;
}
}
public void update(C object)
{
try
{
hSession.update(object);
}
catch (HibernateException e)
{
hTransaction.rollback();
throw e;
}
}
public void delete(I id)
{
try
{
C actual = get(id);
hSession.delete(actual);
}
catch (HibernateException e)
{
hTransaction.rollback();
throw e;
}
}
}
Dann erweitern oben DAO in meiner DAO-Klasse wie:
public class UserRoleDAO extends AbstractSimpleGenericDao<UserRole, UserRoleId> {
public List L() {
try {
String queryString = "from UserRole";
Query queryObject = hSession.createQuery(queryString);
return queryObject.list();
} catch (RuntimeException re) {
throw re;
}
}
Dann in meiner struts-Action-Klasse, DAO instanzieren und abrufen der Liste:
public class abc extends ActionSupport{
private UserRoleDAO userRoleDao = new UserRoleDAO();
private List ls=new ArrayList();
public String execute()
{
List ls=userRoleDao.L()
return "success";
}
}
Wenn ich rufe diese abc
Action-Klasse, durch wiederholte Klicks auf die angegebene Menü-link, und es bewirkt, dass die Verbindung Undicht ist, zählt als Verbindung geöffnet, dass ich in der Lage bin zu sehen, mit jProfiler, und wird sich nie schließen.
Mittlerweile auch, Es undichte verbindungen.
StackTrace alle geöffneten durchgesickert Verbindung mit jProfiler:
org.hibernate.transaction.JDBCTransaction.begin()
com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInter
ceptor.injectHibernateTransactionByAnnotation(java.lang.Object, org.hibernate.Session, boolean)
com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInter
ceptor.injectHibernateTransactionByAnnotation(java.lang.Object, org.hibernate.Session, boolean)
com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInter
ceptor.intercept(com.opensymphony.xwork2.ActionInvocation)
java.lang.Thread.run()
URL: /project/action-name
Warum Hibernate undicht ist, diese verbindungen?
Ist es wie ist Hibernate halten der Verbindung in der session und erneut dieselbe Verbindung und somit, wenn zur gleichen Zeit, wenn ich die gleichzeitige Anforderung ist, wenn session-Anschluss ist besetzt, es würde Leck-verbindungen. Dies ist nur gehe ich davon aus. Ich habe keine Idee.
Ich bin nicht etwas zu tun für die Verwaltung von session-mit Ausnahme der Erstellung von DAO ist, wie ich oben sagte... ich bin mit Tomcat-server
Welche Versionen und welche plugins Sie verwenden.
Was ist Ihre struts-Konfiguration?
mit Struts2, myeclipse, Apache Tomcat 6.x
InformationsquelleAutor Ashish Kataria | 2013-01-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem hibernate-Konfiguration implizit
DriverManagerConfigurationProvider
. Dieser Anbieter standardmäßig verwendet, es sei denn, man konfiguriert es mit der Eigenschaftconnection.provider_class
.Was es bedeutet, "rudimentäre" connection pool". Wenn Sie Ihre Anwendung ausführen, sehen Sie in den Protokollen
Sie können auch festlegen, dass dieser Wert über die hibernate-Konfiguration Eigenschaft
connection.pool_size
. Aber es Sie nicht begrenzt, der maximal geöffneten verbindungen zählen. Sie können öffnen Sie so viele wie Sie benötigen-verbindungen während der pool leer ist. Die Anbieter halten, Sie zu öffnen, da gibt es verbindungen mit pool aufcloseConnection
es sei denn, die aktuelle pool-Größe nicht übersteigt, der Wert in der Eigenschaftconnection.pool_size
. Sobald aktuelle pool-Größe ist nicht leer, Sie kann nicht öffnen Sie eine neue Verbindung, weil die Verbindung Anbieter gibt Verbindung aus dem pool.Wie Sie sehen können, jetzt ist es schwer zu sagen, dass hibernate mit dieser Verbindung provider standardmäßig die Auslaufen können die verbindungen, die ich habe, nur sagen, es ist unmöglich. Es ist jedoch nicht ausschließlich mit der Anzahl der geöffneten verbindungen.
Sicherstellen, dass die verbindungen begrenzt sind, verwenden Sie einen anderen Anschluss-Anbieter. Zum Beispiel
könnten Sie
C3P0ConnectionProvider
und setzen Sie die Eigenschafthibernate.c3p0.max_size
zu begrenzen, eröffnet verbindungen.Und Sie haben erwähnt, verwenden C3P0ConnectionProvider, hibernate.c3p0.max_size zu begrenzen geöffneten verbindungen an. Begrenzung der Anzahl der geöffneten verbindungen, bedeutet es darüber hinaus, dass die neue Anforderung nicht gedient? Jetzt mit der Verbindung.pool_size-Eigenschaft=1, Anzahl der verbindungen gehen über 1, aber zur gleichen Zeit verbindungen zurückgreifen, um 1. So hier verbindungen erhöhen, aber bald wird der release auch. Jeder Vorteil der Verwendung C3P0ConnectionProvider über diese?
neue Anfrage wird serviert werden, es sei denn, Sie beschränkt die verbindungen von der Datenbank. weiß wirklich nicht, wie kann Sie zurückgreifen, wenn Sie die Verbindung schließen, es ist nicht geschlossen, stattdessen an den pool zurückgegeben. c3p0 besser verwaltet verbindungen, d.h. deren Lebenszyklus.
die Eröffnung der Verbindung ist an der Zeit teuer, mit c3p0 dieser Zeit wird weniger teuer als mit Standard-Verbindungs-manager. IMHO.
InformationsquelleAutor Roman C