Derby 在 Java 应用程序中自动启动服务器并连接到数据库

Posted

技术标签:

【中文标题】Derby 在 Java 应用程序中自动启动服务器并连接到数据库【英文标题】:Derby automatically start server within java application and connect to database 【发布时间】:2015-05-02 19:18:27 【问题描述】:

尝试自动连接到系统上的数据库。 该数据库位于通过 NetBeans 创建的默认 Derby 文件夹中。 我要做的是启动服务器并连接到已经存在的数据库。

public void startServer() throws Exception 


 NetworkServerControl server = new NetworkServerControl();
    server.start(prntWrt);


@Override
public void start(Stage primaryStage) throws IOException, Exception 
    startServer();
    Pane root = (Pane) FXMLLoader.load(InteractiveFictionGame2.class.getResource("MainMenu.fxml"));

    Scene scene = new Scene(root);
    primaryStage.setTitle("MainMenu");
    primaryStage.setScene(scene);
    primaryStage.setFullScreen(true);
    primaryStage.show();

似乎服务器确实启动了,但由于某种原因我无法连接到数据库,因为它认为它不存在。

String host = "jdbc:derby://localhost:1527/InteractiveGameDatabase";
String unm = "Kylar";
String pswrd = "aswzxc";

public void loadImg() 抛出 IOException

    try 
        String SQL = "select vista from location where ycoordinate = ? and xcoordinate = ?";
        Stage stage = new Stage();

        con = DriverManager.getConnection(host, unm, pswrd);
        stmnt = con.prepareStatement(SQL);
        stmnt.setInt(1, ycoord);
        stmnt.setInt(2, xcoord);
        rs = stmnt.executeQuery();
        rs.next();
        fis = rs.getBinaryStream(1);
        BufferedImage imgt = null;
        try 
            imgt = javax.imageio.ImageIO.read(fis);
         catch (IOException ex) 
            System.out.println("Image failed to load.");
        
        Image newImg = SwingFXUtils.toFXImage(imgt, null);

        fadeInImage();
        img_1.setFitHeight(880);
        img_1.setImage(newImg);

        img_1.setPreserveRatio(true);
        img_1.setCache(true);

        CountDownLatch doneLatch = new CountDownLatch(1);
        animateUsingTimeline();


        stck1.getChildren().addAll();
        Scene scene = new Scene(stck1);
        stage.setTitle("Interactive Fiction Game");
        stage.setScene(scene);
        stage.setFullScreen(true);

        stage.show();

        rs.close();
        stmnt.close();
        con.close();

     catch (SQLException e) 
        System.out.println(e.getMessage());

    

我收到错误“连接被拒绝,因为找不到数据库 InteractiveGameDatabase。”。如果我通过 NetBeans IDE 启动服务器,然后运行应用程序,一切就完美了。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

既然你指定了:

String host = "jdbc:derby://localhost:1527/InteractiveGameDatabase";

作为您的连接 URL,Derby Network Server 正在使用相对数据库名称“InteractiveGameDatabase”查找数据库。由于这是一个相对名称,而不是绝对名称,因此 Derby Network Server 将在其主目录中查找数据库,这通常是您启动 Derby Network Server 时的当前目录。

所以这里的情况可能是,当您在 NetBeans 中运行 Derby 网络服务器时,它会根据 NetBeans 的启动方式将某个目录作为其主目录运行。

但是当您手动运行 Derby Network Server 时,它会在与其主目录不同的目录中运行,因为您并没有在 NetBeans 启动它的同一个目录中精确地启动它,因此它可以'在这个新目录中找不到数据库 InteractiveGameDatabase。

你可以:

    始终使用由 NetBeans 启动的 Derby 网络服务器 启动您自己的网络服务器,但安排在 NetBeans 启动 Derby 网络服务器的同一目录中进行此操作 启动您自己的网络服务器,但更改您的连接 URL 以指定运行 NetBeans 启动的 Derby 网络服务器的位置的完整绝对路径,以便您的网络服务器在您打开数据库时可以访问该目录.

还有许多其他可能性,但希望这些足以让您了解正在发生的事情。

【讨论】:

以上是关于Derby 在 Java 应用程序中自动启动服务器并连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

有关与Apache Derby和Java连接的协议

如何可视化嵌入式 derby 数据库?

Derby 数据库连接问题

Apache Derby - java.sql.SQLException:无法启动数据库

java自带的数据库怎么用,能不能给一段运行的通的代码.(包括import)

无法同时从两个进程连接 derby 数据库