What do I have to do to avoid error of “out of mem

2019-02-17 08:02发布

What do I have to do to avoid error of "out of memory", when connection by jdbc with sqlite3 database?

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条回答
时光不老,我们不散
2楼-- · 2019-02-17 08:40

I just faced the same problem and I solved it . I was using IntelliJ as my IDE. I will show you how i fixed the problem by screen shots , step by step. Hope this will help you .
1- go to view | tool windows | database .
2- now a window containing the name of your databases is open in the right hand.select the database you want , then tap "alt+Enter"
now , on the opened window , make sure that you have filled the textboxes correct ! (they should include the "fileName" . directory is not enough!!)

查看更多
可以哭但决不认输i
3楼-- · 2019-02-17 08:41

If path to your database contains any spaces JDBC can't find it. For example C:/Program Files is wrong. Must be C:/Program_Files. I had same problem and now it works.

查看更多
等我变得足够好
4楼-- · 2019-02-17 08:45

This suggests that your clients.db file couldn't be found. Try locating that file more appropriately. Scroll down to the section entitled "How to Specify Database Files".

I downloaded the SQLite JAR, put it in my CLASSPATH, and found a tutorial here that worked perfectly in less than five minutes. It put test.db in my project root, as expected.

I've rewritten that tutorial the way I'd do it. It works. Don't say it brings nothing.

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();
    }
}
查看更多
再贱就再见
5楼-- · 2019-02-17 08:46

I came across this issue trying to connect via Eclipse's "Data Source Explorer".

On a Mac, when I double clicked the file name in the browse prompt the database location was populated with the folder and the database with the file name. When I manually added the database file to the "Database Location" field I was then able to connect.

查看更多
不美不萌又怎样
6楼-- · 2019-02-17 08:51

I have the same problem here, and I think we have run into some bug. The exception is absolutely not caused by "the file non existing": I carefully checked it with a proper test case.

The database itself is created using sqlite3 official command line tool, so no corrupt database either. I can safely tell you the lib is broken somehow.

Please tell me what is your OS and JVM version so that I see if it matches mine, and we can prepare a bug report.

查看更多
叼着烟拽天下
7楼-- · 2019-02-17 08:54

I had the same problem. My solution is update the dependency sqlite-jdbc from version 3.7.2 to 3.16.1

查看更多
登录 后发表回答