⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xapooldatasource.java

📁 Sequoia ERP是一个真正的企业级开源ERP解决方案。它提供的模块包括:电子商务应用(e-commerce), POS系统(point of sales),知识管理,存货与仓库管理
💻 JAVA
字号:
/* * Licensed under the X license (see http://www.x.org/terms.htm) */package org.ofbiz.minerva.pool.jdbc.xa;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 javax.sql.XAConnection;import javax.sql.XADataSource;import javax.transaction.TransactionManager;import java.io.InvalidObjectException;import java.io.ObjectStreamException;import java.io.PrintWriter;import java.io.Serializable;import java.sql.Connection;import java.util.Collection;import java.util.HashMap;import java.util.HashSet;import java.util.Hashtable;import org.apache.log4j.Logger;import org.ofbiz.base.util.Log4jLoggerWriter;import org.ofbiz.minerva.pool.ObjectPool;/** * DataSource for transactional JDBC pools.  This handles configuration * parameters for both the pool and the JDBC connection.  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 XAConnectionFactory. * @see org.ofbiz.minerva.pool.ObjectPool * @see org.ofbiz.minerva.pool.jdbc.xa.XAConnectionFactory * * @author Aaron Mulder (ammulder@alumni.princeton.edu) * @author <a href="mailto:danch@nvisia.com">danch (Dan Christopherson)</a> * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * * Revision: * 20010701 danch added code for timeout in blocking. * 20010703 bill added code for transaction isolation and setting the ps cache size */public class XAPoolDataSource implements DataSource, Referenceable, ObjectFactory, Serializable        //just including Serializable to strongly indicate serialization support{    private transient static Logger log = Logger.getLogger(XAPoolDataSource.class);    private transient 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 XAPoolDataSource getDataSource(String poolName) {        return (XAPoolDataSource) sources.get(poolName);    }    private transient ObjectPool pool;    private transient XAConnectionFactory factory;    private transient PrintWriter logWriter;    private transient int timeout;    private transient boolean initialized = false;    //Unused cruft.    private transient String jndiName;    //what is actually used to bind in jndi by XADataSourceLoader.    private String name;    /**     * Creates a new XA pool data source.  Be sure to configure it and then     * call initialize before you try to use it.     */    public XAPoolDataSource() {        log.debug("Creating XA Pool");        pool = new ObjectPool();        factory = new XAConnectionFactory();        log.debug("Created factory");        XAPoolDriver.instance();        log.debug("got driver 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 {        if (log.isDebugEnabled())            log.debug("Binding to JNDI name " + name);        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;    }    // XA properties    public void setDataSource(XADataSource ds) {        factory.setDataSource(ds);    }    public XADataSource getDataSource() {        return factory.getDataSource();    }    public void setTransactionManager(TransactionManager tm) {        factory.setTransactionManager(tm);    }    //public String getTransactionManagerJNDIName() {return factory.getTransactionManagerJNDIName();}    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();    }    public int getTransactionIsolation() {        return factory.getTransactionIsolation();    }    public void setTransactionIsolation(int iso) {        factory.setTransactionIsolation(iso);    }    public void setTransactionIsolation(String iso) {        factory.setTransactionIsolation(iso);    }    public int getPSCacheSize() {        return factory.getPSCacheSize();    }    public void setPSCacheSize(int size) {        factory.setPSCacheSize(size);    }    public boolean getReleaseOnCommit() {        return factory.getReleaseOnCommit();    }    public void setReleaseOnCommit(boolean rel) {        factory.setReleaseOnCommit(rel);    }    /**     * Have XAClientConnections save a stack trace on creation     * This is useful for debugging non-closed connections.     * It must be used with ReleaseOnCommit option     */    public boolean getSaveStackTrace() {        return factory.getSaveStackTrace();    }    public void setSaveStackTrace(boolean save) {        factory.setSaveStackTrace(save);    }    // Pool properties    public void setPoolName(String name) {        //remember the name so we can look ourselves up on deserialization.        this.name = name;        pool.setName(name);        sources.put(pool.getName(), this);    }    public String getPoolName() {        return name;    }    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 setBlockingTimeout(int blockingTimeout) {        pool.setBlockingTimeout(blockingTimeout);    }    public int getBlockingTimeout() {        return pool.getBlockingTimeout();    }    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     * XA 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() {        if (log.isDebugEnabled())            log.debug("Closing DataSource");        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.     * Since no userid or password is specified, we get a connection using the default     * userid and password, specified when the factory was created.     */    public Connection getConnection() throws java.sql.SQLException {        if (!initialized) initialize();        log.debug("Getting a Connection");        String user = factory.getUser();        String password = factory.getPassword();        String[] params = {user, password};        XAConnection xaConn = (XAConnection) pool.getObject(params);        return xaConn.getConnection();    }    /**     * Gets a new 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();        log.debug("Getting a connection for user " + user + " with password " + password);        String[] params = {user, password};        XAConnection xaConn = (XAConnection) pool.getObject(params);        return xaConn.getConnection();    }    /**     * 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;    }    // Referenceable implementation ----------------------------------    /**     * Gets a reference to this data source.     */    public Reference getReference() {        return new Reference(getClass().getName(), new StringRefAddr("XAPool", 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("XAPool");                return sources.get(addr.getContent());            }        }        return null;    }    //deserialization to correct instance support    private Object readResolve() throws ObjectStreamException {        try {            InitialContext ctx = new InitialContext();            return ctx.lookup("java:/" + name);        } catch (NamingException e) {            throw new InvalidObjectException("problem finding correct datasource instance" + e);        } // end of try-catch    }}/*vim:tabstop=3:et:shiftwidth=3*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -