All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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