Napisałem prosty program korzystający z hibernate (wersja 1.2.5), ale
nie mogę przeskoczyć logowania. Log4J (wersja 1.2.8) albo olewa plik
konfiguracyjny, albo sypie niejasnymi wyjątkami.
CLASSPATH zawiera m.in. następujące jary:
#v+
ant.jar, c3p0.jar, cglib.jar, commons-collections.jar,
commons-dbcp.jar, commons-lang.jar, commons-logging.jar,
commons-pool.jar, hibernate-1.2.jar, j2ee.jar, jcs.jar, jdom.jar,
junit.jar, log4j.jar, odmg.jar, optional.jar,
pg73b1jdbc3.jar, xalan.jar, xerces.jar, xml-apis.jar
#v-
(część z nich zapewne niepotrzebnie, przekopiowałem wszystkie
z paczki hibernate).
Używam standardowego log4j.properties (też skopiowanego
z hibernate):
#v+
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=warn, stdout
log4j.logger.cirrus.hibernate=info
log4j.logger.cirrus.hibernate.type=info
log4j.logger.cirrus.hibernate.ps.PreparedStatementCache=info
#v-
Przy próbie użycia dostaję wyjątek:
#v+
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:140)
at org.apache.log4j.PropertyConfigurator.class$(PropertyConfigurator.java:457)
at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:632)
at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:603)
at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:500)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:406)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:432)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:460)
at org.apache.log4j.LogManager.<clinit>(LogManager.java:113)
at org.apache.log4j.Category.getInstance(Category.java:514)
at org.apache.commons.logging.impl.Log4jFactory.getInstance(Log4jFactory.java:153)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:285)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:409)
at cirrus.hibernate.type.NullableType.<clinit>(NullableType.java:22)
at cirrus.hibernate.Hibernate.<clinit>(Hibernate.java:35)
at proj.Main.initDatastore(Main.java:64)
at proj.Main.<init>(Main.java:32)
at proj.Main.main(Main.java:80)
Caused by: java.lang.NullPointerException
at org.apache.log4j.Layout.<clinit>(Layout.java:25)
... 19 more
#v-
log4j.properties jest w CLASSPATH; wiem, że log4j próbuje się do niego
dostać -- zostawiłem tam tylko wpis:
#v+
log4j.rootLogger=warn, stdout
#v-
i dostałem inny wyjątek:
#v+
log4j:ERROR Could not find value for key log4j.appender.stdout
log4j:ERROR Could not instantiate appender named "stdout".
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.commons.logging.impl.Log4JCategoryLog.initialize(Log4JCategoryLog.java:132)
at org.apache.commons.logging.impl.Log4JCategoryLog.<init>(Log4JCategoryLog.java:118)
...
#v-
Czy macie pomysł, jak to razem spiąć?
--
Konrad Roziewski
kon...@suwalki.com.pl, k.roz...@elka.pw.edu.pl
http://www.suwalki.com.pl/~konrad/
Może spróbuj skonfigurować log4j samemu w swoim programie
[PropertyConfigurator.configure(String configFilename)]? Nie jest to
może eleganckie, ale możliwe, że sam hibernate (albo inny jarek) coś w
tym względzie miesza - miałem problem z xml-security.jar, okazało się
właśnie, że sama biblioteka sobie konfigurowała (tj. wyłączała)
logowanie i dlatego nic nie działało.
--
Greetings, [mail to mcenkier at poczta fm]
Marcin Cenkier "Let's assume that there's only one truth."
Dzięki!
Owszem, poszło... chociaż nie do końca, bo teraz są problemy
z charsetem (?):
#v+
2003-06-23 17:30:48,239 INFO DatastoreImpl:? - Mapping resource: proj/Hurtownia.hbm.xml
2003-06-23 17:30:51,903 INFO XMLHelper:? - Parsing XML: unknown system id
2003-06-23 17:30:52,998 ERROR DatastoreImpl:? - Could not configure datastore from input stream
java.lang.IllegalArgumentException: Null charset name
at java.nio.charset.Charset.lookup(Charset.java:376)
at java.nio.charset.Charset.isSupported(Charset.java:405)
at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:67)
at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:93)
at java.io.PrintWriter.<init>(PrintWriter.java:103)
at java.io.PrintWriter.<init>(PrintWriter.java:87)
at org.apache.xerces.util.DOMErrorHandlerWrapper.<init>(Unknown Source)
at org.apache.xerces.dom.CoreDocumentImpl.<init>(Unknown Source)
at org.apache.xerces.dom.DocumentImpl.<init>(Unknown Source)
at org.apache.xerces.dom.DeferredDocumentImpl.<init>(Unknown Source)
at org.apache.xerces.dom.DeferredDocumentImpl.<init>(Unknown Source)
at org.apache.xerces.parsers.AbstractDOMParser.startDocument(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startDocumentEntity(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl.setInputSource(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at cirrus.hibernate.helpers.XMLHelper.parseInputSource(XMLHelper.java:48)
at cirrus.hibernate.impl.DatastoreImpl.storeInputStream(DatastoreImpl.java:116)
at cirrus.hibernate.impl.DatastoreImpl.storeClass(DatastoreImpl.java:140)
at proj.Main.initDatastore(Main.java:68)
at proj.Main.<init>(Main.java:35)
at proj.Main.main(Main.java:83)
#v-
(a to jest tylko ustawianie DataStore, które z poziomu junit
(czyli bez ustawiania log4j) działa bezproblemowo (ale sypie
komunikatami na System.out :/ )
Co ciekawsze, wyjątek
java.lang.IllegalArgumentException: Null charset name
pojawiał się już wcześniej (m.in. kiedy próbowałem zmusić go do
pracy w sposób "domyślny", umieszczając po prostu
log4j.properties w CLASSPATH, chociaż nie jestem teraz pewien,
czy wtedy xerces też był w StackTrace). To chyba jakiś bardziej
ogólny błąd? Tylko teraz gdzie to poprawić (korzystam z j2sdk
1.4.1_02)?
Mam niejasne przeczucie, że po dokumentacji mavena, xdocleta,
hibernate, log4j, niedługo przyjdzie pora na dokształcanie się
z xercesa... ale może się mylę?
Najprawdopodobniej (jak wynika z stacktrace) żle inicjalizujesz ten
datastore. (Logowanie już działa, teraz pozostaje skorzystać z jego
dobrodziejstw i znajdować błędy które wyświetla :)
A jeśli bez log4j działało bezproblemowo, to proponuję po prostu użyć
hibernate w innej wersji (albo wcześniejszej, albo najnowszej
ściągniętej zapewne z repozytorium CVS).
Z hibernate 1.2.5 też miałem jakieś problemy... Planuję też
przyjrzeć się wersji 2.0, ale wiąże się to z przepisaniem części
kodu, dlatego wstrzymuję się jeszcze.
W międzyczasie zrobiłem jeszcze inaczej:
#v+
ds = Hibernate.createDatastore();
ds.storeClass(Hurtownia.class);
sess = ds.buildSessionFactory().openSession();
PropertyConfigurator.configure("log4j.properties");
#v-
(poprzednio PropertyConfigurator.configure() wywoływałem przed
Hibernate.createDatastore())
I działa; nawet loguje tak, jakbym log4j skonfigurował przed
użyciem hibernate (co mnie trochę dziwi, bo spodziewałem się
jakiegoś "okresu przejściowego", w którym log4j po staremu
sypałby komunikatami na kosoli).
Używałem zarówno hibernate jak i log4j w swoich dwóch projektach i nie
miałem takich problemów. Wszystko działało ok. Jakie to problemy miałeś z
wersją 1.2.5 hibernate?
Pozdrawiam,
Piotrek
> Używałem zarówno hibernate jak i log4j w swoich dwóch projektach i nie
> miałem takich problemów. Wszystko działało ok. Jakie to problemy
> miałeś z wersją 1.2.5 hibernate?
Ja mialem:
[2003-06-23 15:44:05] WARN : error in action at path /index: null (java.lang.NullPointerException)
java.lang.NullPointerException
at cirrus.hibernate.ps.PreparedStatementCache.close(PreparedStatementCache.java:177)
at cirrus.hibernate.ps.PreparedStatementCache.reap(PreparedStatementCache.java:167)
at cirrus.hibernate.ps.PreparedStatementCache.closePreparedStatement(PreparedStatementCache.java:122)
at cirrus.hibernate.impl.SessionFactoryImpl.closePreparedStatement(SessionFactoryImpl.java:493)
at cirrus.hibernate.impl.BatcherImpl.closeQueryStatement(BatcherImpl.java:59)
at cirrus.hibernate.loader.Loader.doFind(Loader.java:208)
at cirrus.hibernate.loader.Loader.find(Loader.java:512)
at cirrus.hibernate.impl.SessionImpl.find(SessionImpl.java:1027)
at cirrus.hibernate.impl.SessionImpl.find(SessionImpl.java:1007)
at cirrus.hibernate.impl.SessionImpl.find(SessionImpl.java:999)
rzecz pojawia sie w momencie duzego obciazenia serwisu WWW. ma ktos
doswiadczenia z hibernate przy serwisach, w ktorych jednoczesnie leci do
kilkanascie, kilkadziesiat zapytan roznej masci (update, insert, ale
najwiecej select'ow). Zauwazylem tez, ze blad ten powraca cyklicznie co
pare godzin. Czy to moze byc wina cache'a hibernatowego?
--
pozdrawiam . . . . . . . . . . .
Piotr Maj .:. kernelpanic.pl .:.
.:. Stuff for geeks .:.
Registered Linux user #231121. . . . . . . . . . . . . . . . .
Sorry, miałem na myśli 1.2.3, a problem był ten sam, co z obecną 1.2.8:
albo PropertyConfigurator nie mógł znaleźć jakiejś klasy
(Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:140)...)
albo coś mu się nie podobało z charsetem
(java.lang.IllegalArgumentException: Null charset name
at java.nio.charset.Charset.lookup(Charset.java:376)
at java.nio.charset.Charset.isSupported(Charset.java:405)...)
Dlatego napisałem, że podejrzewałem jakiś szkolny błąd, bo to
niemożliwe, żeby tak prosty kawałek kodu nie działał.
Problem z charsetem natchnął mnie jednak w innym kierunku...
Przypomniałem sobie, że klasy kompilowane jikes'em wstawiały '?' zamiast
polskich znaków (dopóki nie ustawiłem kodowania w build.properties),
zmieniłem kompilator na standardowy (czyt. woooooolny) sunowski
i wszystko działa jak powinno (czyt. zgodnie z dokumentacją).
> rzecz pojawia sie w momencie duzego obciazenia serwisu WWW. ma ktos
> doswiadczenia z hibernate przy serwisach, w ktorych jednoczesnie leci do
> kilkanascie, kilkadziesiat zapytan roznej masci (update, insert, ale
> najwiecej select'ow). Zauwazylem tez, ze blad ten powraca cyklicznie co
> pare godzin. Czy to moze byc wina cache'a hibernatowego?
Ja akurat korzystałem z hibernate w aplikacji standalone. Forum albo
developerzy hibernate nie pomogli?
Pozdrawiam,
Piotrek