2012-02-24 18 views
4

私の休止状態ログ設定には少し問題があります。 アプリケーションでは、データベーステーブルの各行に同時にロックをかけようとする2つのスレッドがあります。 これらのスレッドの1つが、すでにロックされている行をロックしようとすることがあります。このエラーはスローされます。SystemOut.logファイルからHibernateエラーをリダイレクト

[2/24/12 15:00:34:492 CET] 0000003a JDBCException W org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 54, SQLState: 61000 
[2/24/12 15:00:34:496 CET] 0000003a JDBCException E org.hibernate.util.JDBCExceptionReporter logExceptions ORA-00054: resource busy and acquire with NOWAIT specified 

これらの行は、SystemOut.logファイルに入れられます。私はそれらを別のファイルに入れようとしています。だから私のLog4jの設定ファイルで、私はこのような新しいアペンダ作成:

<logger name="org.hibernate" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.type" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.tool.hbm2ddl" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.pretty" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.cache" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.transaction" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.jdbc" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.hql.ast.AST" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.secure" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.SQL" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 

この構成では動作しませんでしたし、2:最後に

<appender name="JDBCExceptionReporter" class="org.apache.log4j.RollingFileAppender"> 
    <param name="Encoding" value="UTF-8"/> 
    <param name="File" value="JDBCExceptionReporter.log"/> 
    <param name="MaxFileSize" value="50000KB"/> 
    <param name="MaxBackupIndex" value="5"/> 
    <param name="BufferedIO" value="false"/> 
    <param name="ImmediateFlush" value="true"/> 
    <param name="Append" value="true"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d, %-5p, %X{ORG_NAME}, %X{USER_NAME}, %c - %m%n"/> 
     <!-- Use pattern below if it is required to view the log files --> 
     <!-- using LogFactor5--> 
     <!--<param name="ConversionPattern" value="[slf5s.start] %d[slf5s.DATE] 
      %-5p[slf5s.PRIORITY] %X{ORG_NAME} %X{USER_NAME} 
      [slf5s.NDC] %c[slf5s.CATEGORY] - %m[slf5s.MESSAGE] %n"--> 
    </layout> 
</appender> 

を、私は、ルート要素の前に、これらのロガーを追加しました行は常にSystemOut.logに記録され、私のJDBCExceptionReporter.logには記録されません。 誰かが私の問題に対する答えを持っていますか? ご協力いただきありがとうございます。

+0

jbossを使用していますか?または他のアプリケーションサーバーですか?環境についてもっと教えてください。 – mericano1

+0

私たちは、AIXサーバー上でWebsphere Application Server 6を使用しています。 Hibernate 3およびlog4j-1.2.15、slf4j-log4j12-1.5.5 – astrotouf

答えて

1

HibernateはLog4Jを直接使用しません。このため、メッセージはWebSphere SystemOut.logファイルに入ります。

バージョン3.2までは、hibernateはJakarta Commonsをロギングファサードとして使用しました。バージョン3.3以降では、SLF4J(Simple Logging Facade for Java)に切り替えました。 jakarta commons logging(JCL)のように、SLF4Jは単なるファサードであり、Java LoggingやLog4Jのような他のLogging Frameworkにバインドすることがよくあります。

私はあなたのアプリケーションが既にLog4Jを使用していると思います。また、Hibernate 3.3またはそれ以降のバージョンを使用していると仮定しています。

まず、SLF4Jサポートをプロジェクトに追加します。 Log4Jのに

SLF4J-api.jarの(コアSLF4Jパッケージ)

SLF4J-log4j12.jar(バインドSLF4J:あなたは(アイビー、Mavenのか、しかし、あなたがしたいと)これらの依存関係を追加することによってそれを行います)

このようにして、Hibernateが何らかのメッセージを記録すると、SLF4JはそれをキャプチャしてLog4Jにルーティングします。

これで、自分のアプリケーションコードになると、2つの方法があります。

1:直接Log4Jのクラス(すなわち、ロガーとLoggerFactory)

この方法に相互作用し、あなたの授業をしてください、あなたは直接Log4Jのロガーを参照して、あなたのクラスは、次のように続ける:

Logger logger = Logger.getLogger("com.foo"); // from package org.apache.log4j 

ので、短期でHibernateはSLF4J - > Log4Jを使用し、Log4Jを直接使用します。

2:2番目の方法は、コードでSLF4Jを使用することです。あなたはおそらく、ログメッセージを生成し、あなたのクラスのそれぞれのコードは1行だけを変更する必要がありますので、これは、それほど大きな変化はない:

Logger logger = LoggerFactory.getLogger("com.foo"); // from package org.slf4j 

あなたが休止状態の古いバージョンを使用している場合(3.2ジャカルタコモンズロギングを使用しないようにする必要があります。まず、依存関係からcommons-logging JARファイルを削除する必要があります(従属マネージャを使用する場合は、手動または除外のいずれかを使用してください)。次に、あなたのクラスパスにコモン・ログのSLF4Jポートを追加する必要があります:。

は私がJCLオーバーSLF4J-1.6を使用xyzはそのバージョンであること(JCLオーバーSLF4J-xyzjarを追加します。 1.jarなど)。

このjarは、古いcommons-logging.jarのクラスとパッケージを持っているため、実際にはすべてのcommons-logging依存アプリケーションが実際にSLF4Jにログするようになります。

関連する問題