Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用会话明确取消SwingWorker_Java_Multithreading_Swing_Hibernate_Swingworker - Fatal编程技术网

Java 使用会话明确取消SwingWorker

Java 使用会话明确取消SwingWorker,java,multithreading,swing,hibernate,swingworker,Java,Multithreading,Swing,Hibernate,Swingworker,我有以下情况: 2名Swingworker,负责从数据库收集数据。现在我想取消第二个swingworker。我使用swingworker.cancel(true)并在swingworker的done()方法中使用session.close()关闭会话 完成后,我认为swingworker有一条sql语句正在执行,但被取消,会话关闭,因此出现以下执行选项: java.lang.NullPointerException at org.hibernate.engine.jdbc.interna

我有以下情况:

2名Swingworker,负责从数据库收集数据。现在我想取消第二个swingworker。我使用swingworker.cancel(true)并在swingworker的done()方法中使用session.close()关闭会话

完成后,我认为swingworker有一条sql语句正在执行,但被取消,会话关闭,因此出现以下执行选项:

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有自己的会话:

@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()代码:


在我看来,这确实像是在读卡器线程仍在运行时关闭db连接,这可能会导致您看到的结果。您需要重新构造内容,以便读者线程响应取消并在finally块中关闭连接本身。

编辑您的帖子,以包含
de.mudisar.dataloader.SecondarySwingWorker
类的框架,该类显示您如何捕获中断、取消查询并关闭会话。根据stacktrace
doInBackground()
尚未完成,因此不应调用
done()
。如果没有看到你的代码,没有人能够帮助你。对不起,我不能发布任何代码。我的完整方法周围有一个try-catch块。我使用session.close关闭会话,并使用session.cancelQuery取消查询。对不起,我不能显示代码。我希望我们能在没有代码的情况下找到错误。当然,您可以提取代码的框架并删除任何专有信息吗?如果没有,你可以自己来。我已经编辑了我的问题。我希望这有帮助,但没有帮助:您需要做的是提取一个SSCCE来演示问题(模拟db访问)。。。
@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);
        }
    }

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