![](/img/trans.png)
[英]How do I establish a connection from my java program to sqlite3? Package error when attempting
[英]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.