2011-07-04 20 views
4

私はこのエラーをしばらく追跡していますが、不規則なベースで予期せぬことが起こり、今のところそれを再現する方法が見つかりませんでした。 dbの別のOracle 10g XEをホスティングjava.sql.SQLException:60秒でロックを取得することができません

当社の環境

  • のLinuxのCentOS 5.3 1台のJBoss 5.1アプリケーションサーバーをホスティング
  • のLinuxのCentOS 5.3のホスティング1のOracle 10g XEのDB
  • のWindows Server 2003 R2

    プログラミング環境

    • シーム2.1
    • JSF 1.2

    を休止状態このエラーのほとんどは、 "アプリケーション" スコープのSeamコンポーネントで発生、それはまたelswhere起こりました。

    WeaはデータベースにアクセスするためにXA-datasourceを使用しています。

    これは、tisがjboss 5.1 look hereの何らかのバグでもあるように見えますが、60秒間のクエリやリクエストはありません。

    この種のエラーにはどのような原因が考えられますか?

    エラーの最終スタックトレース:

    Caused by: java.sql.SQLException: Unable to obtain lock in 60 seconds: [email protected] 
        at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.tryLock(BaseWrapperManagedConnection.java:267) 
        at org.jboss.resource.adapter.jdbc.WrappedConnection.lock(WrappedConnection.java:79) 
        at org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:237) 
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452) 
        at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1573) 
        at org.hibernate.loader.Loader.doQuery(Loader.java:696) 
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
        at org.hibernate.loader.Loader.doList(Loader.java:2228) 
    
+1

コンポーネントをロックする '@ Singleton'や他のアノテーションを使用していますか? –

+0

私はスコープ(アプリケーション、セッション)のちょうどseamアノテーションを使用しています – simonC

答えて

1

アプリ-ds.xmlファイルで行うことができますいくつかのトリックがあります。それがあれば? MySQLを実行している場合 たとえば、あなたはまた、データベースの設定ファイルになりますし、多分あなたはそこにいくつかの設定を微調整することができます

<check-valid-connection-sql>SELECT 1</check-valid-connection-sql> 

を書くことができます。たとえば、wait_timeout,max_connectionsなどです。特に、後者を増やすことを検討できます。 多分あなたは何もしていない多くのアイドル状態のsql接続を持っていて、プールに達すると、それに達するまで待ってからこの例外が出ますか?

また、アプリケーションスコープのコンポーネントはスレッドセーフです。したがって、アプリケーションスコープのコンポーネントとセッションコンポーネントを可能な限り制限するようにしてください。 該当する場合は、イベントスコープと会話スコープのコンポーネントを使用する方が効果的です。

+0

プール設定でを使用しましたが、結果が表示されずにエラーがポップアップしましたが、 check-valid-connection-sql>は、本番環境では最適ではないと判断したため、この設定によってパフォーマンス上のオーバーヘッドが大きくなりますか? ドキュメントでは、プールから接続がチェックアウトされたときに接続を検証するが、デフォルトではすでにtrueになっている継ぎ目であることを検証する設定に気がつきました。 – simonC

+0

max_connectionsを500に設定してください。これはenouhgにする必要があります。wait_timeoutを28800に設定してください。 mybe Application/Sessionスコープのコンポーネントには本当に問題がありますが、ほぼすべての要求で使用されます。これが問題なのかどうか、どうすればテストできますか? – simonC

+1

JMeter http://jakarta.apache.org/jmeter/を試して、たくさんのリクエストを出すことができます。あなたができる他のパフォーマンスもあります。ファクトリを使用してラップを解除し、可能な限り状態を少なくします。 –

関連する問題