【问题标题】:Access is Denied, Issue in embedded Derby访问被拒绝,嵌入式 Derby 中的问题
【发布时间】:2019-02-02 17:08:02
【问题描述】:

我的德比引擎有问题。

当我创建一个新数据库、创建新表并插入或显示行时,一切正常。当我尝试在我的实践示例中使用数据库时,数据库工作正常,我能够从表中插入和选择数据。

代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSetMetaData;


public class Restaurants
{
    private static String dbURL = "jdbc:derby:c:\\Apache\\db-derby-10.14.2.0-bin\\bin\\myDBExample;create=true";
    private static String tableName = "restaurants";
    // jdbc Connection
    private static Connection conn = null;
    private static Statement stmt = null;

    public static void main(String[] args)
    {
        createConnection();
        //insertRestaurants(5, "LaVals Leb", "Berkeley");
        //insertRestaurants(6, "House Leb", "New York");
        selectRestaurants();
        shutdown();
    }

    private static void createConnection()
    {
        try
        {
            Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
            //Get a connection
            conn = DriverManager.getConnection(dbURL); 
        }
        catch (Exception except)
        {
            except.printStackTrace();
        }
    }

    private static void insertRestaurants(int id, String restName, String cityName)
    {
        try
        {
            stmt = conn.createStatement();      
            stmt.execute("insert into " + tableName + " values (" +
                    id + ",'" + restName + "','" + cityName +"')");            
            stmt.close();
        }
        catch (SQLException sqlExcept)
        {
            sqlExcept.printStackTrace();
        }
    }

    private static void selectRestaurants()
    {
        try
        {
            stmt = conn.createStatement();
            ResultSet results = stmt.executeQuery("select * from " + tableName);
            ResultSetMetaData rsmd = results.getMetaData();
            int numberCols = rsmd.getColumnCount();
            for (int i=1; i<=numberCols; i++)
            {
                //print Column Names
                System.out.print(rsmd.getColumnLabel(i)+"\t\t");  
            }

            System.out.println("\n-------------------------------------------------");

            while(results.next())
            {
                int id = results.getInt(1);
                String restName = results.getString(2);
                String cityName = results.getString(3);
                System.out.println(id + "\t\t" + restName + "\t\t" + cityName);
            }
            results.close();
            stmt.close();
        }
        catch (SQLException sqlExcept)
        {
            sqlExcept.printStackTrace();
        }
    }

    private static void shutdown()
    {
        try
        {
            if (stmt != null)
            {
                stmt.close();
            }
            if (conn != null)
            {
                DriverManager.getConnection(dbURL + ";shutdown=true");
                conn.close();
            }           
        }
        catch (SQLException sqlExcept)
        {

        }

    }
}

这段代码运行良好,但是当我尝试使用 ij 再次创建到同一个数据库的连接时,我的命令提示符中出现如下错误:

在图像中,上半部分是我第一次创建数据库时,但之后在 eclipse 中使用它时,它给了我这个错误。即使在eclipse中使用一次db也会导致这个错误。

有什么问题?为什么 derby 引擎没有获得授予它的访问权限?

感谢任何帮助。

【问题讨论】:

    标签: java database eclipse derby


    【解决方案1】:

    发现问题。我必须使用以下命令将 derby 作为端口上的网络服务器启动:

    startNetworkServer.bat
    

    【讨论】:

      【解决方案2】:

      我怀疑您在这里混淆了数据库模式。在您的问题标题中,您提到了“嵌入式 Derby”,但您的代码正在使用 ClientDriver 和 create=true 属性,如果它不存在,它会创建数据库,但它不t 启动服务器。

      如果你不想启动服务器,你可以使用 EmbeddedDriver。

      您可能会遇到问题的另一点是 shutdown=true 属性。您正在使用包括文件名在内的整个 DB URL (dbURL),但如果您想从代码中关闭服务器,则应省略文件名,如下所示:jdbc:derby:;shutdown=true时间>。

      您可以查看Derby developer docs 以获取有关使用这些属性的信息,以及查看Embedded Derby tutorial 以了解在嵌入式模式下使用 Derby,这样您就不必担心启动服务器了。

      【讨论】:

      • 感谢您的建议。
      • 不用担心,我也经历过几乎相同的困惑,但使用的是 Groovy。忘了提一下,如果您在嵌入式模式下使用 Derby,一次只允许一个连接。
      猜你喜欢
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多