📄 jdbcconnectionfactory.java
字号:
/*
* Licensed under the X license (see http://www.x.org/terms.htm)
*/
package org.ofbiz.minerva.pool.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.ofbiz.minerva.pool.ObjectPool;
import org.ofbiz.minerva.pool.PoolObjectFactory;
import org.ofbiz.minerva.pool.cache.ObjectCache;
/**
* Object factory that creates java.sql.Connections. This is meant for use
* outside a J2EE/JTA environment - servlets alone, client/server, etc. If
* you're interested in creating transactional-aware connections, see
* XAConnectionFactory, which complies with the JDBC 2.0 standard extension.
* @see org.ofbiz.minerva.pool.jdbc.xa.XAConnectionFactory
*
* @author Aaron Mulder (ammulder@alumni.princeton.edu)
*/
public class JDBCConnectionFactory extends PoolObjectFactory {
private String url;
private Properties props;
private String userName;
private String password;
private int psCacheSize = 10;
private ObjectPool pool;
private static Logger log = Logger.getLogger(JDBCConnectionFactory.class);
/**
* Creates a new factory. You must configure it with JDBC properties
* before you can use it.
*/
public JDBCConnectionFactory() {
}
/**
* Sets the JDBC URL used to create new connections.
*/
public void setConnectURL(String url) {
this.url = url;
}
/**
* Gets the JDBC URL used to create new connections.
*/
public String getConnectURL() {
return url;
}
/**
* Sets the JDBC Propeties used to create new connections.
* This is optional, and will only be used if present.
*/
public void setConnectProperties(Properties props) {
this.props = props;
}
/**
* Gets the JDBC Properties used to create new connections.
*/
public Properties getConnectProperties() {
return props;
}
/**
* Sets the JDBC user name used to create new connections.
* This is optional, and will only be used if present.
*/
public void setUser(String userName) {
this.userName = userName;
}
/**
* Gets the JDBC user name used to create new connections.
*/
public String getUser() {
return userName;
}
/**
* Sets the JDBC password used to create new connections.
* This is optional, and will only be used if present.
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Gets the JDBC password used to create new connections.
*/
public String getPassword() {
return password;
}
/**
* Sets the number of PreparedStatements to be cached for each
* Connection. Your DB product may impose a limit on the number
* of open PreparedStatements. The default value is 10.
*/
public void setPSCacheSize(int size) {
psCacheSize = size;
}
/**
* Gets the number of PreparedStatements to be cached for each
* Connection. The default value is 10.
*/
public int getPSCacheSize() {
return psCacheSize;
}
/**
* Validates that connection properties were set (at least a URL).
*/
public void poolStarted(ObjectPool pool) {
if (log.isDebugEnabled())
log.debug("Starting");
super.poolStarted(pool);
if (url == null) {
log.error("Must specify JDBC connection URL");
throw new IllegalStateException("Must specify JDBC connection URL to " + getClass().getName());
}
this.pool = pool;
}
/**
* Cleans up.
*/
public void poolClosing(ObjectPool pool) {
if (log.isDebugEnabled())
log.debug("Stopping");
super.poolClosing(pool);
this.pool = null;
}
/**
* Creates a new JDBC Connection.
*/
public Object createObject(Object parameters) throws Exception {
log.debug("Opening new connection");
try {
if (userName != null && userName.length() > 0)
return DriverManager.getConnection(url, userName, password);
else if (props != null)
return DriverManager.getConnection(url, props);
else
return DriverManager.getConnection(url);
} catch (SQLException e) {
log.error("SQL Error", e);
throw e;
}
}
/**
* Wraps the connection with a ConnectionInPool.
* @see org.ofbiz.minerva.pool.jdbc.ConnectionInPool
*/
public Object prepareObject(Object pooledObject) {
Connection con = (Connection) pooledObject;
ConnectionInPool wrapper = new ConnectionInPool(con);
wrapper.setPSCacheSize(psCacheSize);
return wrapper;
}
/**
* Returns the original connection from a ConnectionInPool.
* @see org.ofbiz.minerva.pool.jdbc.ConnectionInPool
*/
public Object translateObject(Object clientObject) {
return ((ConnectionInPool) clientObject).getUnderlyingConnection();
}
/**
* Closes all outstanding work for the connection, rolls it back, and
* returns the underlying connection to the pool.
*/
public Object returnObject(Object clientObject) {
ConnectionInPool wrapper = (ConnectionInPool) clientObject;
Connection con = wrapper.getUnderlyingConnection();
try {
wrapper.reset();
} catch (SQLException e) {
pool.markObjectAsInvalid(clientObject);
}
return con;
}
/**
* Closes a connection.
*/
public void deleteObject(Object pooledObject) {
Connection con = (Connection) pooledObject;
try {
con.rollback();
} catch (SQLException ignored) {
}
// Removed all the cached PreparedStatements for this Connection
ObjectCache cache = (ObjectCache) ConnectionInPool.psCaches.remove(con);
if (cache != null)
cache.close();
try {
con.close();
} catch (SQLException ignored) {
}
}
}
/*
vim:tabstop=3:et:shiftwidth=3
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -