当jdbc与sqlite3数据库连接时,我该怎么做才能避免“内存不足”的错误?

时间:2011-08-14 22:50:40

标签: java jdbc sqlite

当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 个答案:

答案 0 :(得分:6)

This表示无法找到您的clients.db文件。尝试更恰当地定位该文件。向下滚动到标题为“如何指定数据库文件”的部分。

我下载了SQLite JAR,将它放在我的CLASSPATH中,并找到了一个教程here,可以在不到五分钟的时间内完美地完成 。它按预期将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();
    }
}

答案 1 :(得分:2)

我在这里遇到同样的问题,我认为我们遇到了一些错误。异常绝对不是由“文件不存在”引起的:我用适当的测试用例仔细检查了它。

数据库本身是使用 sqlite3 官方命令行工具创建的,因此也没有损坏的数据库。我可以安全地告诉你,lib以某种方式被破坏了。

请告诉我你的操作系统和JVM版本是什么,以便我看看它是否与我的匹配,我们可以准备一份错误报告。

答案 2 :(得分:2)

是的,如果找不到文件,它会生成“内存不足”这样的奇怪异常。 在Eclipse IDE中,分别指定数据库名称和路径,将数据库文件名放入字段:数据库位置。

示例:数据库位置:c:\ temp \ test.db

答案 3 :(得分:1)

如果数据库的路径包含JDBC无法找到的任何空格。 例如C:/Program Files是错误的。必须是C:/Program_Files。 我遇到了同样的问题,现在可以了。

答案 4 :(得分:1)

我遇到了这个问题,试图通过Eclipse的“Data Source Explorer”进行连接。

在Mac上,当我在浏览提示中双击文件名时,数据库位置填充了文件夹和带有文件名的数据库。当我手动将数据库文件添加到“数据库位置”字段时,我就能够连接。

答案 5 :(得分:0)

与已提及的DarkCthulhu类似,您的数据库文件路径中不得有任何空格。即使您声明了它的相对路径(如您的情况),这也适用。我敢打赌,你项目的路径包含一个或多个空格。

您可以声明它的完整路径和空间转义,或者将项目位置更改为没有任何空格的路径!

答案 6 :(得分:0)

我刚遇到同样的问题,我就解决了。 我使用IntelliJ作为我的IDE。 我将告诉你我是如何通过屏幕截图逐步修复问题的。 希望这会帮助你 。
1 - 转到查看|工具窗口|数据库。
2 - 现在右侧打开一个包含数据库名称的窗口。选择所需的数据库,然后点击“alt + Enter”
现在,在打开的窗口上,确保您已正确填写文本框! ( 他们应该包含“fileName”。目录不够!!

答案 7 :(得分:0)

我遇到了同样的问题。我的解决方案是将依赖sqlite-jdbc从版本3.7.2更新到3.16.1