Будьте в спящем режиме, не выдавая исключение, когда openSession называют, и соединение с DB не может быть установлено

При распечатывании сообщений об ошибках со строкой (особенно та, которая зависит от ввода данных пользователем), я всегда использую одинарные кавычки ''. Например:

FILE *fp = fopen(filename, "r");
if(fp == NULL) {
    fprintf(stderr, "ERROR: Could not open file %s\n", filename);
    return false;
}

Это отсутствие кавычек приблизительно %s действительно плохи, потому что говорят, что имя файла является пустой строкой или просто пробелом или чем-то. Распечатанное сообщение, конечно, было бы:

ERROR: Could not open file

Так, всегда лучше, чтобы сделать:

fprintf(stderr, "ERROR: Could not open file '%s'\n", filename);

Затем, по крайней мере, пользователь видит это:

ERROR: Could not open file ''

я нахожу, что это имеет огромное значение с точки зрения качества отчетов об ошибках, отправленных конечными пользователями. Если существует забавно выглядящее сообщение об ошибке как это вместо чего-то универсальное звучание, то они намного более вероятны скопировать/вставить им вместо того, чтобы просто писать, что "оно не открыло бы мои файлы".

6
задан ChssPly76 5 September 2009 в 20:32
поделиться

3 ответа

Какой пул соединений вы используете? Встроенный пул Hibernate не следует использовать ни для чего, кроме простых тестов.

Proxool , с другой стороны, позволяет вам делать именно то, что вы хотите: set test- before-use значение true, и оно вызовет исключение, если не сможет найти или создать подходящее соединение. Вы даже можете прослушивать события подключения , если хотите.

3
ответ дан 17 December 2019 в 02:31
поделиться

Как упоминает ChssPly, вам не следует использовать встроенный пул Hibernate ни для чего. Другой вариант, кроме Proxool (которым я лично не пользовался, поэтому я не могу за него ручаться) - C3P0 . Это определенно вызывает исключение при настройке пула соединений - я МОГУ за это поручиться :) Поскольку это именно то поведение, которое я хочу с нашим приложением, оно отлично работает для нас.

3
ответ дан 17 December 2019 в 02:31
поделиться

Извините, что снова поднимаю проблему, но: Я пробовал C3p0, и он лучше, чем встроенный, но, что касается моей проблемы, он не делает абсолютно ничего другого, чем ванильный спящий режим: если он не может получить соединение, оно генерирует исключение, Hibernate перехватывает это исключение и, опять же, скрывает его от меня. Используя c3p0, я по-прежнему использую API спящего режима, и все, что бросает c3p0, его засасывает спящий режим. Единственный способ, который я могу использовать, - это программно создать экземпляр источника данных c3p0, и если исключение не генерируется (это я могу уловить), то передать его в спящий режим. Но потом я понял, что передать DataSource в Hibernate можно только через URL-адрес JNDI, и это не вариант. Итак, моя последняя надежда - реализовать собственный поставщик подключений, использовать внутри c3p0 и перехватить там исключение c3p0. Есть ли какая-нибудь другая альтернатива?

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

0
ответ дан 17 December 2019 в 02:31
поделиться
Другие вопросы по тегам:

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