При распечатывании сообщений об ошибках со строкой (особенно та, которая зависит от ввода данных пользователем), я всегда использую одинарные кавычки ''
. Например:
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 ''
я нахожу, что это имеет огромное значение с точки зрения качества отчетов об ошибках, отправленных конечными пользователями. Если существует забавно выглядящее сообщение об ошибке как это вместо чего-то универсальное звучание, то они намного более вероятны скопировать/вставить им вместо того, чтобы просто писать, что "оно не открыло бы мои файлы".
Какой пул соединений вы используете? Встроенный пул Hibernate не следует использовать ни для чего, кроме простых тестов.
Proxool , с другой стороны, позволяет вам делать именно то, что вы хотите: set test- before-use значение true, и оно вызовет исключение, если не сможет найти или создать подходящее соединение. Вы даже можете прослушивать события подключения , если хотите.
Как упоминает ChssPly, вам не следует использовать встроенный пул Hibernate ни для чего. Другой вариант, кроме Proxool (которым я лично не пользовался, поэтому я не могу за него ручаться) - C3P0 . Это определенно вызывает исключение при настройке пула соединений - я МОГУ за это поручиться :) Поскольку это именно то поведение, которое я хочу с нашим приложением, оно отлично работает для нас.
Извините, что снова поднимаю проблему, но: Я пробовал C3p0, и он лучше, чем встроенный, но, что касается моей проблемы, он не делает абсолютно ничего другого, чем ванильный спящий режим: если он не может получить соединение, оно генерирует исключение, Hibernate перехватывает это исключение и, опять же, скрывает его от меня. Используя c3p0, я по-прежнему использую API спящего режима, и все, что бросает c3p0, его засасывает спящий режим. Единственный способ, который я могу использовать, - это программно создать экземпляр источника данных c3p0, и если исключение не генерируется (это я могу уловить), то передать его в спящий режим. Но потом я понял, что передать DataSource в Hibernate можно только через URL-адрес JNDI, и это не вариант. Итак, моя последняя надежда - реализовать собственный поставщик подключений, использовать внутри c3p0 и перехватить там исключение c3p0. Есть ли какая-нибудь другая альтернатива?
Обратите внимание, что я не пробовал proxool, потому что его сложно настроить с помощью гибернации, хотя я и не дал ему честно. Также извините за то, что назначил ответ перед тщательным тестированием.