Доступ запрещен, проблема во встроенном дерби - PullRequest
0 голосов
/ 28 августа 2018

У меня проблема с двигателем дерби.

Когда я создаю новую базу данных, создаю новые таблицы и вставляю или отображаю строки, все работает отлично. И когда я пытаюсь использовать базу данных в моем практическом примере, база данных работает нормально, и я могу вставлять и выбирать данные из таблицы.

Код:

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, в командной строке появляется ошибка, подобная этой:

enter image description here

На рисунке верхняя часть - это когда я впервые создаю свою базу данных, но после этого, когда я использую ее в затмении, она выдает мне эту ошибку. Даже использование БД в Eclipse один раз приведет к этой ошибке.

В чем проблема? Почему двигатель дерби не получает доступ к нему?

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Я подозреваю, что вы перепутали режимы базы данных здесь. В заголовке вашего вопроса вы упоминаете «встроенный Derby», но вы используете код ClientDriver и атрибут create = true , который создает БД, если она не существует, но не создает запустить сервер.

Если вы не хотите запускать сервер, вы можете просто использовать EmbeddedDriver.

Еще одна проблема, с которой вы можете столкнуться, связана с атрибутом shutdown = true . Вы используете полный URL-адрес БД (dbURL), включая имя файла, но если вы хотите отключить сервер из своего кода, вы должны опустить имя файла, например: jdbc: derby:; shutdown = true .

Вы можете обратиться к документам для разработчиков Derby для получения информации об использовании этих атрибутов, а также к учебнику Embedded Derby для использования Derby во встроенном режиме, так что вам не о чем беспокоиться о запуске сервера.

0 голосов
/ 28 августа 2018

Обнаружил проблему. Мне пришлось запустить дерби в качестве сетевого сервера на порту с помощью следующей команды:

startNetworkServer.bat
...