Как ни странно, сегодня все работает без проблем, и как бы я ни пытался моделировать вчерашние проблемы, я не могу. Возможно, в облачном центре обработки данных возникли некоторые проблемы с сетевым взаимодействием - у нас также были некоторые тайм-ауты при подключении к другим базам данных.
Так что я действительно не знаю ответа, за исключением «ждать, пока процесс Уолсендера на мастер не умрет», - что, скорее всего, может зависеть от настроек tcp_keepalives_ *. Поэтому я рекомендую установить для них разумные значения в postgresql.conf, потому что значения по умолчанию в ОС обычно слишком велики.
На самом деле мы используем его в наших больших аналитических базах данных (установленных как на PostgreSQL, так и на ОС) из-за схожих проблем. Программы Golang и nodejs, время от времени вычисляющие статистику, не могли распознать, что сеанс базы данных заканчивался или прекращался в некоторых случаях, и зависали до тех пор, пока ОС не завершала соединение через 2 часа (по умолчанию в Debian). Все это, казалось, всегда было связано с проблемами сетевого взаимодействия. При правильной настройке tcp_keepalives_ * реакция в случае проблем гораздо быстрее.
После того, как старый процесс Walsender умирает на мастере, вы можете повторить все шаги, и он должен работать. Похоже, мне просто не повезло вчера ...
Вы не смогли бы сделать это с TreeMap, реализованным в библиотеке Collections. Вот реализация Красно-черного Дерева в Java, на который можно посмотреть все же. Проверьте printTree()
методы, чтобы видеть, как они обходят дерево в отсортированном порядке.
/**
* Print all items.
*/
public void printTree( ) {
printTree( header.right );
}
/**
* Internal method to print a subtree in sorted order.
* @param t the node that roots the tree.
*/
private void printTree( RedBlackNode t ) {
if( t != nullNode ) {
printTree( t.left );
System.out.println( t.element );
printTree( t.right );
}
}
От этого, возможно, можно записать собственные методы для пересечения дерева во всех трех заказах.
AFAIK классы TreeSet/TreeMap на самом деле не выставляют ни одних из своих внутренностей и просто соответствуют интерфейсу Set/Map. Итератор, как только гарантируют, войдет в порядок по возрастанию.
Я немного озадачен относительно того, почему Вы хотели бы просканировать эти узлы в inorder, так как цель этих деревьев не состоит в том, чтобы представить отношения между объектами (например, математические формулы), а скорее только сохранить всех их и получить их эффективно.
Можно, по крайней мере, сделать обход inorder с помощью итератора и для каждого цикла:
void inOrderWalk(TreeMap<K,V> treeMap) {
//this will loop through the values in the map in sorted order (inorder traversal)
for (Map.Entry<K,V> entry : treeMap.entrySet() {
V value = entry.getValue();
K key = entry.getKey()
}
}
Однако другие плакаты являются правильными: Java не выставляет ни одной древовидной механики, таким образом, предварительный порядок или постпорядок не возможны при этом представлении.