単語のリストをデータベースに保存しようとしています。他のすべてのデータベース指向関数は正常に機能しますが、この特定のメソッドをループで呼び出すと、ResultSet is Closed
エラーが返されます。HashMap のメソッド構造をシミュレートしようとしています。問題のある方法は次のとおりです。
public int get(String key){
ResultSet rs = null;
int ret = -1;
try{
if(!running)
initialize();
rs = connection.createStatement().executeQuery("select frequency from Commonlist where word = '"+key+"'");
ret = rs.getInt("frequency");
}
catch(SQLException sqle){
sqle.printStackTrace();
}
finally{
try{rs.close();}catch(Exception e){e.printStackTrace();}
return ret;
}
}
でエラーがスローされるよう
ret = rs.getInt()
です。私はデータベースの世界の初心者であり、頭がおかしいようですが、誰もがかつては初心者でした:)。参考までに、クラス全体:
import java.sql.*;
import org.sqlite.*;
public class CommonList
{
private static Connection connection = null;
private static Statement query;
private boolean running = false;
public synchronized Connection getConnection(){
try{
if(running == false)
connection = DriverManager.getConnection("jdbc:sqlite:CommonList.db");
}
catch(Exception e){
e.printStackTrace();
}
running = true;
return connection;
}
public void initialize(){
try{
Class.forName("org.sqlite.JDBC");
connection = getConnection();
query = connection.createStatement();
query.setQueryTimeout(30);
query.executeUpdate("create table if not exists CommonList(word string,frequency integer)");
}
catch(Exception sqle){
sqle.printStackTrace();
}
}
public void put(String key,int frequency){
try{
if(!running)
initialize();
query.executeUpdate("delete from CommonList where word = '"+key+"'");
query.executeUpdate("insert into CommonList values('"+key+"',"+frequency+")");
}
catch(SQLException sqle){
sqle.printStackTrace();
}
}
public int get(String key){
ResultSet rs = null;
int ret = -1;
try{
if(!running)
initialize();
rs = connection.createStatement().executeQuery("select frequency from Commonlist where word = '"+key+"'");
ret = rs.getInt("frequency");
}
catch(SQLException sqle){
sqle.printStackTrace();
}
finally{
try{rs.close();}catch(Exception e){e.printStackTrace();}
return ret;
}
}
public void delete(String key){
try{
if(!running)
initialize();
query.executeUpdate("delete from CommonList where word = '"+key+"'");
}
catch(SQLException sqle){
sqle.printStackTrace();
}
}
public String toString(){
//Test code
ResultSet rs =null;
try{
rs = connection.createStatement().executeQuery("select * from CommonList");
System.out.println("Word Frequency\n---------------------------");
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getInt(2));
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{rs.close();}catch(Exception e){e.printStackTrace();}
return "Java Wrapper for SQLite Database";
}
}
private void closeConnection(){
if(connection!=null)
try{connection.close();}catch(Exception e){e.printStackTrace();}
}
public void close(){
closeConnection();
running = false;
}
}