📄 xadatasourceimpl.java
字号:
/*
* Licensed under the X license (see http://www.x.org/terms.htm)
*/
package org.ofbiz.minerva.pool.jdbc.xa.wrapper;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.XAConnection;
import javax.sql.XADataSource;
import org.apache.log4j.Logger;
/**
* Transactional DataSource wrapper for JDBC 1.0 drivers. This is very
* lightweight - it just passes requests through to an underlying driver, and
* wraps the results with an XAConnection. The XAConnection and corresponding
* XAResource are responsible for closing the connection when appropriate.
* Note that the underlying driver may perform pooling, but need not. This
* class does not add any pooling capabilities.
*
* @author Aaron Mulder (ammulder@alumni.princeton.edu)
*/
public class XADataSourceImpl implements XADataSource {
private String url;
private String user;
private String password;
private String driverName;
private Driver driver;
private Properties properties;
private int loginTimeout;
private PrintWriter logWriter;
private boolean saveStackTrace;
private static Logger log = Logger.getLogger(XADataSourceImpl.class);
/**
* Empty constructure for beans, reflection, etc.
*/
public XADataSourceImpl() {
}
/**
* Specifies the URL and properties to connect to the underlying driver.
* If the properties are null, they will not be used.
*/
public XADataSourceImpl(String url, Properties properties) {
this.url = url;
this.properties = properties;
}
/**
* Gets the JDBC URL used to open an underlying connection.
*/
public String getURL() {
return url;
}
/**
* Sets the JDBC URL used to open an underlying connection.
*/
public void setURL(String url) {
this.url = url;
}
/**
* Gets the JDBC user name used to open an underlying connection.
*/
public String getUser() {
return user;
}
/**
* Sets the JDBC user name used to open an underlying connection.
* This is optional - use it only if your underlying driver requires it.
*/
public void setUser(String user) {
this.user = user;
}
/**
* Gets the JDBC password used to open an underlying connection.
*/
public String getPassword() {
return password;
}
/**
* Sets the JDBC password used to open an underlying connection.
* This is optional - use it only if your underlying driver requires it.
*/
public void setPassword(String password) {
this.password = password;
}
public void setDriver(String driverName) {
this.driverName = driverName;
}
/**
* Gets the JDBC properties used to open an underlying connection.
*/
public Properties getProperties() {
return properties;
}
/**
* Sets the JDBC properties used to open an underlying connection.
* This is optional - use it only if your underlying driver requires it.
*/
public void setProperties(Properties properties) {
this.properties = properties;
}
/**
* 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 saveStackTrace;
}
public void setSaveStackTrace(boolean save) {
saveStackTrace = save;
}
/**
* Gets the log writer used to record when XAConnections are opened.
*/
public PrintWriter getLogWriter() throws SQLException {
return logWriter;
}
/**
* Sets a log writer used to record when XAConnections are opened.
*/
public void setLogWriter(PrintWriter writer) throws SQLException {
if (writer == null) {
logWriter = null;
}
}
/**
* This is not used by the current implementation, since the effect would
* differ depending on the underlying driver.
*/
public int getLoginTimeout() throws SQLException {
return loginTimeout;
}
/**
* This is not used by the current implementation, since the effect would
* differ depending on the underlying driver.
*/
public void setLoginTimeout(int timeout) throws SQLException {
loginTimeout = timeout;
}
private void loadDriver() throws SQLException {
if (driver == null) {
try {
driver = (Driver) Class.forName(driverName, true, Thread.currentThread().getContextClassLoader()).newInstance();
DriverManager.registerDriver(driver);
} catch (ClassNotFoundException e) {
log.warn("unable to load driver", e);
} catch (InstantiationException e) {
log.warn("unable to instantiate driver", e);
} catch (IllegalAccessException e) {
log.warn("illegal access exception", e);
}
}
}
/**
* Gets an XAConnection. This first gets a java.sql.Connection from the
* underlying driver, and then wraps it in an XAConnection and XAResource.
* This uses the URL, user, password, and properties (or as many as you
* have specified) to make the connection.
*/
public XAConnection getXAConnection() throws SQLException {
loadDriver();
Connection con;
if (user != null && user.length() > 0)
con = DriverManager.getConnection(url, user, password);
else if (properties != null)
con = DriverManager.getConnection(url, properties);
else
con = DriverManager.getConnection(url);
try {
con.setAutoCommit(false);
} catch (SQLException e) {
log.warn("Unable to disable auto-commit on " + con.getClass().getName());
}
XAResourceImpl res = new XAResourceImpl(con);
XAConnectionImpl xacon = new XAConnectionImpl(con, res, saveStackTrace);
res.setXAConnection(xacon);
log.debug("created new Connection(" + con.getClass().getName() + ") with XAResource " + res.getClass().getName() + " and XAConnection " + xacon.getClass().getName() + ".");
return xacon;
}
/**
* Gets an XAConnection. This first gets a java.sql.Connection from the
* underlying driver, and then wraps it in an XAConnection and XAResource.
* Note that we never change the default userid and password, but instead
* only set the userid and password for this one connection.
*/
public XAConnection getXAConnection(String user, String password) throws SQLException {
loadDriver();
Connection con = DriverManager.getConnection(url, user, password);
try {
con.setAutoCommit(false);
} catch (SQLException e) {
if (logWriter != null)
logWriter.println("XADataSource unable to disable auto-commit on " + con.getClass().getName());
}
XAResourceImpl res = new XAResourceImpl(con);
XAConnectionImpl xacon = new XAConnectionImpl(con, res, saveStackTrace);
res.setXAConnection(xacon);
xacon.setUser(user);
xacon.setPassword(password);
log.debug(" created new Connection (" + con.getClass().getName() + ") with XAResource " + res.getClass().getName() + " and XAConnection with userid and password " + xacon.getClass().getName());
return xacon;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -