Java BSAF暂停打开数据库连接

Java BSAF暂停打开数据库连接,java,database,swing,connection,saf,Java,Database,Swing,Connection,Saf,使用更好的Swing应用程序框架(BSAF)运行Java应用程序,如果我尝试在程序启动后打开与数据库的连接,它就会停止。如果在启动之前我碰巧运行了连接,它会正常工作。在我的情况下,没有解决办法,因为我需要用户主动打开和关闭连接 下面的代码是发生了什么的示例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.EventObject; im

使用更好的Swing应用程序框架(BSAF)运行Java应用程序,如果我尝试在程序启动后打开与数据库的连接,它就会停止。如果在启动之前我碰巧运行了连接,它会正常工作。在我的情况下,没有解决办法,因为我需要用户主动打开和关闭连接

下面的代码是发生了什么的示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.EventObject;
import javax.swing.JButton;
import javax.swing.JPanel;
import org.jdesktop.application.Action;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.Task;

public class BsafConnection extends SingleFrameApplication {

    private static final String DB_URL = ""; // A proper URL
    private static final String DRIVER = ""; // A proper driver
    private static Connection CONNECTION;

    public BsafConnection() {
        super();

        addExitListener(new ExitListener() {
            @Override
            public boolean canExit(EventObject event) {
                return true;
            }
            @Override
            public void willExit(EventObject event) {
                if (CONNECTION != null) {
                    try {
                        CONNECTION.close();
                        System.out.println("Connection closed");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                } else {
                    System.out.println("Connection was not open");
                }
            }});
    }

    @Override
    protected void startup() {
    }

    @Override
    public void ready() {
        JPanel panel = new JPanel();
        panel.add(new JButton(getContext().getActionMap().get("connect")));
        panel.add(new JButton("Press here to check that the EDT is not blocked"));
        show(panel);
    }

    @Action
    public Task<?, ?> connect() {
        return new Task<Object, Object> (this) {
            @Override
            protected Object doInBackground() throws Exception {
                javax.swing.Action action = getContext().getActionMap().get("connect");
                action.putValue(javax.swing.Action.NAME, "Connecting...");
                openConnection(); // Placing the connection here makes the application stall

                action.putValue(javax.swing.Action.NAME, "Connected!");
                return null;
            }};
    }

    public static void openConnection() {
        try {
            Class.forName(DRIVER);

            CONNECTION = DriverManager.getConnection(DB_URL); // This instruction stalls when called after launch()
            System.out.println("Connection open");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String... args) {
//        openConnection(); // Here, the connection would work but is not the desired place 
        launch(BsafConnection.class, args);
    }

}
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.SQLException;
导入java.util.EventObject;
导入javax.swing.JButton;
导入javax.swing.JPanel;
导入org.jdesktop.application.Action;
导入org.jdesktop.application.SingleFrameApplication;
导入org.jdesktop.application.Task;
公共类BsafConnection扩展了SingleFrameApplication{
私有静态最终字符串DB_URL=”“;//正确的URL
私有静态最终字符串驱动程序=”“;//正确的驱动程序
专用静态连接;
公共BsafConnection(){
超级();
addExitListener(新的ExitListener(){
@凌驾
公共布尔canExit(EventObject事件){
返回true;
}
@凌驾
public void willExit(EventObject事件){
if(连接!=null){
试一试{
CONNECTION.close();
System.out.println(“连接关闭”);
}捕获(SQLE异常){
e、 printStackTrace();
}
}否则{
System.out.println(“连接未打开”);
}
}});
}
@凌驾
受保护的无效启动(){
}
@凌驾
公共空间就绪(){
JPanel面板=新的JPanel();
添加(新的JButton(getContext().getActionMap().get(“connect”));
panel.add(新的JButton(“按此处检查EDT是否被阻止”);
展览(展板);;
}
@行动
公共任务连接(){
返回新任务(此任务){
@凌驾
受保护对象doInBackground()引发异常{
javax.swing.Action Action=getContext().getActionMap().get(“连接”);
action.putValue(javax.swing.action.NAME,“连接…”);
openConnection();//将连接放在此处会导致应用程序暂停
action.putValue(javax.swing.action.NAME,“Connected!”);
返回null;
}};
}
公共静态void openConnection(){
试一试{
Class.forName(驱动程序);
CONNECTION=DriverManager.getConnection(DB_URL);//在启动()后调用此指令时暂停
System.out.println(“连接打开”);
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态void main(字符串…参数){
//openConnection();//在这里,连接可以工作,但不是所需的位置
启动(BsafConnection.class,args);
}
}
我正在Windows环境下工作,如果这可能是某种问题的话。 我担心这可能与BSAF使用EDT运行应用程序的方式有关,或者与
ClassLoader
有关。 只是澄清一下:阻止EDT不是问题,它工作正常,问题是指令
DriverManager.getConnection(DB_URL)被卡住,不会引发异常

编辑:我刚刚发现,如果我在启动前碰巧打开了一个连接,我可以在以后正确地打开它们

编辑2:添加了更具解释性的示例代码


编辑3:澄清有关可能原因的信息

看起来您的连接正在阻止事件调度线程。你应该在另一个线程中处理它


编辑:我不确定为什么
任务/SwingWorker
不工作,但您可能会在上查看。

看起来您的连接正在阻止事件调度线程。你应该在另一个线程中处理它


编辑:我不确定为什么
Task/SwingWorker
不起作用,但您可能会查看上的。

已经尝试过了,但不起作用:要么使用
SwingUtilities.invokeLater(…)
要么使用框架的
任务
,这是
SwingWorker
内部的。这个例子很简单,这就是它阻止EDT的原因(在实际的实现中,由于它是在
任务中处理的,所以不会被阻止),但真正的问题不是被阻止,而是连接从未发生。对不起,我不明白“连接从未发生”是怎么回事。你是说
openConnection()
从未被调用或它阻止了EDT?两者都没有:问题是指令
DriverManager.getConnection(DB_URL)
总是在启动应用程序后停止。为了澄清这个问题,我将重写这个例子。我添加了一个稍微复杂一点的例子,但这将使问题更清楚一点。澄清一下:问题是在启动()后无法打开DB连接。我已经在论坛中提出了这个问题,尽管现在论坛没有太多活动。经过思考和阅读,可能与BSAF如何操作
类加载器以及如何注册驱动程序有关,但我还是完全迷路了。已经尝试过了,它不起作用:要么使用
SwingUtilities.invokeLater(…)
,要么使用框架的
任务
,这是一个内部的
SwingWorker
。这个例子很简单,这就是它阻止EDT的原因(在实际的实现中,由于它是在
任务中处理的,所以不会被阻止),但真正的问题不是被阻止,而是连接从未发生。对不起,我不明白“连接从未发生”是怎么回事。你是说
openConnection()
从未被调用,或者