Анализ исходного кода sharding-JDBC (1) Реализация стандартного интерфейса JDBC

Java
Анализ исходного кода sharding-JDBC (1) Реализация стандартного интерфейса JDBC

Я надеюсь, что после прочтения серии статей Sharding-JDBC читатели овладеют основными знаниями о подбазе данных и подтаблице, поймут принцип реализации и самостоятельно реализуют простые встроенные компоненты подтаблицы подбазы данных. , надеюсь, читатели задумаются, почему подтаблица подбазы? А проблемы, вызванные подбазой данных и подтаблицей? А как быть с такими вопросами и т.д., это тоже общеизвестный момент на собеседованиях.

1. Стандартный интерфейс JDBC

JDBC является одной из стандартных спецификаций J2EE.J2EE представляет собой серию спецификаций, разработанных для стандартизации JAVA для разработки приложений уровня предприятия, и JDBC не является исключением.

JDBC является стандартным Java API для независимых от базы данных соединений между языком программирования Java и базами данных. Другими словами, чтобы использовать язык Java для подключения к базе данных для работы, вам необходимо использовать JDBC API.

Унифицированный интерфейс API JDBC скрывает детали базовой базы данных и может использовать согласованное кодирование (кросс-база данных) для работы с базой данных. JAVA применяется к соединению доступа к базе данных через JDBC для разделения, которые могут быть разработаны независимо друг от друга и могут использоваться в комбинации.

Драйвер, предоставляемый каждой базой данных, реализует стандартный API JDBC для доступа к базе данных, и приложение не нужно адаптировать на уровне кодирования для доступа к различным базам данных.

Обработка Sharding-JDBC не исключение, принцип тот же. sharding-JDBC реализует стандартный протокол JDBC и предоставляет внешние интерфейсы, такие как ShardingConnection, ShardingStatement и т. д. для внешнего использования.После очистки JDBC, Sharding-JDBC легко понять.Давайте проанализируем четыре основных интерфейса sharding-JDBC, а затем обсудим шардинг-JDBC.шардинг для краткости

2. Реализация четырех основных интерфейсов JDBC

2.1. Подключение

В сегментировании shardingConnection реализует стандартный интерфейс JDBC Connection.Во-первых, посмотрите на диаграмму классов ниже.

Абстрактный класс AbstractUnsupportedOperationConnection реализует собственный интерфейс Connection и выдает исключение в этом классе для методов, которые не поддерживают Connection в сегментировании.

 @Override
    public final CallableStatement prepareCall(final String sql) throws SQLException {
        throw new SQLFeatureNotSupportedException("prepareCall");
    }
   ......
    
    @Override
    public final CallableStatement prepareCall(final String sql, final int resultSetType, final int resultSetConcurrency) throws SQLException {
        throw new SQLFeatureNotSupportedException("prepareCall");
    }

AbstractConnectionAdapter реализует функциональную логику, включая создание соединений, закрытие соединений и т. д. В этом классе необходимо освоить три вещи, которые я лично считаю хорошими и которые могут улучшить возможности кодирования.

  • Класс ForceExecuteTemplate предоставляет параметр метода шаблона выполнения как коллекцию и интерфейс обратного вызова callbackForceExecuteCallback.
    public void execute(final Collection<T> targets, final ForceExecuteCallback<T> callback) throws SQLException {
        Collection<SQLException> exceptions = new LinkedList<>();
        for (T each : targets) {
            try {
                callback.execute(each);
            } catch (final SQLException ex) {
                exceptions.add(ex);
            }
        }
        throwSQLExceptionIfNecessary(exceptions);
    }

Испытайте преимущества написания этого для себя.

  • Метод ловушки RootInvokeHook

Регистрация метода ловушки с помощью метода SPI и запись процесса вызова могут быть реализованы различными способами.Этот метод расширения является более гибким и легко расширяемым, и его можно легко адаптировать к различным платформам для сбора информации о цепочке вызовов.

public interface RootInvokeHook {
    
    /**
     * Handle when root invoke started.
     */
    void start();
    
    /**
     * Handle when root invoke finished.
     * 
     * @param connectionCount connection count
     */
    void finish(int connectionCount);
}

Реализация SPI

public final class SPIRootInvokeHook implements RootInvokeHook {
    
    private final Collection<RootInvokeHook> rootInvokeHooks = NewInstanceServiceLoader.newServiceInstances(RootInvokeHook.class);
    
    static {
        NewInstanceServiceLoader.register(RootInvokeHook.class);
    }
    
    @Override
    public void start() {
        for (RootInvokeHook each : rootInvokeHooks) {
            each.start();
        }
    }
    
    @Override
    public void finish(final int connectionCount) {
        for (RootInvokeHook each : rootInvokeHooks) {
            each.finish(connectionCount);
        }
    }
}

Процесс запуска вызова

 protected AbstractConnectionAdapter() {
        rootInvokeHook.start();
    }

Процесс заканчивается

 public final void close() throws SQLException {
        closed = true;
        MasterVisitedManager.clear();
        TransactionTypeHolder.clear();
        int connectionSize = cachedConnections.size();
        try {
            forceExecuteTemplateForClose.execute(cachedConnections.entries(), new ForceExecuteCallback<Entry<String, Connection>>() {
        
                @Override
                public void execute(final Entry<String, Connection> cachedConnections) throws SQLException {
                    cachedConnections.getValue().close();
                }
            });
        } finally {
            cachedConnections.clear();
            rootInvokeHook.finish(connectionSize);
        }
    }

Вы можете использовать метод ловушки для подсчета времени выполнения SQL и т. д. Этот метод разработки расширения можно изучить.

2.2 Заявление

В сегментировании shardingStatement реализует интерфейс Statement, а shardingPrepareStatement реализует PreparedStatement.

Функция абстрактного класса в основном аналогична функции Connection, здесь она не будет повторяться, в основном она зависит от shardingstatement и SharingPrepareStatement.

2.3, набор результатов

shardingResultSet в sharding-JDBC реализует интерфейс ResultSet, который в основном обрабатывает набор результатов.Один набор результатов, который ранее работал в сценарии с одной базой данных, теперь может возвращать несколько результатов, и набор результатов необходимо обработать.

shardingResultSet имеет переменную-член

private final MergedResult mergeResultSet

Это интерфейс, который в основном имеет дело с различными наборами результатов, вы можете понять общий смысл, взглянув на реализацию.

Детали здесь не анализируются, и позже будет отдельная глава для анализа набора результатов. Слияние результирующих наборов — сложный момент в реализации промежуточного программного обеспечения подбазы данных и подтаблицы.

2.4. Источник данных

ShardingDataSource реализует интерфейс DataSource и предоставляет метод для получения соединения.

    @Override
    public final ShardingConnection getConnection() {
        return new ShardingConnection(getDataSourceMap(), runtimeContext, TransactionTypeHolder.get());
    }

3. Заключение

Он в основном вводит стандартный протокол JDBC, реализованный Sharding-JDBC, а также запись в Sharding-JDBC, который является важной точкой знаний для внедрения ORM, таких как MyBatis и т. Д. В следующих главах, подставку суб-базы данных Модуль маршрутизации маршрутизации, SQL Исходный код модуля выполнения и модуль слияния результатов будет проанализирован подробно. Я надеюсь, что после прочтения этой серии статей читатели могут реализовать упрощенную версию подставной базы данных и подсуди. компоненты сами по себе.