【问题标题】:Moving a database in netbeans to another computer将netbeans中的数据库移动到另一台计算机
【发布时间】:2018-02-19 10:06:20
【问题描述】:

我在netbeans中制作了一个相当小的java程序,数据库保存在database/mainUserData下的scr文件夹中,在我的主PC上,如果我将它导出到.jar文件夹,它可以工作,如果我复制所有数据在文件夹(70mb 的价值)到另一台电脑中,它再也找不到数据库,我确保添加始终使用 jar 文件夹中的当前目录作为数据库 url 的代码,这是连接代码:

myconObj = DriverManager.getConnection("jdbc:derby://localhost:1527/MainUserData", "jacovanstryp", "Password1234");

为什么我将它移到另一台计算机时(整个文件,它不再知道数据库在哪里?

我尝试过的:

URL url = this.getClass().getResource("/com/vanstryp/res/Database/MainUserData"); // This is the same directory as where the .jar is located

这只是返回 Null。

这是它返回的顶部错误代码

java.sql.SQLNonTransientConnectionException: java.net.ConnectException : Error connecting to server localhost on port 1,527 with message Connection refused: connect.

这是我使用的方法的代码

  public boolean checkLogin(String username, String password) {
    try {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        //This code will connect the database to the java program
        //Information to connect database obtained from -->  https://www.youtube.com/watch?v=c7RZV4VLv3s
        Connection myconObj = null; //allows to connect to database
        Statement mystatObj = null; // create statement (Execute queries)
        ResultSet myresObj = null; // get result
        ResultSetMetaData mymeta = null;

        try {

            String query = "select * from JACOVANSTRYP.MAINUSERDATA";
            URL databaseLocation = this.getClass().getResource("/com/vanstryp/database/MainUserData/");

            myconObj = DriverManager.getConnection("jdbc:derby:/" + databaseLocation, "jacovanstryp", "Eduplex1234");
            mystatObj = myconObj.createStatement();
            myresObj = mystatObj.executeQuery(query);
            mymeta = myresObj.getMetaData();
            int colomnNo = mymeta.getColumnCount();

            while (myresObj.next()) {
                String dbUsername = myresObj.getString("Username");
                String dbPassword = myresObj.getString("Password");
                System.out.println();
                if (username.equalsIgnoreCase(dbUsername) && password.equals(dbPassword)) {

                    PrintWriter activeUser = new PrintWriter(new FileWriter("activeUser.db"));
                    activeUser.println(dbUsername);
                    activeUser.close();
                    return true;

                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    } catch

 (ClassNotFoundException ex) {
            Logger.getLogger(commonMethods.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
}

【问题讨论】:

  • 这里的另一个好问题......欢迎投票。因此,当您决定保留您的另一个接受时,您现在可以对有希望的有用输入表示感谢。

标签: java sql database netbeans derby


【解决方案1】:

这一行:

myconObj = DriverManager.getConnection("jdbc:derby://localhost:1527/MainUserData", ...);

使用"jdbc:derby://localhost:1527/MainUserData" 的连接字符串。这意味着您已在该计算机上设置(可能通过 Netbeans)一个 Derby 服务器,侦听端口 1527。

复制一个 jar 和支持数据库的文件是不够的:您必须在新主机上启动 Derby 服务器或使用旧主机上的一个:

myconObj = DriverManager.getConnection("jdbc:derby://other.host.full.name:1527/MainUserData", ...);

或者,您可以使用 Derby 的 嵌入式 模式。然后你只需要声明哪个文件夹包含数据库文件:

myconObj = DriverManager.getConnection("jdbc:derby:/path/to/MainUserData", ...);

在此模式下,您可以将 jar(及其可选的其他文件)和数据库复制到新系统,如果您提供正确的路径,它应该会找到数据库。

【讨论】:

  • 有没有办法让程序在不启动新主机的情况下访问这个数据库?例如,如果我要在线上传并允许人们下载它,我将如何将其更改为程序仍然可以访问它的位置,而无需用户下载 netbeans 并重新启动它?
  • JavaDB 可以在嵌入式模式下使用。在该模式下,它不依赖于外部服务器,而仅依赖于托管数据库的文件夹的路径。请看我的编辑
  • 如果我按照您的建议进行操作,我会收到此错误 - java.sql.SQLException: No suitable driver found for jdbc:derby:/file:/C:/Users/Jaco%20van%20Stryp/ Dropbox/Fitness%20Perfect/build/classes/com/vanstryp/database/MainUserData ---- 这是我的代码- URL databaseLocation = this.getClass().getResource("/com/vanstryp/database/MainUserData"); myconObj = DriverManager.getConnection("jdbc:derby:/" + databaseLocation, "jacovanstryp", "Password1234");
  • 这里有两个问题。首先很简单:您必须使用Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 而不是ClientDriver 加载嵌入式驱动程序。第二个不同:您在 build/classes 下搜索数据库,这很糟糕:只有只读文件应该位于那里。
  • 我为这个方法添加了所有代码,你能解释一下“第二个不同:你在 build/classes 下搜索数据库,这很糟糕:只有只读文件应该在那里”和可能更正代码?数据库对我来说相当新。
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多