簡體   English   中英

當 jdbc 與 sqlite3 數據庫連接時,我該怎么做才能避免“內存不足”的錯誤?

[英]What do I have to do to avoid error of “out of memory”, when connection by jdbc with sqlite3 database?

當 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");

表明找不到您的clients.db文件。 嘗試更適當地定位該文件。 向下滾動到標題為“如何指定數據庫文件”的部分。

我下載了 SQLite JAR,把它放在我的 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();
    }
}

是的,如果找不到文件,它會產生這種奇怪的異常“內存不足”。 在 Eclipse IDE 中,而不是單獨指定數據庫名稱和路徑,將數據庫文件名放入字段:數據庫位置。

示例:數據庫位置:c:\temp\test.db

我在這里遇到了同樣的問題,我認為我們遇到了一些錯誤。 該異常絕對不是由“文件不存在”引起的:我用適當的測試用例仔細檢查了它。

數據庫本身是使用sqlite3官方命令行工具創建的,因此也沒有損壞的數據庫。 我可以有把握地告訴你,lib 不知何故壞了。

請告訴我您的操作系統和 JVM 版本是什么,以便我查看它是否與我的匹配,我們可以准備一份錯誤報告。

我在嘗試通過 Eclipse 的“數據源資源管理器”連接時遇到了這個問題。

在 Mac 上,當我在瀏覽提示中雙擊文件名時,數據庫位置填充了文件夾,數據庫填充了文件名。 當我手動將數據庫文件添加到“數據庫位置”字段時,我就可以連接了。

如果您的數據庫路徑包含任何空格 JDBC 找不到它。 例如C:/Program Files是錯誤的。 必須是C:/Program_Files 我有同樣的問題,現在它可以工作了。

就像已經提到的DarkCthulhu一樣,您的數據庫文件的路徑中不能有任何空格。 即使您聲明了它的相對路徑(如您的情況),這也適用。 我敢打賭,您的項目路徑包含一個或多個空格。

您可以使用其完整路徑和轉義空格來聲明它,或者通過將項目位置更改為沒有任何空格的路徑!

我剛遇到同樣的問題,我解決了。 我使用IntelliJ作為我的 IDE。 我將一步一步地通過屏幕截圖向您展示我是如何解決問題的。 希望這會幫助你。
1- go 查看 | 工具 windows | 數據庫。
2-現在包含您的數據庫名稱的 window 在右側打開。select 您想要的數據庫,然后點擊“alt+Enter”
現在,在打開的 window 上,確保您已正確填寫文本框! 他們應該包括“文件名”。目錄是不夠的!!

我有同樣的問題。 我的解決方案是將依賴 sqlite-jdbc 從版本 3.7.2 更新到 3.16.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM