package cn.dreampie.orm;
import cn.dreampie.common.Constant;
import cn.dreampie.log.Logger;
import cn.dreampie.orm.dialect.Dialect;
import cn.dreampie.orm.exception.TransactionException;
import cn.dreampie.orm.provider.DataSourceProvider;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* ConnectionAccess
*/
public class DataSourceMeta {
private static final Logger logger = Logger.getLogger(DataSourceMeta.class);
//不能使用static 让每个数据源都有一个connectionHolder
private final ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();
private final ThreadLocal<TransactionManager> transactionManagerHolder = new ThreadLocal<TransactionManager>();
private final ThreadLocal<Integer> transactionDeepHolder = new ThreadLocal<Integer>();
private final String dsmName;
private DataSourceProvider writeDataSourceProvider;
private DataSourceProvider readDataSourceProvider;
public DataSourceMeta(DataSourceProvider writeDataSourceProvider) {
this(writeDataSourceProvider.getDsName(), writeDataSourceProvider, null);
}
public DataSourceMeta(String dsmName, DataSourceProvider writeDataSourceProvider, DataSourceProvider readDataSourceProvider) {
this.dsmName = dsmName;
this.writeDataSourceProvider = writeDataSourceProvider;
this.readDataSourceProvider = readDataSourceProvider;
if (readDataSourceProvider != null && !writeDataSourceProvider.getDialect().equals(readDataSourceProvider.getDialect())) {
throw new IllegalArgumentException("Different read and write database dialect");
}
}
public String getDsmName() {
return dsmName;
}
public Dialect getDialect() {
return writeDataSourceProvider.getDialect();
}
public String getWriteDsName() {
return writeDataSourceProvider.getDsName();
}
DataSource getWriteDataSource() {
return writeDataSourceProvider.getDataSource();
}
public boolean isWriteShowSql() {
return writeDataSourceProvider.isShowSql();
}
public String getReadDsName() {
if (readDataSourceProvider != null) {
return readDataSourceProvider.getDsName();
} else {
return getWriteDsName();
}
}
DataSource getReadDataSource() {
if (readDataSourceProvider != null) {
return readDataSourceProvider.getDataSource();
} else {
return getWriteDataSource();
}
}
public boolean isReadShowSql() {
if (readDataSourceProvider != null) {
return readDataSourceProvider.isShowSql();
} else {
return isWriteShowSql();
}
}
/**
* 获取连接对象
*
* @return 连接对象
* @throws SQLException
*/
public Connection getWriteConnection() throws SQLException {
Connection conn = connectionHolder.get();
if (conn != null) {
return conn;
}
return getWriteDataSource().getConnection();
}
public Connection getReadConnection() throws SQLException {
Connection conn = connectionHolder.get();
if (conn != null) {
return conn;
}
if (readDataSourceProvider != null) {
return getReadDataSource().getConnection();
} else {
return getWriteDataSource().getConnection();
}
}
/**
* 当前连接对象
*
* @return connection
*/
Connection getCurrentConnection() {
return connectionHolder.get();
}
/**
* 设置当前连接对象
*
* @param connection connection
*/
void setCurrentConnection(Connection connection) {
connectionHolder.set(connection);
}
/**
* 移除连接对象
*/
void rmCurrentConnection() {
connectionHolder.remove();
}
/**
* 初始化事务对象
*/
public void initTransaction(boolean readonly, int level) {
if (transactionManagerHolder.get() == null) {
transactionManagerHolder.set(new TransactionManager(this, readonly, level));
transactionDeepHolder.set(1);
} else {
transactionDeepHolder.set(transactionDeepHolder.get() + 1);
}
}
/**
* 开始事务
*
* @throws TransactionException
*/
public void beginTransaction() throws TransactionException {
TransactionManager transactionManager = transactionManagerHolder.get();
//当前事务管理对象
if (transactionManager != null && !transactionManager.isBegined()) {
transactionManager.begin();
}
}
/**
* 提交事务
*
* @throws TransactionException
*/
public void commitTransaction() throws TransactionException {
if (transactionDeepHolder.get() == 1) {
TransactionManager transactionManager = transactionManagerHolder.get();
if (transactionManager != null) {
transactionManager.commit();
}
}
}
/**
* 回滚事务
*
* @throws TransactionException
*/
public void rollbackTransaction() {
if (transactionDeepHolder.get() == 1) {
TransactionManager transactionManager = transactionManagerHolder.get();
if (transactionManager != null) {
transactionManager.rollback();
}
}
}
/**
* 结束事务
*
* @throws TransactionException
*/
public void endTranasaction() {
if (transactionDeepHolder.get() == 1) {
TransactionManager transactionManager = transactionManagerHolder.get();
if (transactionManager != null) {
transactionManager.end();
}
transactionManagerHolder.remove();
} else {
transactionDeepHolder.set(transactionDeepHolder.get() - 1);
}
}
/**
* 关闭数据源
*/
public final void close() {
Connection connection = connectionHolder.get();
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
logger.warn("Could not close connection!", e);
}
if (!Constant.devEnable) {
writeDataSourceProvider.close();
if (readDataSourceProvider != null) {
readDataSourceProvider.close();
}
}
}
/**
* 关ResultSet闭结果级对象
*
* @param rs ResultSet
* @param st Statement
* @param conn Connection
*/
public final void close(ResultSet rs, Statement st, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
logger.warn("Could not close resultSet!", e);
}
}
//关闭连接
close(st, conn);
}
/**
* 关闭Statement
*
* @param st Statement
* @param conn Connection
*/
public final void close(Statement st, Connection conn) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
logger.warn("Could not close statement!", e);
}
}
//关闭连接
close(conn);
}
/**
* 关闭Connection
*
* @param conn Connection
*/
public final void close(Connection conn) {
if (connectionHolder.get() == null) { // in transaction if conn in threadlocal
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
logger.warn("Could not close connection!", e);
}
}
}
}