
com.github.javaclub.cdl.client.matrix.jdbc.SMatrixConnection Maven / Gradle / Ivy
The newest version!
package com.github.javaclub.cdl.client.matrix.jdbc;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import com.github.javaclub.cdl.client.config.DbConfigManager;
import com.github.javaclub.cdl.client.matrix.jdbc.adapter.AbstractConnectionAdapter;
import com.github.javaclub.cdl.client.matrix.router.SQLRouteEngine;
import com.github.javaclub.cdl.client.matrix.rule.RouterStrategy;
public class SMatrixConnection extends AbstractConnectionAdapter {
private final DbConfigManager dbConfigManager;
private RouterStrategy routerStrategy;
private Map connectionMap = new HashMap<>();
// private int currents = 8; // 每组数据源内8个并发连接上限,多于8个(如组内有32张分表)则复用这8个连接
private AtomicInteger rid = new AtomicInteger();
private SQLRouteEngine sqlRouteEngine;
public SMatrixConnection(DbConfigManager dbConfigManager,RouterStrategy routerStrategy) {
super();
this.dbConfigManager = dbConfigManager;
sqlRouteEngine = new SQLRouteEngine(routerStrategy);
this.routerStrategy = routerStrategy;
}
/**
* 根据数据源组名称获取相应的数据库连接.
*
* @param groupName 数据源组名称
* @return 数据库连接
*/
public Connection getConnection(final String groupName) throws SQLException {
if(connectionMap.containsKey(groupName)){
return connectionMap.get(groupName);
}
Connection connection = dbConfigManager.getSGroupDataSource(groupName).getConnection();
replayMethodsInvovation(connection);
connectionMap.put(groupName,connection);
return connection;
}
@Override
public DatabaseMetaData getMetaData() throws SQLException {
if(connectionMap.isEmpty()){
String oneShardTable = routerStrategy.getShardingColumn().keySet().iterator().next();
String groupName = routerStrategy.getAllActualTable(oneShardTable).keySet().iterator().next();
Connection connection = dbConfigManager.getSGroupDataSource(groupName).getConnection();
if(!connectionMap.containsKey(groupName)){
connectionMap.put(groupName, connection);
}
}
return connectionMap.values().iterator().next().getMetaData();
}
@Override
public PreparedStatement prepareStatement(final String sql) throws SQLException {
return new SMatrixPreparedStatement(sqlRouteEngine, this, sql);
}
@Override
public PreparedStatement prepareStatement(final String sql, final int resultSetType, final int resultSetConcurrency) throws SQLException {
return new SMatrixPreparedStatement(sqlRouteEngine, this, sql, resultSetType, resultSetConcurrency);
}
@Override
public PreparedStatement prepareStatement(final String sql, final int resultSetType, final int resultSetConcurrency, final int resultSetHoldability) throws SQLException {
return new SMatrixPreparedStatement(sqlRouteEngine, this, sql, resultSetType, resultSetConcurrency, resultSetHoldability);
}
@Override
public PreparedStatement prepareStatement(final String sql, final int autoGeneratedKeys) throws SQLException {
return new SMatrixPreparedStatement(sqlRouteEngine, this, sql, autoGeneratedKeys);
}
@Override
public PreparedStatement prepareStatement(final String sql, final int[] columnIndexes) throws SQLException {
return new SMatrixPreparedStatement(sqlRouteEngine, this, sql, columnIndexes);
}
@Override
public PreparedStatement prepareStatement(final String sql, final String[] columnNames) throws SQLException {
return new SMatrixPreparedStatement(sqlRouteEngine, this, sql, columnNames);
}
@Override
public Statement createStatement() throws SQLException {
return new SMatrixStatement(sqlRouteEngine, this);
}
@Override
public Statement createStatement(final int resultSetType, final int resultSetConcurrency) throws SQLException {
return new SMatrixStatement(sqlRouteEngine, this, resultSetType, resultSetConcurrency);
}
@Override
public Statement createStatement(final int resultSetType, final int resultSetConcurrency, final int resultSetHoldability) throws SQLException {
return new SMatrixStatement(sqlRouteEngine, this, resultSetType, resultSetConcurrency, resultSetHoldability);
}
@Override
public Collection getConnections() {
List conns = new ArrayList<>();
conns.addAll(connectionMap.values());
return conns;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy