Определите, находится ли JAVA-приложение в режиме отладки в Eclipse

Теперь, когда MySQL 8.0 приближается к выпуску, , все популярные базы данных SQL будут поддерживать рекурсивные запросы в стандартном синтаксисе.

WITH RECURSIVE MyTree AS (
    SELECT * FROM MyTable WHERE ParentId IS NULL
    UNION ALL
    SELECT m.* FROM MyTABLE AS m JOIN MyTree AS t ON m.ParentId = t.Id
)
SELECT * FROM MyTree;

я протестировал рекурсивные запросы в MySQL 8.0 в моем представлении рекурсивный запрос Throwdown в 2017.

Ниже мой исходный ответ с 2008:

существует несколько способов хранить данные с древовидной структурой в реляционной базе данных. То, что Вы показываете в своем примере, использует два метода:

  • Список Смежности ("родительский" столбец) и
  • Перечисление Пути (точечные числа в Вашем столбце имени).

Другое решение называют Вложенные Наборы , и оно может быть сохранено в той же таблице также. Читайте" Деревья и Иерархии в SQL для Присяжных острословов " Joe Celko для намного большей информации об этих проектах.

я обычно предпочитаю дизайн, названный Таблица Закрытия (иначе столбец "Adjacency Relation") for storing tree-structured data. It requires another table, but then querying trees is pretty easy.

I cover Closure Table in my presentation Models for Hierarchical Data with SQL and PHP and in my book SQL Antipatterns: Avoiding the Pitfalls of Database Programming .

CREATE TABLE ClosureTable (
  ancestor_id   INT NOT NULL REFERENCES FlatTable(id),
  descendant_id INT NOT NULL REFERENCES FlatTable(id),
  PRIMARY KEY (ancestor_id, descendant_id)
);

Store all paths in the Closure Table, where there is a direct ancestry from one node to another. Include a row for each node to reference itself. For example, using the data set you showed in your question:

INSERT INTO ClosureTable (ancestor_id, descendant_id) VALUES
  (1,1), (1,2), (1,4), (1,6),
  (2,2), (2,4),
  (3,3), (3,5),
  (4,4),
  (5,5),
  (6,6);

Now you can get a tree starting at node 1 like this:

SELECT f.* 
FROM FlatTable f 
  JOIN ClosureTable a ON (f.id = a.descendant_id)
WHERE a.ancestor_id = 1;

The output (in MySQL client) looks like the following:

+----+
| id |
+----+
|  1 | 
|  2 | 
|  4 | 
|  6 | 
+----+

In other words, nodes 3 and 5 are excluded, because they are part of a separate hierarchy, not descending from node 1.


Re: comment from e-satis about immediate children (or immediate parent). You can add a "path_length" к ClosureTable, чтобы облегчить запрашивать специально для непосредственного ребенка или родителя (или любое другое расстояние).

INSERT INTO ClosureTable (ancestor_id, descendant_id, path_length) VALUES
  (1,1,0), (1,2,1), (1,4,2), (1,6,1),
  (2,2,0), (2,4,1),
  (3,3,0), (3,5,1),
  (4,4,0),
  (5,5,0),
  (6,6,0);

Тогда можно добавить термин в поиске запросов непосредственных детей данного узла. Это потомки, чьи path_length 1.

SELECT f.* 
FROM FlatTable f 
  JOIN ClosureTable a ON (f.id = a.descendant_id)
WHERE a.ancestor_id = 1
  AND path_length = 1;

+----+
| id |
+----+
|  2 | 
|  6 | 
+----+

комментарий Ре от @ashraf: "Как насчет того, чтобы сортировать целое дерево [по имени]?"

Вот запрос в качестве примера для возврата всех узлов, которые являются потомками узла 1, соединяют их с FlatTable, который содержит другие атрибуты узла такой как [1 112], и вид именем.

SELECT f.name
FROM FlatTable f 
JOIN ClosureTable a ON (f.id = a.descendant_id)
WHERE a.ancestor_id = 1
ORDER BY f.name;

комментарий Ре от @Nate:

SELECT f.name, GROUP_CONCAT(b.ancestor_id order by b.path_length desc) AS breadcrumbs
FROM FlatTable f 
JOIN ClosureTable a ON (f.id = a.descendant_id) 
JOIN ClosureTable b ON (b.descendant_id = a.descendant_id) 
WHERE a.ancestor_id = 1 
GROUP BY a.descendant_id 
ORDER BY f.name

+------------+-------------+
| name       | breadcrumbs |
+------------+-------------+
| Node 1     | 1           |
| Node 1.1   | 1,2         |
| Node 1.1.1 | 1,2,4       |
| Node 1.2   | 1,6         |
+------------+-------------+

пользователь А предложил редактирование сегодня. ТАКИМ ОБРАЗОМ, модераторы утвердили редактирование, но я инвертирую его.

редактирование предложило, чтобы ORDER BY в последнем запросе выше был ORDER BY b.path_length, f.name, по-видимому, чтобы удостовериться, что упорядочивание соответствует иерархии. Но это не работает, потому что это заказало бы "Узел 1.1.1" после "Узла 1.2".

, Если Вы хотите, чтобы упорядочивание соответствовало иерархии разумным способом, который возможен, но не просто путем упорядочивания длиной пути. Например, см. мой ответ на [1 119] MySQL Closure Table иерархическая база данных - Как вытащить информацию в правильном порядке .

37
задан Serxipc 10 July 2009 в 11:25
поделиться

5 ответов

Вы можете изменить конфигурацию отладки. Например, добавьте специальный аргумент виртуальной машины только в конфигурацию отладки. Вы можете использовать System.getProperties () для чтения предоставленных аргументов.

Еще лучше, измените конфигурации (Run и Debug), чтобы загрузить другой файл конфигурации регистрации. Плохо, если вам нужно написать код для определения уровня ведения журнала. Это должно быть только вопросом конфигурации.

21
ответ дан 27 November 2019 в 04:24
поделиться

Не существует официально санкционированного способа надежно определить, находится ли какая-либо данная JVM в режиме отладки изнутри самой JVM, и полагаясь на артефакты, вы просто сломаете ваш код. время в будущем.

Поэтому вам нужно будет самостоятельно ввести метологию. Предложения:

  • Системное свойство.
  • Переменная среды (переменная оболочки, такая как $ HOME или% HOME%)
  • Спросите JVM о физическом расположении данного ресурса - http: // www. exampledepot.com/egs/java.lang/ClassOrigin.html - и на его основе принимайте решение (содержит ли путь слово «отладка» ? это внутри баночки или распакованного файла класса? и т.д.).
  • JNDI
  • Существование или содержание определенного ресурса.
7
ответ дан 27 November 2019 в 04:24
поделиться

Вы пробовали добавить аргумент vm в конфигурацию запуска eclipse?

Передайте это как аргумент виртуальной машины

-Ddebug=true

, тогда вы можете выполнить Boolean.getBoolean ("debug") , чтобы проверить это.

4
ответ дан 27 November 2019 в 04:24
поделиться

Посмотрите здесь:

http://wiki.eclipse.org/FAQ_How_do_I_use_the_platform_debug_tracing_facility%3F

Более того, я думаю, вы не можете узнать, запущено ли ваше приложение в отладке Режим. Единственное, что вы можете сделать, это передать аргумент вашей JVM при отладке.

Ману

0
ответ дан 27 November 2019 в 04:24
поделиться

Если вы устанавливаете уровень отладки из своей собственной программы, это может быть строка вроде :

public static final boolean DEBUG_MODE = System.getProperty("java.vm.info", "").contains("sharing");

поможет.

Только что протестировал его в eclipse3.5:

package test;

public class Test
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println(System.getProperty("java.vm.info", ""));
    }

}

отобразит:

mixed mode, sharing

при запуске без отладки

mixed mode

при запуске с помощью средства запуска отладки


Иоахим Зауэр комментарии :

Это сильно зависит от системы.
Я предполагаю, что "совместное использование" означает, что совместное использование классов между виртуальными машинами активно.
Это совершенно новая функция, доступная только на некоторых платформах.
Кроме того, может быть много возможных причин для его включения или отключения, поэтому я бы не стал использовать его для обнаружения режима отладки.

(Примечание: я тестировал его с последней версией jdk1.6b14. Я оставляю это как ответ CW .)

2
ответ дан 27 November 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: