Что я должен сделать, чтобы избежать ошибки "нехватка памяти", когда соединение JDBC с базой данных sqlite3? - PullRequest
6 голосов
/ 15 августа 2011

Что я должен сделать, чтобы избежать ошибки "нехватка памяти" при соединении с помощью jdbc с базой данных sqlite3?

java.sql.SQLException: out of memory
at org.sqlite.DB.throwex(DB.java:288)
    at org.sqlite.NestedDB._open(NestedDB.java:73)
    at org.sqlite.DB.open(DB.java:77)
    at org.sqlite.Conn.<init>(Conn.java:88)
    at org.sqlite.JDBC.connect(JDBC.java:64)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at action.Actions.<init>(Actions.java:18)
    at controler.ClientControler.<init>(ClientControler.java:14)
    at main.Main.main(Main.java:20)


Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:clients.db");

Ответы [ 8 ]

6 голосов
/ 15 августа 2011

Это предполагает, что ваш clients.db файл не найден.Попробуйте найти этот файл более подходящим образом.Прокрутите вниз до раздела, озаглавленного «Как задать файлы базы данных».

Я скачал JAR-файл SQLite, поместил его в свой CLASSPATH и нашел учебное пособие здесь , которое отлично работало вменее пяти минут .Как и ожидалось, он поместил test.db в корень моего проекта.

Я переписал это руководство так, как я это сделал. Это работает. Не говорите, что это ничего не приносит.

package sqlite;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class Test
{

    private static final String DEFAULT_DRIVER = "org.sqlite.JDBC";
    private static final String DEFAULT_URL = "jdbc:sqlite:data/test.db";

    public static void main(String[] args)
    {
        Connection conn = null;
        try
        {
            conn = createConnection(DEFAULT_DRIVER, DEFAULT_URL);
            createTable(conn);

            List<Person> people = new ArrayList<Person>();
            people.add(new Person("Gandhi", "politics"));
            people.add(new Person("Wittgenstein", "philosophy"));
            people.add(new Person("Turing", "computers"));
            saveAll(conn, people);

            List<Person> rows = findAll(conn);
            System.out.println(rows);
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            close(conn);
        }
    }

    private static List<Person> findAll(Connection conn) throws SQLException
    {
        List<Person> rows = new ArrayList<Person>();
        ResultSet rs = null;
        Statement stat = null;

        try
        {
            stat = conn.createStatement();
            rs = stat.executeQuery("select * from people;");
            while (rs.next())
            {
                rows.add(new Person(rs.getString("name"), rs.getString("occupation")));
            }
        }
        finally
        {
            close(stat);
            close(rs);
        }

        return rows;
    }

    private static void saveAll(Connection conn, List<Person> people) throws SQLException
    {
        PreparedStatement prep = null;
        try
        {
            prep = conn.prepareStatement("insert into people values (?, ?);");

            for (Person person : people)
            {
                prep.setString(1, person.getName());
                prep.setString(2, person.getOccupation());
                prep.addBatch();
            }

            conn.setAutoCommit(false);
            prep.executeBatch();
            conn.setAutoCommit(true);
        }
        finally
        {
            close(prep);
        }
    }

    private static void createTable(Connection conn) throws SQLException
    {
        Statement stat = null;
        try
        {
            stat = conn.createStatement();
            stat.executeUpdate("drop table if exists people;");
            stat.executeUpdate("create table people (name, occupation);");
        }
        finally
        {
            close(stat);
        }
    }

    private static Connection createConnection(String driver, String url) throws ClassNotFoundException, SQLException
    {
        Class.forName(DEFAULT_DRIVER);
        Connection conn = DriverManager.getConnection(DEFAULT_URL);

        return conn;
    }

    private static void close(Connection conn)
    {
        try
        {
            if (conn != null)
            {
                conn.close();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }


    private static void close(Statement stat)
    {
        try
        {
            if (stat != null)
            {
                stat.close();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private static void close(ResultSet rs)
    {
        try
        {
            if (rs != null)
            {
                rs.close();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

class Person
{
    private String name;
    private String occupation;

    Person(String name, String occupation)
    {
        this.name = name;
        this.occupation = occupation;
    }

    public String getName()
    {
        return this.name;
    }

    public String getOccupation()
    {
        return this.occupation;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();

        sb.append("{ name: ").append(this.name).append(", occupation: ").append(this.occupation).append(" }");

        return sb.toString();
    }
}
2 голосов
/ 06 августа 2013

Да, в случае, если файл не найден, он генерирует такое странное исключение «недостаточно памяти». Вместо этого, в Eclipse IDE, указав имя базы данных и путь по отдельности, поместите имя файла базы данных в поле: Расположение базы данных.

Пример: расположение базы данных: c: \ temp \ test.db

2 голосов
/ 09 сентября 2011

У меня такая же проблема, и я думаю, что мы столкнулись с какой-то ошибкой.Исключение абсолютно не вызвано «файлом не существует»: я тщательно проверил его с помощью правильного контрольного примера.

Сама база данных создается с использованием официального инструмента командной строки sqlite3 , поэтому нетПоврежденная база данных тоже.Я могу с уверенностью сказать вам, что библиотека как-то сломана.

Пожалуйста, скажите мне, какая у вас версия ОС и JVM, чтобы я посмотрел, совпадает ли она с моей, и мы можем подготовить отчет об ошибке.

1 голос
/ 16 июля 2013

Я столкнулся с этой проблемой, пытаясь подключиться через Eclipse «Data Source Explorer».

На Mac, когда я дважды щелкнул по имени файла в окне просмотра, местоположение базы данных было заполнено папкой, а база данных - именем файла. Когда я вручную добавил файл базы данных в поле «Расположение базы данных», я смог подключиться.

1 голос
/ 16 ноября 2011

Если путь к вашей базе данных содержит пробелы, JDBC не может его найти.Например, C:/Program Files неверно.Должно быть C:/Program_Files.У меня была такая же проблема, и теперь она работает.

0 голосов
/ 08 мая 2017

У меня была такая же проблема.Мое решение - обновить зависимость sqlite-jdbc с версии 3.7.2 до 3.16.1

0 голосов
/ 23 июля 2016

Я просто столкнулся с той же проблемой и решил ее. Я использовал IntelliJ в качестве своей IDE. Я покажу вам, как я решил проблему с помощью снимков экрана, шаг за шагом. Надеюсь, что это поможет вам .
1- перейти к просмотру | окна инструментов | база данных .
2- теперь в правой части окна открыто окно с названием вашей базы данных. Выберите нужную базу данных, затем нажмите «alt + Enter»
Теперь, в открывшемся окне, убедитесь, что вы правильно заполнили текстовые поля! ( они должны включать "fileName". Каталога недостаточно !! ) image

0 голосов
/ 18 июня 2014

Как и DarkCthulhu уже упоминалось, у вас не должно быть пробелов в пути к файлу вашей базы данных.Это применимо, даже если вы объявили относительный путь к нему (как в вашем случае).Бьюсь об заклад, путь к вашему проекту содержит один или несколько пробелов.

Вы можете объявить его, указав полный путь и пробелы, либо изменив местоположение вашего проекта на путь без пробелов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...