1

誰かがこの奇妙な問題について洞察を与えることができることを願っています

Android デバイスに iJetty WebApp があります。ユーザーが Jetty サーバーをシャットダウンした後、H2 DB をクリアできますが、Dalvik vm はオンラインです。

次のケースの後に例外が発生します: 1. サーバーを起動します 2. システムにログインします (存在しない場合は H2 データベースが作成され、接続が確立されます) 3. サーバーを停止します (これにより、すべての接続が切断されます) 4. アプリから h2 DB を削除します (これにより h2 db ファイルが削除されます) 5. アプリを起動します 6. システムにログインします (存在しない場合は H2 db が作成され、接続が確立されます)

これを 2 回行うと問題なく動作します。しかし、3回目にこの例外が発生します:

java.lang.ExceptionInInitializerError
.
.
.
Caused by: java.util.ConcurrentModificationException
    at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)
    at java.sql.DriverManager.getDrivers(DriverManager.java:258)
    at org.apache.commons.dbcp.BasicDataSource.<clinit>(BasicDataSource.java:57)
    ... 41 more

この問題に関するメモ:

http://www.mkyong.com/websphere/basicdatasource-causing-java-util-concurrentmodificationexception-in-websphere/を見ました

  • Spring では実際のデータソースをまったく初期化しません。BasicDataSource dataSource = new BasicDataSource();新しい接続を確立する必要があるときはいつでも、Java で呼び出しを行います。
  • Jetty サーバーがダウンしたときに、SQL コマンド「SHUTDOWN」を発行してみましたが、何も変わりませんでした。
  • DriverManager のコードを見ると、例外がどのように発生するのか混乱しています。彼らは、反復しているarraylistで同期を行います。
  • 私は最初に H2 フォーラムに問題を投稿して、彼らがそれに気付いているかどうかを確認しました。H2特有のものではないと思います。( https://groups.google.com/forum/#!topic/h2-database/OiKNgnYjOSM )

任意の考えをいただければ幸いです

更新 以下は、API 17 用の Andorid の DriverManager.java の呼び出しです (18 でも発生します)。彼らのレポへのリンクが見つかったら、それを投稿します

    /**
 * Returns an {@code Enumeration} that contains all of the loaded JDBC
 * drivers that the current caller can access.
 *
 * @return An {@code Enumeration} containing all the currently loaded JDBC
 *         {@code Drivers}.
 */
public static Enumeration<Driver> getDrivers() {
    /*
     * Synchronize to avoid clashes with additions and removals of drivers
     * in the DriverSet
     */
    ClassLoader callerClassLoader = VMStack.getCallingClassLoader();
    synchronized (theDrivers) {
        ArrayList<Driver> result = new ArrayList<Driver>();
        for (Driver driver : theDrivers) { // THIS IS THE OFFENDING LINE
            if (DriverManager.isClassFromClassLoader(driver, callerClassLoader)) {
                result.add(driver);
            }
        }
        return Collections.enumeration(result);
    }
}
4

0 に答える 0