Java SQLite内存不足异常
我得到的是“java.sql.SQLException:[SQLITE\u误用]库使用不正确(内存不足)”。我粘贴数据库连接对象的代码示例Java SQLite内存不足异常,java,sqlite,jdbc,synchronized,Java,Sqlite,Jdbc,Synchronized,我得到的是“java.sql.SQLException:[SQLITE\u误用]库使用不正确(内存不足)”。我粘贴数据库连接对象的代码示例 public class DBhandler { private String DBUrl="d:\\sqlitedb\\somdb.db"; private String driverName="org.sqlite.JDBC"; private String jdbc="jdbc:sqlite:"; private Connect
public class DBhandler {
private String DBUrl="d:\\sqlitedb\\somdb.db";
private String driverName="org.sqlite.JDBC";
private String jdbc="jdbc:sqlite:";
private Connection con=null;
private Statement stmnt=null;
public DBhandler()
{
try {
Class.forName(this.driverName);
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
this.con=DriverManager.getConnection(this.jdbc+this.DBUrl);
this.stmnt=con.createStatement();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public CurrentActiveSom getCurrentActiveSom()
{
CurrentActiveSom cas=null;
String query="select * from current_active_som where active=1";
ResultSet rs=null;
try {
rs=this.stmnt.executeQuery(query);
if (rs.next())
{
cas= new CurrentActiveSom();
cas.setMonth(rs.getString("month"));
cas.setYear(rs.getString("year"));
cas.setIsActive(rs.getInt("active"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
rs.close();
this.stmnt.close();
this.con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return cas;
}
public CurrentActiveSom getIsDoneSom(String month,String year)
{
CurrentActiveSom cas=null;
String query="select * from current_active_som where month='"+month+"' and year='"+year+"' and active=0";
ResultSet rs=null;
try {
rs=this.stmnt.executeQuery(query); //this is exception line
}
if (rs.next())
{
cas= new CurrentActiveSom();
cas.setMonth(rs.getString("month"));
cas.setYear(rs.getString("year"));
cas.setIsActive(rs.getInt("active"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
//rs.close(); //if i uncomment this gets null pointer exception
this.stmnt.close();
this.con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return cas;
}
使用DBhandler的相同对象调用这两个方法
DBhandler db=new DBhandler();
CurrentActiveSom cas1=db.getCurrentActiveSom();
CurrentActiveSom cas2=db.getIsDoneSom(String month,String year)
然后我得到了上面的例外
但是如果我们用不同的对象DBhandler调用这两个方法
DBhandler db1=new DBhandler();
DBhandler db2=new DBhandler();
CurrentActiveSom cas1=db1.getCurrentActiveSom();
CurrentActiveSom cas2=db2.getIsDoneSom(String month,String year)
那么代码就可以正常工作了
这是因为连接存在同步问题吗?如何解决这个问题?嗯,“内存不足”错误看起来很奇怪,但一个明确的错误在于每次程序运行(在构造函数中)创建一次连接,然后在每个数据访问方法中关闭连接
此代码:
CurrentActiveSom cas1=db.getCurrentActiveSom();
关闭连接
,因此此代码:
CurrentActiveSom cas2=db.getIsDoneSom(String month,String year)
尝试从关闭的数据库获取数据。如果您正在使用某种连接池,在这种连接池中关闭连接会将其返回到池中,那么这是可以的。但你似乎在处理一个单一的物理连接
所以,在从数据库获取数据之后,而不是在每个数据访问方法中关闭它。在调用'rs'之前关闭连接。下一步(),所以结果集尝试从已经关闭的连接中读取。那么我应该在finalize()中关闭连接吗?
finalize()
是一个完全不同的故事,我建议你不要碰这种方法。只需在DBhandler
中创建一个closeConnection()
方法,并将con.close()
放在该方法中。然后依次调用:newdbhandler()
,数据访问方法,然后调用DBhandler.close()
。此外,每次在数据访问方法中都需要创建语句
对象,而不是在DBHandler
中创建一次。如果您想了解有关终结的更多信息,请看这里:本文的底线是:仅在必须时才使用终结。这并不是一种真正可靠的清理方法。