From: <sp...@us...> - 2011-07-12 06:48:57
|
Revision: 8000 http://geonetwork.svn.sourceforge.net/geonetwork/?rev=8000&view=rev Author: sppigot Date: 2011-07-12 06:48:48 +0000 (Tue, 12 Jul 2011) Log Message: ----------- Move ApacheDBCPool to DBCP BasicDataSource Move Dbms to DataSource from DriverManager Add capability to search container context for DB config using JNDI Remove obsolete DbmsPool.java Switch spatialindexwriter to autocommit (avoid long running transactions temporarily - needs more thought) Modified Paths: -------------- sandbox/BlueNetMEST/ANZMEST/jeeves/pom.xml sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/constants/Jeeves.java sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/ApacheDBCPool.java sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/Dbms.java sandbox/BlueNetMEST/ANZMEST/pom.xml sandbox/BlueNetMEST/ANZMEST/web/src/main/java/org/fao/geonet/kernel/search/SearchManager.java sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/config.xml Removed Paths: ------------- sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/DbmsPool.java Property Changed: ---------------- sandbox/BlueNetMEST/ANZMEST/pom.xml Modified: sandbox/BlueNetMEST/ANZMEST/jeeves/pom.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/jeeves/pom.xml 2011-07-12 06:38:46 UTC (rev 7999) +++ sandbox/BlueNetMEST/ANZMEST/jeeves/pom.xml 2011-07-12 06:48:48 UTC (rev 8000) @@ -46,15 +46,15 @@ <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> </dependency> + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>dbcp</artifactId> + </dependency> + <dependency> + <groupId>commons-dbcp</groupId> + <artifactId>commons-dbcp</artifactId> + </dependency> <dependency> - <groupId>commons-dbcp</groupId> - <artifactId>commons-dbcp</artifactId> - </dependency> - <dependency> - <groupId>commons-pool</groupId> - <artifactId>commons-pool</artifactId> - </dependency> - <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> </dependency> Modified: sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/constants/Jeeves.java =================================================================== --- sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/constants/Jeeves.java 2011-07-12 06:38:46 UTC (rev 7999) +++ sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/constants/Jeeves.java 2011-07-12 06:48:48 UTC (rev 8000) @@ -242,11 +242,22 @@ public static final String POOL_SIZE = "poolSize"; public static final String MAX_TRIES = "maxTries"; public static final String MAX_WAIT = "maxWait"; - public static final String RECONNECT_TIME = "reconnectTime"; - public static final int DEF_POOL_SIZE = 2; - public static final int DEF_MAX_TRIES = 20; // number of connection attempts + public static final int DEF_POOL_SIZE = 10; public static final int DEF_MAX_WAIT = 200; // msecs between attempts + public static final String MAX_IDLE = "maxIdle"; + public static final String MIN_IDLE = "minIdle"; + public static final String MAX_ACTIVE = "maxActive"; + public static final String TEST_WHILE_IDLE = "testWhileIdle"; + public static final String TIME_BETWEEN_EVICTION_RUNS_MILLIS = "timeBetweenEvictionRunsMillis"; + public static final String MIN_EVICTABLE_IDLE_TIME_MILLIS = "minEvictableIdleTimeMillis"; + public static final String NUM_TESTS_PER_EVICTION_RUN = "numTestsPerEvictionRun"; + public static final String CONTEXT = "context"; + public static final String RESOURCE_NAME = "resourceName"; + + public static final String DEF_CONTEXT = "java:/comp/env"; + public static final String DEF_RESOURCE_NAME = "jdbc/geonetwork"; + } } Modified: sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/ApacheDBCPool.java =================================================================== --- sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/ApacheDBCPool.java 2011-07-12 06:38:46 UTC (rev 7999) +++ sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/ApacheDBCPool.java 2011-07-12 06:48:48 UTC (rev 8000) @@ -1,5 +1,5 @@ //============================================================================= -//=== Copyright (C) GeoNetwork +//=== Copyright (C) Free Software Foundation //=== //=== This library is free software; you can redistribute it and/or //=== modify it under the terms of the GNU Lesser General Public @@ -27,26 +27,18 @@ import java.util.Map; import java.util.Set; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.SQLException; +import javax.sql.DataSource; +import javax.naming.Context; +import javax.naming.InitialContext; + import jeeves.constants.Jeeves; import jeeves.server.resources.ResourceListener; import jeeves.server.resources.ResourceProvider; import jeeves.utils.Log; -import org.apache.commons.pool.KeyedObjectPool; -import org.apache.commons.pool.KeyedObjectPoolFactory; -import org.apache.commons.pool.ObjectPool; -import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory; -import org.apache.commons.pool.impl.GenericObjectPool; -import org.apache.commons.dbcp.AbandonedConfig; -import org.apache.commons.dbcp.AbandonedObjectPool; -import org.apache.commons.dbcp.ConnectionFactory; -import org.apache.commons.dbcp.DriverManagerConnectionFactory; -import org.apache.commons.dbcp.PoolableConnection; -import org.apache.commons.dbcp.PoolableConnectionFactory; -import org.apache.commons.dbcp.PoolingDriver; +import org.apache.tomcat.dbcp.dbcp.BasicDataSource; import org.jdom.Element; @@ -58,25 +50,19 @@ //============================================================================= /** - * A pool of database connections via Apache Commons DBC Pool + * A pool of database connections via Apache Commons DBC Pool (or at least + * the tomcat wrapping of these). Checks first using JNDI to see whether the + * container has defined a context with the details in it - uses those if + * they are found under jdbc/geonetwork otherwise reads the Jeeves config + * from web/geonetwork/WEB-INF/config.xml. */ public class ApacheDBCPool implements ResourceProvider { private String name; - private String user; - private String passwd; - private String url; - private String apacheUrl = "jdbc:apache:commons:dbcp:"; - private final String apacheDriver = "org.apache.commons.dbcp.PoolingDriver"; - private Set<ResourceListener> hsListeners = Collections - .synchronizedSet(new HashSet<ResourceListener>()); - int poolSize; - int maxWait; - String size; - String driver; - String maxw; - + private Set<ResourceListener> hsListeners = Collections.synchronizedSet(new HashSet<ResourceListener>()); + private BasicDataSource ds; + // -------------------------------------------------------------------------- // --- // --- API @@ -84,95 +70,137 @@ // -------------------------------------------------------------------------- /** - * Builds the pool using init parameters from config + * Builds the pool using JNDI context or init parameters from jeeves config. */ + public void init(String name, Element config) throws Exception { - public void init(String name, Element config) throws Exception { + // check and see whether we have a JNDI context defined + + String contextName = config.getChildText(Jeeves.Res.Pool.CONTEXT); + String dsName = config.getChildText(Jeeves.Res.Pool.RESOURCE_NAME); + if (contextName == null) contextName = Jeeves.Res.Pool.DEF_CONTEXT; + if (dsName == null) dsName = Jeeves.Res.Pool.DEF_RESOURCE_NAME; + + try { + Context initContext = new InitialContext(); + Context envContext = (Context)initContext.lookup(contextName); + ds = (BasicDataSource)envContext.lookup(dsName); + this.name = contextName + "/" + dsName; + } catch (Exception e) { + info("Caught exception "+e.getMessage()); + e.printStackTrace(); + info("No context defined by container in "+contextName+"/"+dsName); + info("Will parse Jeeves config.xml instead...."); + parseJeevesDBConfig(name, config); + } + + if (ds.getUrl().toUpperCase().contains("MCKOI")) { + // McKoi doesn't work unless you use TRANSACTION_SERIALIZABLE + ds.setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); + } else { + // Everything else seems safe and faster with TRANSACTION_READ_COMMITTED + ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); } + + debug(toString()); + } + + /** + * Builds the pool using init parameters from jeeves config. + */ + public void parseJeevesDBConfig(String name, Element config) throws Exception { + String user = config.getChildText(Jeeves.Res.Pool.USER); + String passwd = config.getChildText(Jeeves.Res.Pool.PASSWORD); + String url = config.getChildText(Jeeves.Res.Pool.URL); + String driver = config.getChildText(Jeeves.Res.Pool.DRIVER); + String size = config.getChildText(Jeeves.Res.Pool.POOL_SIZE); + String maxw = config.getChildText(Jeeves.Res.Pool.MAX_WAIT); + String maxIdle = config.getChildText(Jeeves.Res.Pool.MAX_IDLE); + String minIdle = config.getChildText(Jeeves.Res.Pool.MIN_IDLE); + String maxActive = config.getChildText(Jeeves.Res.Pool.MAX_ACTIVE); + String testWhileIdleStr = config.getChildText(Jeeves.Res.Pool.TEST_WHILE_IDLE); + String timeBetweenEvictionRunsMillisStr = config.getChildText(Jeeves.Res.Pool.TIME_BETWEEN_EVICTION_RUNS_MILLIS); + String minEvictableIdleTimeMillisStr = config.getChildText(Jeeves.Res.Pool.MIN_EVICTABLE_IDLE_TIME_MILLIS); + String numTestsPerEvictionRunStr = config.getChildText(Jeeves.Res.Pool.NUM_TESTS_PER_EVICTION_RUN); - user = config.getChildText(Jeeves.Res.Pool.USER); - passwd = config.getChildText(Jeeves.Res.Pool.PASSWORD); - url = config.getChildText(Jeeves.Res.Pool.URL); - driver = config.getChildText(Jeeves.Res.Pool.DRIVER); - size = config.getChildText(Jeeves.Res.Pool.POOL_SIZE); - maxw = config.getChildText(Jeeves.Res.Pool.MAX_WAIT); - this.name = url; - poolSize = (size == null) ? Jeeves.Res.Pool.DEF_POOL_SIZE : Integer + int poolSize = (size == null) ? Jeeves.Res.Pool.DEF_POOL_SIZE : Integer .parseInt(size); - maxWait = (maxw == null) ? Jeeves.Res.Pool.DEF_MAX_WAIT : Integer + int maxWait = (maxw == null) ? Jeeves.Res.Pool.DEF_MAX_WAIT : Integer .parseInt(maxw); - debug("Creating connection pool (" + this.name + ") with " + poolSize + " connections (" - + maxWait + ")"); + boolean testWhileIdle = false; + if (testWhileIdleStr != null) { + testWhileIdle = testWhileIdleStr.equals("true"); + } - // register underlying JDBC driver - Class.forName(driver); + long timeBetweenEvictionRunsMillis = -1; + if (timeBetweenEvictionRunsMillisStr != null) { + timeBetweenEvictionRunsMillis = Long.parseLong(timeBetweenEvictionRunsMillisStr); + } - AbandonedConfig aconfig = new AbandonedConfig(); - aconfig.setRemoveAbandoned(true); - aconfig.setLogAbandoned(true); - aconfig.setRemoveAbandonedTimeout(5000); + long minEvictableIdleTimeMillis = 1000 * 60 * 30; + if (minEvictableIdleTimeMillisStr != null) { + minEvictableIdleTimeMillis = Long.parseLong(minEvictableIdleTimeMillisStr); + } - // GenericObjectPool connectionPool = new GenericObjectPool(); - GenericObjectPool connectionPool = new AbandonedObjectPool(null, - aconfig) { - protected void onRemove(PoolableConnection pc) { - error("Connection was closed: " + pc.toString()); - } - }; - connectionPool.setMaxActive(poolSize); - // configure the rest of the pool from params - connectionPool.setMaxIdle(poolSize); - connectionPool.setMaxWait(maxWait); + int numTestsPerEvictionRun = 3; + if (numTestsPerEvictionRunStr != null) { + numTestsPerEvictionRun = Integer.parseInt(numTestsPerEvictionRunStr); + } - // GenericObjectPool connectionPool = new GenericObjectPool(null); + // create the datasource + ds = new BasicDataSource(); - KeyedObjectPoolFactory keyConnectionPool = new GenericKeyedObjectPoolFactory( - null, poolSize, - GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, maxWait, - GenericObjectPool.DEFAULT_MAX_IDLE, - GenericObjectPool.DEFAULT_TEST_ON_BORROW, - GenericObjectPool.DEFAULT_TEST_ON_RETURN, - GenericObjectPool.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS, - GenericObjectPool.DEFAULT_NUM_TESTS_PER_EVICTION_RUN, - GenericObjectPool.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS, - GenericObjectPool.DEFAULT_TEST_WHILE_IDLE); + ds.setDriverClassName(driver); - // create the connection factory with the url provided in the config - String validationQuery = "Select 1"; - boolean defaultReadOnly = false; - boolean defaultAutoCommit = false; + ds.setRemoveAbandoned(true); + ds.setRemoveAbandonedTimeout(60 * 60); + ds.setLogAbandoned(true); - ConnectionFactory connectionFactory = new DriverManagerConnectionFactory( - url, user, passwd); + // configure the rest of the pool from params + // http://commons.apache.org/dbcp/configuration.html + if (maxActive != null) { + ds.setMaxActive(Integer.parseInt(maxActive)); + } else { + ds.setMaxActive(poolSize); + } + if (maxIdle != null) { + ds.setMaxIdle(Integer.parseInt(maxIdle)); + } else { + ds.setMaxIdle(poolSize); + } + if (minIdle != null) { + ds.setMinIdle(Integer.parseInt(minIdle)); + } else { + ds.setMinIdle(0); + } + ds.setMaxWait(maxWait); - PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory( - connectionFactory, connectionPool, keyConnectionPool, - validationQuery, defaultReadOnly, defaultAutoCommit); + // always test connections when we get them from the pool + ds.setTestOnBorrow(true); - if (url.toUpperCase().contains("MCKOI")) { - // McKoi doesn't work unless you use TRANSACTION_SERIALIZABLE - poolableConnectionFactory. - setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); - } else { - // Everything else seems safe and faster with TRANSACTION_READ_COMMITTED - poolableConnectionFactory. - setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); - } + // time between runs of idle evictor thread + ds.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + // test idle connections + ds.setTestWhileIdle(testWhileIdle); + // let idle connections sit in there forever + ds.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + // test all idle connections each run + ds.setNumTestsPerEvictionRun(numTestsPerEvictionRun); - // Create the number of connections specified in the params at startup - for (int i = 0; i < poolSize; i++) { - connectionPool.addObject(); - } + ds.setPoolPreparedStatements(true); + ds.setMaxOpenPreparedStatements(-1); - // register apache pooling driver which we use in all Dbms objects - Class.forName(apacheDriver); + ds.setValidationQuery("Select 1"); + ds.setDefaultReadOnly(false); + ds.setDefaultAutoCommit(false); - PoolingDriver pDriver = (PoolingDriver) DriverManager.getDriver(apacheUrl); - pDriver.registerPool(this.name, connectionPool); + ds.setUrl(url); + ds.setUsername(user); + ds.setPassword(passwd); - debug(toString()); + ds.setInitialSize(poolSize); } // -------------------------------------------------------------------------- @@ -180,9 +208,9 @@ public Map<String, String> getProps() { Map<String, String> result = new HashMap<String, String>(); result.put("name", name); - result.put("user", user); - result.put("password", passwd); - result.put("url", url); + result.put("user", ds.getUsername()); + result.put("password", ds.getPassword()); + result.put("url", ds.getUrl()); return result; } @@ -190,11 +218,9 @@ public Map<String, String> getStats() throws SQLException { Map<String, String> result = new HashMap<String, String>(); - PoolingDriver driver = (PoolingDriver) DriverManager.getDriver(apacheUrl); - ObjectPool connectionPool = driver.getConnectionPool(name); - result.put("numactive",connectionPool.getNumActive()+""); - result.put("numidle",connectionPool.getNumIdle()+""); - result.put("maxactive",size); // we limit the poolsize to this config + result.put("numactive",ds.getNumActive()+""); + result.put("numidle",ds.getNumIdle()+""); + result.put("maxactive",ds.getMaxActive()+""); return result; } @@ -203,10 +229,10 @@ public void end() { try { - PoolingDriver driver = (PoolingDriver) DriverManager.getDriver(apacheUrl); - driver.closePool(name); + ds.close(); } catch (java.sql.SQLException e) { - error("Problem"+e); + error("Problem "+e); + e.printStackTrace(); } } @@ -222,8 +248,8 @@ */ public synchronized Object open() throws Exception { - debug("Opening " + url); - Dbms dbms = new Dbms(apacheDriver, apacheUrl + name, url); + debug("Opening " + ds.getUrl()); + Dbms dbms = new Dbms((DataSource)ds, ds.getUrl()); String nullStr = null; dbms.connect(nullStr, nullStr); return dbms; @@ -280,10 +306,31 @@ //--------------------------------------------------------------------------- public String toString() { - StringBuffer sb = new StringBuffer("DBMSPool"); - sb.append("\t poolSize:").append(poolSize); - sb.append("\t maxWait:").append(maxWait); + StringBuffer sb = new StringBuffer(); + sb.append("------------------------------------------------------------------------------"); + sb.append('\n'); + sb.append("Created connection pool (" + this.name + ")"); + sb.append('\n'); + sb.append("MaxActive connections : " + ds.getMaxActive()); + sb.append('\n'); + sb.append("MaxIdle connections : " + ds.getMaxIdle()); + sb.append('\n'); + sb.append("MinIdle connections : " + ds.getMinIdle()); + sb.append('\n'); + sb.append("Maximum wait time connection (maxWait): " + ds.getMaxWait()); + sb.append('\n'); + sb.append("Test While Idle (testWhileIdle): " + ds.getTestWhileIdle()); + sb.append('\n'); + sb.append("Time Between Eviction Runs (timeBetweenEvictionRunsMillis): " + ds.getTimeBetweenEvictionRunsMillis()); + sb.append('\n'); + sb.append("Minimum Evictable Idle Time (minEvictableIdleTimeMillis) : " + ds.getMinEvictableIdleTimeMillis()); + sb.append('\n'); + sb.append("Number Connections Tested Per Eviction Run (numTestsPerEvictionRun) : " + ds.getNumTestsPerEvictionRun()); + sb.append('\n'); + sb.append("------------------------------------------------------------------------------"); + sb.append('\n'); + return sb.toString(); } Modified: sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/Dbms.java =================================================================== --- sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/Dbms.java 2011-07-12 06:38:46 UTC (rev 7999) +++ sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/Dbms.java 2011-07-12 06:48:48 UTC (rev 8000) @@ -26,7 +26,6 @@ import java.io.StringReader; import java.sql.Connection; import java.sql.Date; -import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; @@ -57,11 +56,8 @@ public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; public static final String DEFAULT_TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; - private String apacheUrl = "jdbc:apache:commons:dbcp:"; - - private String url; - private String driverUrl; // if different from actual url eg. for - // apache db commons pool + private DataSource ds; + private String url; private Connection conn; private long lastConnTime; @@ -73,27 +69,12 @@ /** Constructs a DBMS object that contains a jdbc connection */ - public Dbms(String driver, String url) throws ClassNotFoundException + public Dbms(DataSource ds, String url) throws ClassNotFoundException { - // loads the driver - Class.forName(driver); - + this.ds = ds; this.url = url; - this.driverUrl = url; } - /** Constructs a DBMS object that contains a jdbc connection and uses - the apacheurl */ - - public Dbms(String driver, String url, String driverUrl) throws ClassNotFoundException - { - // loads the driver - Class.forName(driver); - - this.url = url; - this.driverUrl = driverUrl; - } - //-------------------------------------------------------------------------- //--- //--- Connection methods @@ -105,21 +86,9 @@ public void connect(String username, String password) throws SQLException { - if (username != null && password != null) { - conn = DriverManager.getConnection(url, username, password); - } else { - conn = DriverManager.getConnection(url); - } + // ignore username and password + conn = ds.getConnection(); - conn.setAutoCommit(false); - if (!url.contains(apacheUrl)) { - if (url.toUpperCase().contains("MCKOI")) { - conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); - } else { - conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); - } - } - lastConnTime = System.currentTimeMillis(); Log.debug(Log.RESOURCES, "Open connection: "+ conn.hashCode()); @@ -131,8 +100,7 @@ public void disconnect() { - Log.debug(Log.RESOURCES, - "Close connection: "+ conn.hashCode()); + Log.debug(Log.RESOURCES, "Close connection: "+ conn.hashCode()); try { if (!conn.isClosed()) conn.close(); @@ -151,7 +119,7 @@ //-------------------------------------------------------------------------- - public String getURL() { return driverUrl; } + public String getURL() { return url; } //-------------------------------------------------------------------------- Deleted: sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/DbmsPool.java =================================================================== --- sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/DbmsPool.java 2011-07-12 06:38:46 UTC (rev 7999) +++ sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/resources/dbms/DbmsPool.java 2011-07-12 06:48:48 UTC (rev 8000) @@ -1,283 +0,0 @@ -//============================================================================= -//=== Copyright (C) 2001-2005 Food and Agriculture Organization of the -//=== United Nations (FAO-UN), United Nations World Food Programme (WFP) -//=== and United Nations Environment Programme (UNEP) -//=== -//=== This library 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 2.1 of the License, or (at your option) any later version. -//=== -//=== This library 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 this library; if not, write to the Free Software -//=== Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -//=== -//=== Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, -//=== Rome - Italy. email: Geo...@fa... -//============================================================================== - -package jeeves.resources.dbms; - -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import jeeves.constants.Jeeves; -import jeeves.server.resources.ResourceListener; -import jeeves.server.resources.ResourceProvider; -import jeeves.utils.Log; - -import org.jdom.Element; - -//============================================================================= - -/** A pool of database connections - */ - -public class DbmsPool implements ResourceProvider -{ - private Hashtable<Dbms, Boolean> htDbms = new Hashtable<Dbms,Boolean>(100, 0.75f); - - private String size; - private String name; - private String user; - private String passwd; - private String url; - private int maxTries; - private int maxWait; - private long reconnectTime; - - private Set<ResourceListener> hsListeners = Collections.synchronizedSet(new HashSet<ResourceListener>()); - - //-------------------------------------------------------------------------- - //--- - //--- API - //--- - //-------------------------------------------------------------------------- - - /** Builds the pool using init parameters from config - */ - - public void init(String name, Element config) throws Exception - { - - user = config.getChildText(Jeeves.Res.Pool.USER); - passwd = config.getChildText(Jeeves.Res.Pool.PASSWORD); - url = config.getChildText(Jeeves.Res.Pool.URL); - size = config.getChildText(Jeeves.Res.Pool.POOL_SIZE); - String driver = config.getChildText(Jeeves.Res.Pool.DRIVER); - String maxt = config.getChildText(Jeeves.Res.Pool.MAX_TRIES); - String maxw = config.getChildText(Jeeves.Res.Pool.MAX_WAIT); - String rect = config.getChildText(Jeeves.Res.Pool.RECONNECT_TIME); - - this.name = url; - - int poolSize = (size == null) ? Jeeves.Res.Pool.DEF_POOL_SIZE : Integer.parseInt(size); - maxTries = (maxt == null) ? Jeeves.Res.Pool.DEF_MAX_TRIES : Integer.parseInt(maxt); - maxWait = (maxw == null) ? Jeeves.Res.Pool.DEF_MAX_WAIT : Integer.parseInt(maxw); - reconnectTime = (rect == null) ? 0 /* never */ : Long.parseLong(rect) * 1000; - - for(int i=0; i<poolSize; i++) - { - Dbms dbms = new Dbms(driver, url); - dbms.connect(user,passwd); - htDbms.put(dbms, new Boolean(false)); - } - } - - //-------------------------------------------------------------------------- - - public Map<String,String> getProps() { - Map<String,String> result = new HashMap<String,String>(); - result.put("name", name); - result.put("user", user); - result.put("password", passwd); - result.put("url", url); - return result; - } - - //-------------------------------------------------------------------------- - - public Map<String, String> getStats() { - Map<String,String> result = new HashMap<String,String>(); - result.put("numactive","undefined"); - result.put("numidle","undefined"); - result.put("maxactive",size); - return result; - } - - //-------------------------------------------------------------------------- - - public void end() - { - for(Enumeration<Dbms> e=htDbms.keys(); e.hasMoreElements();) - { - Dbms dbms = e.nextElement(); - dbms.disconnect(); - } - } - - //-------------------------------------------------------------------------- - - public String getName() { return name; } - - //-------------------------------------------------------------------------- - /** Gets an element from the pool - */ - - public synchronized Object open() throws Exception - { - String lastMessage = null; - - // try to connect MAX_TRIES times - for (int nTries = 0; nTries < maxTries; nTries++) - { - // try to get a free dbms - int i = 0; - for(Enumeration<Dbms> e=htDbms.keys(); e.hasMoreElements();) - { - - Dbms dbms = e.nextElement(); - Boolean locked = htDbms.get(dbms); - debug("DBMS Resource "+i+" is "+locked); - - if (!locked.booleanValue()) - { - try - { - if (dbms.isClosed()) - reconnectTime = 1; - - // reconnect if needed - if (reconnectTime > 0) - { - long currTime = System.currentTimeMillis(); - long lastConnTime = dbms.getLastConnTime(); - - if (currTime - lastConnTime >= reconnectTime) - { - error("reconnecting: " + (currTime - lastConnTime) + ">=" + reconnectTime + " ms since last connection"); // FIXME - - // FIXME: what happens if it disconnects but is unable to connect again? - dbms.disconnect(); - dbms.connect(user, passwd); - } - } - - debug("SUCCESS: DBMS Resource "+i+" is not locked"); - htDbms.put(dbms, new Boolean(true)); - return dbms; - } - catch (Exception ex) - { - ex.printStackTrace(); - lastMessage = ex.getMessage(); - } - } - i++; - } - // wait MAX_WAIT msecs (but not after last try) - if (nTries < maxTries - 1) - { - try { Thread.sleep(maxWait); } - catch (InterruptedException ex) {} - } - } - throw new Exception("unable to open resource " + name + " after " + maxTries + "attempts: " + lastMessage); - } - - //-------------------------------------------------------------------------- - /** Releases one element from the pool - */ - - public void close(Object resource) throws Exception - { - checkResource(resource); - debug("Committing and closing "+resource); - - try - { - ((Dbms) resource).commit(); - } - finally - { - htDbms.put((Dbms) resource, new Boolean(false)); - } - - synchronized(hsListeners) { - for(ResourceListener l : hsListeners) - l.close(resource); - } - } - - //-------------------------------------------------------------------------- - /** Releases one element from the pool doing an abort - */ - - public void abort(Object resource) throws Exception - { - checkResource(resource); - debug("Aborting "+resource); - - try - { - ((Dbms) resource).abort(); - } - finally - { - htDbms.put((Dbms) resource, new Boolean(false)); - } - - synchronized(hsListeners) { - for(ResourceListener l : hsListeners) - l.abort(resource); - } - } - - //-------------------------------------------------------------------------- - - public void addListener(ResourceListener l) - { - hsListeners.add(l); - } - - //-------------------------------------------------------------------------- - - public void removeListener(ResourceListener l) - { - hsListeners.remove(l); - } - - //-------------------------------------------------------------------------- - //--- - //--- Private methods - //--- - //-------------------------------------------------------------------------- - - private void checkResource(Object resource) - { - Boolean locked = (Boolean) htDbms.get(resource); - - if (locked == null) - throw new IllegalArgumentException("Resource not found :"+resource); - - if (!locked.booleanValue()) - throw new IllegalArgumentException("Resource not locked :"+resource); - } - - private void debug (String message) { Log.debug (Log.DBMSPOOL, message); } - static void info (String message) { Log.info (Log.DBMSPOOL, message); } - static void error (String message) { Log.error (Log.DBMSPOOL, message); } -} - -//============================================================================= - Modified: sandbox/BlueNetMEST/ANZMEST/pom.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/pom.xml 2011-07-12 06:38:46 UTC (rev 7999) +++ sandbox/BlueNetMEST/ANZMEST/pom.xml 2011-07-12 06:48:48 UTC (rev 8000) @@ -125,6 +125,9 @@ <target>1.5</target> <!-- The -target argument for the Java compiler. --> <debug>true</debug> <!-- Whether to include debugging information. --> <encoding>UTF-8</encoding> <!-- The -encoding argument for the Java compiler. --> + <excludes> + <exclude>**/trash/*.java</exclude> + </excludes> </configuration> </plugin> @@ -300,17 +303,17 @@ <artifactId>commons-digester</artifactId> <version>1.6</version> </dependency> + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>dbcp</artifactId> + <version>6.0.29</version> + </dependency> + <dependency> + <groupId>commons-dbcp</groupId> + <artifactId>commons-dbcp</artifactId> + <version>1.3</version> + </dependency> <dependency> - <groupId>commons-dbcp</groupId> - <artifactId>commons-dbcp</artifactId> - <version>1.3</version> - </dependency> - <dependency> - <groupId>commons-pool</groupId> - <artifactId>commons-pool</artifactId> - <version>1.5.5</version> - </dependency> - <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.3.1</version> Property changes on: sandbox/BlueNetMEST/ANZMEST/pom.xml ___________________________________________________________________ Modified: svn:mergeinfo - /sandbox/guiwidgets/pom.xml:7471-7570 /trunk/pom.xml:7350-7401,7477 + /sandbox/guiwidgets/pom.xml:7471-7570 /trunk/pom.xml:7350-7401,7477,7934 Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/java/org/fao/geonet/kernel/search/SearchManager.java =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/java/org/fao/geonet/kernel/search/SearchManager.java 2011-07-12 06:38:46 UTC (rev 7999) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/java/org/fao/geonet/kernel/search/SearchManager.java 2011-07-12 06:48:48 UTC (rev 8000) @@ -1279,7 +1279,8 @@ { _lock = new ReentrantLock(); _datastore = dataStore; - _transaction = new DefaultTransaction("SpatialIndexWriter"); + //_transaction = new DefaultTransaction("SpatialIndexWriter"); + _transaction = Transaction.AUTO_COMMIT; _timer = new Timer(true); _gmlParser = new Parser(new GMLConfiguration()); boolean rebuildIndex; Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/config.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/config.xml 2011-07-12 06:38:46 UTC (rev 7999) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/config.xml 2011-07-12 06:48:48 UTC (rev 8000) @@ -68,21 +68,83 @@ <!-- ====================================================================== --> <!-- - The ressources section defines which database to be used by GeoNetwork. + The resources section defines which database to be used by GeoNetwork. Update the enabled attribute to true to use a connection. - Only one resource could be enabled at a time. + Only one resource can be enabled, the others must be disabled. + + GeoNetwork will search (using JNDI) the container context to find the + database config. It looks for java:/comp/env/jdbc/geonetwork. If + found this will override any config information in this section. - Default connection is using a mckoi database started by the webapp on port 9157 (see db/db.conf). + GeoNetwork uses the Apache Commons Database Connection Pooling code. + You can config any of the params in two ways. + 1. Via the container context (eg. tomcat/conf/context.xml). If you don't + set a param in the container context then the defaults at + http://commons.apache.org/dbcp/configuration.html apply. + + 2. Via an enabled resource below. + + Default config is the H2 database. + + Only a subset of the dbcp params can be config'd here (some are hardwired): + + <maxActive> - pool size/maximum number of active connections (default 10) + <maxIdle> - pool size/maximum number of idle connections + (default maxActive) + <minIdle> - pool size/minimum number of idle connections (default 0) + <maxWait> - number of milliseconds to wait for a connection to become + available (default 200) + + <timeBetweenEvictionRunsMillis> - time between eviction runs + (default -1 which means the next three params + are ignored) + <testWhileIdle> - test connections when idle (default false) + <minEvictableIdleTimeMillis> - idle time before connection can be evicted + (default 30 x 60 x 1000 millisecs) + <numTestsPerEvictionRun> - number of connections tested per eviction run + (default 3) + + The following params are set by GeoNetwork: + + removeAbandoned - true + removeAbandonedTimeout - 60 x 60 seconds = 1 hour + logAbandoned - true + testOnBorrow - true + validationQuery - 'SELECT 1' + defaultReadOnly - false + defaultAutoCommit - false + initialSize - maxActive + + Note: Some firewalls kill idle connections to databases after say + 1 hour (= 3600 secs) + to keep idle connections alive by testing them with 'select 1', + set minEvictableIdleTimeMillis to something less than timeout + interval (eg. 2 mins = 120 secs = 120000 millisecs), + set testWhileIdle to true and + set timeBetweenEvictionRunsMillis and numTestsPerEvictionRun + high enough to visit connections frequently + eg 15 mins = 900 secs = 900000 millisecs and 4 connections per test + + eg. + + <testWhileIdle>true</testWhileIdle> + <minEvictableIdleTimeMillis>120000</minEvictableIdleTimeMillis> + <timeBetweenEvictionRunsMillis>900000</timeBetweenEvictionRunsMillis> + <numTestsPerEvictionRun>4</numTestsPerEvictionRun> + + !!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!! When changing the resource to use, you could point to an old version of a GeoNetwork database instance (eg. 2.4.3). In such a case, GeoNetwork will try to migrate the database on startup to the current version (eg. 2.5.0). This will only occur if a migration - script is found. Migration scripts are located in WEB-INF/classes/setup/sql/migrate - folder. Migration to 2.4.3 to 2.5.0 will be in WEB-INF/classes/setup/sql/migrate/2.4.3-to-2.5.0. + script is found. Migration scripts are located in + WEB-INF/classes/setup/sql/migrate + folder. Migration to 2.4.3 to 2.5.0 will be in + WEB-INF/classes/setup/sql/migrate/2.4.3-to-2.5.0. During the migration process only the database will be migrated. Catalogue administrator still need to migrate logos, data, thesaurus. @@ -113,7 +175,6 @@ <driver>org.h2.Driver</driver> <url>jdbc:h2:geonetwork</url> <poolSize>33</poolSize> - <reconnectTime>3600</reconnectTime> </config> </resource> @@ -123,7 +184,6 @@ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <resource enabled="false"> <name>main-db</name> - <!-- <provider>jeeves.resources.dbms.DbmsPool</provider> --> <provider>jeeves.resources.dbms.ApacheDBCPool</provider> <config> <user>BayACrsQ</user> @@ -142,7 +202,6 @@ <resource enabled="false"> <name>main-db</name> - <!-- <provider>jeeves.resources.dbms.DbmsPool</provider> --> <provider>jeeves.resources.dbms.ApacheDBCPool</provider> <config> <user>admin</user> @@ -150,7 +209,6 @@ <driver>com.mysql.jdbc.Driver</driver> <url>jdbc:mysql://localhost:3306/geonetwork</url> <poolSize>10</poolSize> - <reconnectTime>3600</reconnectTime> </config> </resource> @@ -160,7 +218,6 @@ <resource enabled="false"> <name>main-db</name> - <!-- <provider>jeeves.resources.dbms.DbmsPool</provider> --> <provider>jeeves.resources.dbms.ApacheDBCPool</provider> <config> <user>admin</user> @@ -177,7 +234,6 @@ <resource enabled="false"> <name>main-db</name> - <!-- <provider>jeeves.resources.dbms.DbmsPool</provider> --> <provider>jeeves.resources.dbms.ApacheDBCPool</provider> <config> <user>db2inst1</user> @@ -195,7 +251,6 @@ <resource enabled="false"> <name>main-db</name> - <!-- <provider>jeeves.resources.dbms.DbmsPool</provider> --> <provider>jeeves.resources.dbms.ApacheDBCPool</provider> <config> <user>www-data</user> @@ -225,7 +280,6 @@ <resource enabled="false"> <name>main-db</name> - <!-- <provider>jeeves.resources.dbms.DbmsPool</provider> --> <provider>jeeves.resources.dbms.ApacheDBCPool</provider> <config> <user>www-data</user> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |