Я надеюсь, что после прочтения серии статей Sharding-JDBC читатели овладеют основными знаниями о подбазе данных и подтаблице, поймут принцип реализации и самостоятельно реализуют простые встроенные компоненты подтаблицы подбазы данных. , надеюсь, читатели задумаются, почему подтаблица подбазы? А проблемы, вызванные подбазой данных и подтаблицей? А как быть с такими вопросами и т.д., это тоже общеизвестный момент на собеседованиях.
1. Стандартный интерфейс JDBC
JDBC является одной из стандартных спецификаций J2EE.J2EE представляет собой серию спецификаций, разработанных для стандартизации JAVA для разработки приложений уровня предприятия, и JDBC не является исключением.
JDBC является стандартным Java API для независимых от базы данных соединений между языком программирования Java и базами данных. Другими словами, чтобы использовать язык Java для подключения к базе данных для работы, вам необходимо использовать JDBC API.
Унифицированный интерфейс API JDBC скрывает детали базовой базы данных и может использовать согласованное кодирование (кросс-база данных) для работы с базой данных. JAVA применяется к соединению доступа к базе данных через JDBC для разделения, которые могут быть разработаны независимо друг от друга и могут использоваться в комбинации.
Драйвер, предоставляемый каждой базой данных, реализует стандартный API 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 Исходный код модуля выполнения и модуль слияния результатов будет проанализирован подробно. Я надеюсь, что после прочтения этой серии статей читатели могут реализовать упрощенную версию подставной базы данных и подсуди. компоненты сами по себе.