Spec-Zone .ru
спецификации, руководства, описания, API
|
Connector/J обеспечивает полезную реализацию выравнивания нагрузки для Кластера или мультиосновное
развертывание, как объяснено в Разделе 21.3.8, "Выравнивание
нагрузки с Connector/J". С Connector/J 5.1.12, эта та же самая реализация используется для того,
чтобы сбалансировать загрузку между ведомыми устройствами только для чтения с ReplicationDriver
.
Пытаясь сбалансировать рабочую нагрузку между многократными серверами, драйвер должен определить, когда
безопасно подкачать серверы, делая, таким образом, в середине транзакции, например, мог вызвать проблемы. Важно
не потерять информацию о состоянии. Поэтому Connector/J только попытается выбрать новый сервер, когда одно из
следующего произойдет:
В границах транзакции (транзакции явно фиксируются или откатываются).
Встречаются с коммуникационным исключением (государство SQL, запускающееся с "08").
Когда a SQLException
условия соответствий,
определенные пользователем, используя точки расширения, определенные loadBalanceSQLStateFailover
,
loadBalanceSQLExceptionSubclassFailover
или loadBalanceExceptionChecker
свойства.
Третье условие вращает приблизительно три новых свойства, начатые с Connector/J 5.1.13. Это позволяет Вам
управлять который SQLException
s инициировали failover.
loadBalanceExceptionChecker
- loadBalanceExceptionChecker
свойство является действительно ключом. Это берет полностью определенное имя class, которое реализует
новое com.mysql.jdbc.LoadBalanceExceptionChecker
интерфейс. Этот интерфейс
очень прост, и Вы только должны реализовать следующий метод:
public boolean shouldExceptionTriggerFailover(SQLException ex)
A SQLException
в передают, и булево возвратилось. Значение true
инициировал failover, false
не делает.
Можно использовать это, чтобы реализовать Вашу собственную логику. Пример, где это могло бы быть полезно, имея дело со случайными ошибками при использовании MySQL Cluster, где определенные буферы могут стать перегруженными. Следующий фрагмент кода иллюстрирует это:
public class NdbLoadBalanceExceptionChecker extends StandardLoadBalanceExceptionChecker { public boolean shouldExceptionTriggerFailover(SQLException ex) { return super.shouldExceptionTriggerFailover(ex) || checkNdbException(ex); } private boolean checkNdbException(SQLException ex){ // Have to parse the message since most NDB errors // are mapped to the same DEMC. return (ex.getMessage().startsWith("Lock wait timeout exceeded") || (ex.getMessage().startsWith("Got temporary error") && ex.getMessage().endsWith("from NDB"))); }}
Код выше расширяется com.mysql.jdbc.StandardLoadBalanceExceptionChecker
,
который является реализацией по умолчанию. Есть несколько удобных ярлыков, встроенных в это для тех,
кто хочет иметь некоторый уровень свойств использования управления, не пишущий код Java. Эта
реализация по умолчанию использует два остающихся свойства: loadBalanceSQLStateFailover
и loadBalanceSQLExceptionSubclassFailover
.
loadBalanceSQLStateFailover
- позволяет Вам определять
разграниченный запятой список SQLState
префиксы те кода, против который a
SQLException
сравнивается. Если префикс соответствует, failover
инициирован. Так, например, следующее инициировало бы failover если данный SQLException
запускается с "00", или "12345":
loadBalanceSQLStateFailover=00,12345
loadBalanceSQLExceptionSubclassFailover
- может
использоваться в соединении с loadBalanceSQLStateFailover
или
самостоятельно. Если Вы хотите определенные подклассы SQLException
чтобы
инициировать failover, просто обеспечьте разграниченный запятой список полностью определенного class или
имен интерфейса, чтобы проверить по. Например, если Вы хотите все SQLTransientConnectionExceptions
чтобы инициировать failover, Вы определили бы:
loadBalanceSQLExceptionSubclassFailover=java.sql.SQLTransientConnectionException
В то время как эти три перестали работать - по условиям, перечисленным, ранее удовлетворяют большинству
ситуаций, если autocommit
включается, Connector/J никогда не повторно
балансируется, и продолжает использовать то же самое физическое соединение. Это может быть проблематично,
особенно когда выравнивание нагрузки используется, чтобы распределить загрузку только для чтения через
многократные ведомые устройства. Однако, Connector/J может быть сконфигурирован, чтобы повторно балансироваться
после того, как определенное число операторов выполняется, когда autocommit
включается. Эта функциональность зависит от следующих свойств:
loadBalanceAutoCommitStatementThreshold
– определяет
число соответствия операторов, которые инициируют драйвер, чтобы потенциально подкачать соединения
физического сервера. Значение по умолчанию, 0, сохраняет поведение это соединения с autocommit
включенный никогда не балансируются.
loadBalanceAutoCommitStatementRegex
– регулярное
выражение, против которого должны соответствовать операторы. Значение по умолчанию, пробел,
соответствует все операторы. Так, например, использование следующих свойств заставит Connector/J
повторно балансироваться после каждого третьего оператора, который содержит строку "тест":
loadBalanceAutoCommitStatementThreshold=3loadBalanceAutoCommitStatementRegex=.*test.*
loadBalanceAutoCommitStatementRegex
может оказаться полезным во многих
ситуациях. Ваше приложение может использовать временные таблицы, серверные переменные состояния
сеанса, или состояние соединения, где, позволяя драйверу произвольно подкачать физические соединения
прежде, чем обработка полна, могли вызвать потерю данных или другие проблемы. Это позволяет Вам
идентифицировать триггерный оператор, который только выполняется, когда безопасно подкачать
физические соединения.