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

当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.(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.(Actions.java:18) at controler.ClientControler.(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 people = new ArrayList(); people.add(new Person("Gandhi", "politics")); people.add(new Person("Wittgenstein", "philosophy")); people.add(new Person("Turing", "computers")); saveAll(conn, people); List rows = findAll(conn); System.out.println(rows); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { close(conn); } } private static List findAll(Connection conn) throws SQLException { List rows = new ArrayList(); 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 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(); } } 

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

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

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

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

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

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

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

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

就像DarkCthulhu已经提到的那样,你的数据库文件的路径中不能有任何空格。 即使您声明了它的相对路径(如在您的情况下),这也适用。 我敢打赌,你项目的路径包含一个或多个空格。

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

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

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