Navigation Menu

Skip to content

Commit

Permalink
Fixed leaked database connections.
Browse files Browse the repository at this point in the history
  • Loading branch information
Thomas Børlum committed Apr 14, 2011
1 parent 90f01f6 commit 3a35f71
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 3 deletions.
Expand Up @@ -28,6 +28,7 @@

import com.google.common.collect.Sets;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import com.google.inject.servlet.ServletModule;
import com.trifork.stamdata.Nullable;
import com.trifork.stamdata.replication.gui.models.Client;
Expand Down Expand Up @@ -59,7 +60,6 @@ protected final void configureServlets() {

// DISCOVER ALL ENTITY CLASSES


Set<Class<?>> classes = Sets.newHashSet();
classes.addAll(Views.findAllViews());
classes.add(User.class);
Expand All @@ -78,11 +78,20 @@ protected final void configureServlets() {

config.setProperty("hibernate.connection.zeroDateTimeBehavior", "convertToNull");
config.setProperty("hibernate.connection.characterEncoding", "utf8");
config.setProperty("hibernate.connection.useCursorFetch", "true");
config.setProperty("hibernate.connection.useServerPrepStmts", "true");
config.setProperty("hibernate.connection.defaultFetchSize", "1000");

config.setProperty("hibernate.c3p0.min_size", "5");
config.setProperty("hibernate.c3p0.max_size", "20");
config.setProperty("hibernate.c3p0.max_size", "200");
config.setProperty("hibernate.c3p0.timeout", "300");
config.setProperty("hibernate.c3p0.max_statements", "50");

// The following two properties can be used to debug c3p0's connections.
// They are commented out since they are quite expensive.

// config.setProperty("hibernate.c3p0.unreturnedConnectionTimeout", "120");
// config.setProperty("hibernate.c3p0.debugUnreturnedConnectionStackTraces", "true");

config.setProperty("hibernate.current_session_context_class", "thread");
config.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider");
Expand All @@ -107,6 +116,7 @@ protected Session provideSession() {
}

@Provides
@RequestScoped
protected StatelessSession provideStatelessSession() {

// Hibernate provides a command-oriented API that can be used for
Expand Down
Expand Up @@ -29,23 +29,38 @@
import javax.servlet.ServletResponse;

import org.hibernate.Session;
import org.hibernate.StatelessSession;
import org.hibernate.Transaction;
import org.slf4j.Logger;

import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;

/**
* Wraps requests in a database transaction.
*
* Responsibilities:
*
* <ol>
* <li>Handle transactions.
* <li>Close hibernate sessions as needed.
* </ol>
*
* @author Thomas Børlum (thb@trifork.com)
*/
@Singleton
public class PersistenceFilter implements Filter {

private static final Logger logger = getLogger(PersistenceFilter.class);
private final Provider<Session> sessions;
private final Provider<StatelessSession> statelessSessions;

@Inject
PersistenceFilter(Provider<Session> sessions) {
PersistenceFilter(Provider<Session> sessions, Provider<StatelessSession> statelessSessions) {

this.sessions = sessions;
this.statelessSessions = statelessSessions;
}

@Override
Expand All @@ -69,6 +84,14 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
}
finally {
sessions.get().close();

// TODO: This next call will actually open
// a new session if one has not been created.
// This does not impact performance much since
// state-less sessions are only not opened for
// requests to the administration GUI.

statelessSessions.get().close();
}
}

Expand Down
Expand Up @@ -139,6 +139,8 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t
response.flushBuffer();

writers.get().write(entityType, records, response.getOutputStream(), useFastInfoSet);

records.close();
}

protected String getPath(HttpServletRequest request) {
Expand Down

0 comments on commit 3a35f71

Please sign in to comment.