From a1a430d2ebb3fcad1c816a57214bb057e5ad1560 Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Thu, 2 Jun 2011 12:32:21 +0400 Subject: Fix violations --- .../src/main/java/org/sonar/batch/components/PastSnapshotFinder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sonar-batch/src/main') diff --git a/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinder.java b/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinder.java index 4962be2b8e6..dd59bb2009d 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinder.java +++ b/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinder.java @@ -63,8 +63,8 @@ public class PastSnapshotFinder implements BatchExtension { case 1: defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_1; break; case 2: defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_2; break; case 3: defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_3; break; - case 4: defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_4; break; - case 5: defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_5; break;// NOSONAR false-positive: constant 5 is the same than 4 (empty string) + case 4: defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_4; break; // NOSONAR false-positive: constant 4 is the same than 5 (empty string) + case 5: defaultValue = CoreProperties.TIMEMACHINE_DEFAULT_PERIOD_5; break; // NOSONAR false-positive: constant 5 is the same than 4 (empty string) } return conf.getString(CoreProperties.TIMEMACHINE_PERIOD_PREFIX + index, defaultValue); } -- cgit v1.2.3 From 2233993388ae63625d926099903a9b697a062409 Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Tue, 7 Jun 2011 02:16:39 +0400 Subject: SONAR-2495 Correctly deregister JDBC Driver to prevent memory leaks DriverDatabaseConnector should register only one instance of DriverProxy in DriverManager and also should perform deregistration. But this is not enough to prevent memory leaks, so class loader for JDBC Driver should perform additional efforts for deregistration. --- .../batch/bootstrap/BootstrapClassLoader.java | 53 --------- .../org/sonar/batch/bootstrap/BootstrapModule.java | 4 +- .../sonar/batch/bootstrap/JdbcDriverHolder.java | 132 +++++++++++++++++++++ .../sonar/batch/bootstrap/JdbcLeakPrevention.java | 64 ++++++++++ .../batch/bootstrap/BootstrapClassLoaderTest.java | 2 +- .../sonar/jpa/session/DriverDatabaseConnector.java | 59 ++++++--- 6 files changed, 244 insertions(+), 70 deletions(-) delete mode 100644 sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapClassLoader.java create mode 100644 sonar-batch/src/main/java/org/sonar/batch/bootstrap/JdbcDriverHolder.java create mode 100644 sonar-batch/src/main/java/org/sonar/batch/bootstrap/JdbcLeakPrevention.java (limited to 'sonar-batch/src/main') diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapClassLoader.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapClassLoader.java deleted file mode 100644 index ca00f9a0691..00000000000 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapClassLoader.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2011 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * Sonar is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.batch.bootstrap; - -import org.sonar.api.utils.SonarException; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; - -/** - * ClassLoader extended with the JDBC Driver hosted on the server-side. - */ -public class BootstrapClassLoader { - - private URLClassLoader classLoader; - - public BootstrapClassLoader(ArtifactDownloader extensionDownloader) { - this(extensionDownloader.downloadJdbcDriver()); - } - - BootstrapClassLoader(File jdbcDriver) { - try { - ClassLoader parentClassLoader = BootstrapClassLoader.class.getClassLoader(); - classLoader = URLClassLoader.newInstance(new URL[]{jdbcDriver.toURI().toURL()}, parentClassLoader); - - } catch (MalformedURLException e) { - throw new SonarException("Fail to get URL of : " + jdbcDriver.getAbsolutePath(), e); - } - } - - public URLClassLoader getClassLoader() { - return classLoader; - } -} diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java index fda540156a8..3127e7a3e50 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BootstrapModule.java @@ -56,9 +56,9 @@ public class BootstrapModule extends Module { addComponent(TempDirectories.class);// registered here because used by BootstrapClassLoader addComponent(HttpDownloader.class);// registered here because used by BootstrapClassLoader addComponent(ArtifactDownloader.class);// registered here because used by BootstrapClassLoader - addComponent(BootstrapClassLoader.class); + addComponent(JdbcDriverHolder.class); - URLClassLoader bootstrapClassLoader = getComponent(BootstrapClassLoader.class).getClassLoader(); + URLClassLoader bootstrapClassLoader = getComponent(JdbcDriverHolder.class).getClassLoader(); // set as the current context classloader for hibernate, else it does not find the JDBC driver. Thread.currentThread().setContextClassLoader(bootstrapClassLoader); diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/JdbcDriverHolder.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/JdbcDriverHolder.java new file mode 100644 index 00000000000..427ac20e3ab --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/JdbcDriverHolder.java @@ -0,0 +1,132 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.batch.bootstrap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.utils.SonarException; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.List; + +/** + * Contains and provides class loader extended with the JDBC Driver hosted on the server-side. + */ +public class JdbcDriverHolder { + + private static Logger LOG = LoggerFactory.getLogger(JdbcDriverHolder.class); + private JdbcDriverClassLoader classLoader; + + public JdbcDriverHolder(ArtifactDownloader extensionDownloader) { + this(extensionDownloader.downloadJdbcDriver()); + } + + JdbcDriverHolder(File jdbcDriver) { + try { + ClassLoader parentClassLoader = JdbcDriverHolder.class.getClassLoader(); + classLoader = new JdbcDriverClassLoader(jdbcDriver.toURI().toURL(), parentClassLoader); + + } catch (MalformedURLException e) { + throw new SonarException("Fail to get URL of : " + jdbcDriver.getAbsolutePath(), e); + } + } + + public URLClassLoader getClassLoader() { + return classLoader; + } + + /** + * This method automatically invoked by PicoContainer and deregisters JDBC drivers, which were forgotten. + *

+ * Dynamically loaded JDBC drivers can not be simply used and this is a well known problem of {@link java.sql.DriverManager}, + * so workaround is to use proxy. + * However DriverManager also contains memory leak, thus not only proxy, but also original driver must be deregistered, + * otherwise our class loader would be kept in memory. + *

+ *

+ * This operation contains unnecessary complexity because: + *