Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > log4j: JDBCAppender не находит таблицу


Автор: check 9.7.2008, 18:14
Требуется организовать логгирование в базу данных. База - HQLDB,  встроенная в JBoss.
Проблема с последним условием,  поскольку c MySQL аппендер работает нормально.

В случае с HSQLDB при запуске сервера log4j выдает следующее
Код

Log 4j error: Filed to execute sql

java.sql.SQLException: Table not found in statement [INSERT INTO registration_log] 
хотя таблица в базе создана.

JDBC-аппендер прикручен следующим образом
Код

<appender name="JDBC" class="org.apache.log4j.jdbc.JDBCAppender">
 <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
 <param name="driver" value="org.hsqldb.jdbcDriver"/>
 <param name="URL"
value="jdbc:hsqldb:${jboss.server.data.dir}${/}portal${/}hypersonic${/}database"/>
 <param name="user" value="sa"/>
 <param name="password" value=""/>
 <layout class="org.apache.log4j.PatternLayout">
 <param name="ConversionPattern" value="INSERT INTO
registration_log(Message) VALUES('%d - %c - %p - %m')"/>
 </layout>
</appender> 

Специально упростил до предела таблицу,  чтобы исключить ошибки с layout-ом.

Как я уже сказал, с MySQL аппендер работает нормально(правда JBoss при запуске потормаживает).

Автор: ivg 9.7.2008, 23:46
Цитата(check @  9.7.2008,  21:14 Найти цитируемый пост)
хотя таблица в базе создана.

Проблема в том, что в режиме In-Process (Standalone) Mode, а судя по URL - это так, таблицы и данные, (частично или целиком) хранятся в памяти того приложения, в котором они были записаны. Чтобы эти изменения отразились в файлах, нужно либо 1. выполнить команду SHUTDOWN и закрыть Connection, либо 2. Открывать соединение с URL="jdbc:hsqldb:<path_to_hsqldb_dir>/<db_name>;shutdown=true", в этом случае команду SHUTDOWN можно не выполнять, достаточно просто закрыть Connection. По видимому из-за этого в другом приложении (JBoss) таблица не найдена.
Что касается логгирования, то аналогично: допишите ;shutdown=true в URL'е. И в коде, который выполняется при остановке приложения, добавьте:
Код

LogManager.shutdown();
// или
Logger.getLogger("myLogger").getAppender("JDBC").close();
 Этот код вызовет закрытие JDBC Connection'а, в соответствующем JDBCAppender'е, что в случае с HSQLDB совершенно необходимо для сохранения логов.

Автор: check 10.7.2008, 19:29
Цитата(ivg @  9.7.2008,  23:46 Найти цитируемый пост)
таблицы и данные, (частично или целиком) хранятся в памяти того приложения, в котором они были записаны
Да,  но JBoss-у в папку hypersonic я подкладываю файлы в которых изменения(создание таблицы) уже сохранены.

Таблицу я создавал в DatabaseManager,  запуская hsqldb отдельно.


Цитата(ivg @  9.7.2008,  23:46 Найти цитируемый пост)
;shutdown=true
Пробовал добавлять,  но пока безрезультатно.

Автор: ivg 10.7.2008, 20:00
Цитата(check @  10.7.2008,  22:29 Найти цитируемый пост)
Да,  но JBoss-у в папку hypersonic я подкладываю файлы в которых изменения(создание таблицы) уже сохранены.

Можно на них посмотреть?

Автор: check 11.7.2008, 20:17
Нет, с файлами всё в порядке. 
Посмотрел под дебагом исходники log4j,  оказывается некорректно считывался URL при парсинге конфига - оттуда удалялись все слеши.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)