-1

次のような状況があります。

データベースからデータを収集するセッションを持つ 2 つの swingworkers。次に、2 番目の swingworker をキャンセルしたいと思います。私は swingworker.cancel(true) を実行し、swingworker の done() メソッドで session.close() を使用してセッションを閉じます。

私がそれを行った後、swingworkerには実行中のSQLステートメントが1つあると思いますが、彼はキャンセルされ、セッションが閉じられるため、次の実行が発生します:

java.lang.NullPointerException
    at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.getResourceRegistry(ConnectionProxyHandler.java:104)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.getResourceRegistry(AbstractStatementProxyHandler.java:73)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.wrapIfNecessary(AbstractStatementProxyHandler.java:150)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:123)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at $Proxy9.executeQuery(Unknown Source)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    at org.hibernate.loader.Loader.scroll(Loader.java:2510)
    at org.hibernate.loader.custom.CustomLoader.scroll(CustomLoader.java:337)
    at org.hibernate.internal.SessionImpl.scrollCustomQuery(SessionImpl.java:1760)
    at org.hibernate.internal.AbstractSessionImpl.scroll(AbstractSessionImpl.java:232)
    at org.hibernate.internal.SQLQueryImpl.scroll(SQLQueryImpl.java:182)
    at de.mudisar.dataloader.SecondarySwingWorker.doInBackground(SecondarySwingWorker.java:71)
    at de.mudisar.dataloader.SecondarySwingWorker.doInBackground(SecondarySwingWorker.java:32)
    at javax.swing.SwingWorker$1.call(SwingWorker.java:277)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at javax.swing.SwingWorker.run(SwingWorker.java:316)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)

問題を解決するために何ができますか。私がswingworkerをキャンセルした場合、すべてのSQL操作またはその他のものをキャンセルしてからセッションを閉じる必要があります。

//編集:

これが私のswingworkerからの私のコードです。この swingworker には独自のセッションがあります。

@Override
protected Void doInBackground() throws Exception {

doMappings();

fetchSQL();


}

private void fetchSQL(){

for(String str : map.keySet()){

    //build sql;
    SQLQuery q = sess.createSQLQuery(query).addEntity("ins", ALL_RSC_DATA.class);
    q.setFetchSize(Integer.valueOf(1000));
    q.setReadOnly(true);
    ScrollableResults results = q.scroll(ScrollMode.FORWARD_ONLY);
    while (results.next()) {

        //processing

    }

}

}

これは、ユーザー入力を処理する他のクラスからの私のアクション (swingworker をキャンセルするため) です。

public Action cancelPrimarySwingWorker = new AbstractAction() {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void actionPerformed(ActionEvent arg0) {
        if(psw != null && !psw.isDone()){
            closeDBConnection(psw.getSession());
            psw.cancel(true);
            psw = null;
            restoreData();
        }
    }
};

ここの完全な情報については、closeDBConnection() の私のコード:

@SuppressWarnings("deprecation")
public static void closeDBConnection(Session session) {
    if(session != null){
        try {
            //session.connection().createStatement().execute("SHUTDOWN");
            if(session.isOpen()){
                session.cancelQuery();
                session.clear();
                session.close();
            }
            session = null;
        }
        catch (Exception sqle) {
            logging(sqle);
            System.exit(1);
        }
    }

}
4

1 に答える 1

1
public void actionPerformed(ActionEvent arg0) {
    if(psw != null && !psw.isDone()){
        closeDBConnection(psw.getSession());
        psw.cancel(true);
        psw = null;
        restoreData();
    }

これは確かに、リーダー スレッドがまだ実行されている間に db 接続を閉じているように見えます。おそらく、まさにあなたが見ているものになるでしょう。リーダー スレッドがキャンセルに応答し、finally ブロックで接続自体を閉じるように、再構築する必要があります。

于 2012-10-08T16:44:57.043 に答える