📄 jdbcpooldatasource.java
字号:
/* * Licensed under the X license (see http://www.x.org/terms.htm) */package org.ofbiz.minerva.pool.jdbc;import java.io.PrintWriter;import java.sql.Connection;import java.util.Collection;import java.util.HashMap;import java.util.HashSet;import java.util.Hashtable;import java.util.Properties;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.Name;import javax.naming.NamingException;import javax.naming.RefAddr;import javax.naming.Reference;import javax.naming.Referenceable;import javax.naming.StringRefAddr;import javax.naming.spi.ObjectFactory;import javax.sql.DataSource;import org.apache.log4j.Logger;import org.ofbiz.base.util.Log4jLoggerWriter;import org.ofbiz.minerva.pool.ObjectPool;/** * DataSource for non-transactional JDBC pools. This handles configuration * parameters for both the pool and the JDBC driver. It is important that you * set all the configuration parameters before you initialize the DataSource, * and you must initialize it before you use it. All the configuration * parameters are not documented here; you are instead referred to ObjectPool * and JDBCConnectionFactory. * @see org.ofbiz.minerva.pool.ObjectPool * @see org.ofbiz.minerva.pool.jdbc.JDBCConnectionFactory * * @author Aaron Mulder (ammulder@alumni.princeton.edu) */public class JDBCPoolDataSource implements DataSource, Referenceable, ObjectFactory { private static Logger log = Logger.getLogger(JDBCPoolDataSource.class); private static HashMap sources = new HashMap(); /** * Gets all the current JDBC pool data sources. */ public static Collection getDataSources() { return new HashSet(sources.values()); } /** * Gets a specific JDBC pool data source by pool name. */ public static JDBCPoolDataSource getDataSource(String poolName) { return (JDBCPoolDataSource) sources.get(poolName); } private ObjectPool pool; private JDBCConnectionFactory factory; private PrintWriter logWriter; private int timeout; private boolean initialized = false; private String jndiName; /** * Creates a new JDBC pool data source. Be sure to configure it and then * call initialize before you try to use it. */ public JDBCPoolDataSource() { pool = new ObjectPool(); factory = new JDBCConnectionFactory(); PoolDriver.instance(); } // Unique properties /** * If you use this to set a JNDI name, this pool will be bound to that name * using the default InitialContext. You can also do this manually if you * have additional requirements. */ public void setJNDIName(String name) throws NamingException { InitialContext ctx = new InitialContext(); if (jndiName != null && !jndiName.equals(name)) ctx.unbind(jndiName); if (name != null) ctx.bind(name, this); jndiName = name; } /** * Gets the JNDI name this pool is bound to. Only valid if you used * setJNDIName to bind it. * @see #setJNDIName */ public String getJNDIName() { return jndiName; } // JDBC properties public void setJDBCURL(String url) { factory.setConnectURL(url); } public String getJDBCURL() { return factory.getConnectURL(); } public void setJDBCProperties(Properties props) { factory.setConnectProperties(props); } public void setProperties(String props) { setJDBCProperties(parseProperties(props)); } public Properties getJDBCProperties() { return factory.getConnectProperties(); } public void setJDBCUser(String user) { factory.setUser(user); } public String getJDBCUser() { return factory.getUser(); } public void setJDBCPassword(String password) { factory.setPassword(password); } public String getJDBCPassword() { return factory.getPassword(); }// Pool properties public void setPoolName(String name) { pool.setName(name); sources.put(pool.getName(), this); } public String getPoolName() { return pool.getName(); } public void setMinSize(int size) { pool.setMinSize(size); } public int getMinSize() { return pool.getMinSize(); } public void setMaxSize(int size) { pool.setMaxSize(size); } public int getMaxSize() { return pool.getMaxSize(); } public void setBlocking(boolean blocking) { pool.setBlocking(blocking); } public boolean isBlocking() { return pool.isBlocking(); } public void setIdleTimeoutEnabled(boolean allowShrinking) { pool.setIdleTimeoutEnabled(allowShrinking); } public boolean isIdleTimeoutEnabled() { return pool.isIdleTimeoutEnabled(); } public void setGCEnabled(boolean allowGC) { pool.setGCEnabled(allowGC); } public boolean isGCEnabled() { return pool.isGCEnabled(); } public void setMaxIdleTimeoutPercent(float percent) { pool.setMaxIdleTimeoutPercent(percent); } public float getMaxIdleTimeoutPercent() { return pool.getMaxIdleTimeoutPercent(); } public void setIdleTimeout(long millis) { pool.setIdleTimeout(millis); } public long getIdleTimeout() { return pool.getIdleTimeout(); } public void setGCMinIdleTime(long millis) { pool.setGCMinIdleTime(millis); } public long getGCMinIdleTime() { return pool.getGCMinIdleTime(); } public void setGCInterval(long millis) { pool.setGCInterval(millis); } public long getGCInterval() { return pool.getGCInterval(); } public void setInvalidateOnError(boolean invalidate) { pool.setInvalidateOnError(invalidate); } public boolean isInvalidateOnError() { return pool.isInvalidateOnError(); } public void setTimestampUsed(boolean timestamp) { pool.setTimestampUsed(timestamp); } public boolean isTimestampUsed() { return pool.isTimestampUsed(); }// Other methods /** * Initializes the pool. You need to have configured all the pool and * JDBC properties first. */ public void initialize() { initialized = true; pool.setObjectFactory(factory); pool.initialize(); } /** * Returns a string describing the pool status (number of connections * created, used, and maximum). */ public String getPoolStatus() { return pool.toString(); } /** * Shuts down this data source and the underlying pool. If you used * setJNDI name to bind it in JNDI, it is unbound. */ public void close() { try { setJNDIName(null); } catch (NamingException e) { log.warn("Can't unbind from JNDI", e); } sources.remove(pool.getName()); pool.shutDown(); pool = null; factory = null; } /** * Gets a connection from the pool. */ public Connection getConnection() throws java.sql.SQLException { if (!initialized) initialize(); return (Connection) pool.getObject(); } /** * Gets a connection from the pool. If a new connection must be * created, it will use the specified user name and password. If there is * a connection available in the pool, it will be used, regardless of the * user name and password use to created it initially. */ public Connection getConnection(String user, String password) throws java.sql.SQLException { if (!initialized) initialize(); factory.setUser(user); factory.setPassword(password); return (Connection) pool.getObject(); } /** * Gets a log writer used to record pool events. */ public PrintWriter getLogWriter() throws java.sql.SQLException { return logWriter; } /** * Sets a log writer used to record pool events. */ public void setLogWriter(PrintWriter writer) throws java.sql.SQLException { if (writer == null) { logWriter = null; } else { if (logWriter == null) { logWriter = new Log4jLoggerWriter(log); } } } /** * This property is not used by this implementation. */ public int getLoginTimeout() throws java.sql.SQLException { return timeout; } /** * This property is not used by this implementation. */ public void setLoginTimeout(int timeout) throws java.sql.SQLException { this.timeout = timeout; } /** * This method is used for parsing JDBCProperties */ private static Properties parseProperties(String string) { Properties props = new Properties(); if (string == null || string.length() == 0) return props; int lastPos = -1; int pos = string.indexOf(";"); while (pos > -1) { addProperty(props, string.substring(lastPos + 1, pos)); lastPos = pos; pos = string.indexOf(";", lastPos + 1); } addProperty(props, string.substring(lastPos + 1)); return props; } /** * This method is used for parsing JDBCProperties */ private static void addProperty(Properties props, String property) { int pos = property.indexOf("="); if (pos < 0) { System.err.println("Unable to parse property '" + property + "' - please use 'name=value'"); return; } props.setProperty(property.substring(0, pos), property.substring(pos + 1)); } // Referenceable implementation ---------------------------------- /** * Gets a reference to this data source. */ public Reference getReference() { return new Reference(getClass().getName(), new StringRefAddr("JDBCPool", pool.getName()), getClass().getName(), null); } // ObjectFactory implementation ---------------------------------- /** * Decodes a reference to a specific pool data source. */ public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) { if (obj instanceof Reference) { Reference ref = (Reference) obj; if (ref.getClassName().equals(getClass().getName())) { RefAddr addr = ref.get("JDBCPool"); return sources.get(addr.getContent()); } } return null; }}/*vim:tabstop=3:et:shiftwidth=3*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -