Java SQLException是否发生取决于我们检索的值
我正在使用一个方法Java SQLException是否发生取决于我们检索的值,java,sqlite,jdbc,arraylist,Java,Sqlite,Jdbc,Arraylist,我正在使用一个方法getTasksDay(LocalDate-day),该方法返回一个列表,其中包含我自己的类家庭作业任务(如下所示)中的对象。我得到一个SQLException:当列表中的一个homeworkstasks的done属性值为true时,在下一次数据库查询中数据库已关闭。但是,当所有这些值都为false时,一切正常 我不知道该怎么做才能解决这个问题,因为fix意味着不管布尔值是多少,它都可以正常工作。还有,有人能解释一下这种行为吗 我尝试过的 public List<Home
getTasksDay(LocalDate-day)
,该方法返回一个列表
,其中包含我自己的类家庭作业任务
(如下所示)中的对象。我得到一个SQLException:当列表中的一个homeworkstasks
的done属性值为true
时,在下一次数据库查询中数据库已关闭。但是,当所有这些值都为false
时,一切正常
我不知道该怎么做才能解决这个问题,因为fix意味着不管布尔值是多少,它都可以正常工作。还有,有人能解释一下这种行为吗
我尝试过的
public List<HomeworkTask> getTasksDay(final LocalDate day) {
String dayString = day.toString();
String sql = "SELECT done, task, label, color " + "FROM tasks " + "WHERE day = '"
+ dayString + "' ORDER BY orderInDay";
List<HomeworkTask> homeworkTasks = new ArrayList<>();
setConnection();
try {
statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
HomeworkTask homeworkTask = new HomeworkTask(
resultSet.getBoolean("done"),
resultSet.getString("task"),
resultSet.getString("label"),
resultSet.getString("color"));
homeworkTasks.add(homeworkTask);
}
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
return homeworkTasks;
}
private void setConnection() {
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection(databasePath);
} catch (SQLException e) {
e.printStackTrace();
}
}
当我不关闭连接或语句时,没有数据库已关闭
错误,因此可以说它工作正常。但是,这可能会导致异常,如数据库已被锁定或类似的情况,并且与数据库有多个打开的连接不是一个好主意
让此方法返回值为false
的所有家庭作业任务,让另一个方法返回值为布尔值的ArrayList
。然后将这些布尔值设置为HomeworkTask
done属性的值。这仍然会带来同样的问题。即使将布尔值更改为true
完全是在与数据库的连接之外发生的,我不知道这会如何影响数据库行为
创建一个不同的方法,该方法返回ArrayList
的ArrayList
,其中四个值done
、task
、label
、color
作为字符串。然后让getTasksDay(LocalDate-day)
调用该方法,然后使用这些字符串值创建并返回家庭作业任务列表。同样的错误
总的来说,我觉得奇怪的是,从数据库检索数据后使用数据会影响数据库行为。但也许我找错地方了。欢迎对其他地方提出任何建议
其他信息
我将IntelliJ与SQLite(Xerial)或jdbc一起使用
表tasks
如下所示
id INT PRIMARY KEY, done BOOLEAN, day DATE, task CHAR(255), label CHAR(10), color CHAR(50), orderInDay INT
getTasksDay方法
public List<HomeworkTask> getTasksDay(final LocalDate day) {
String dayString = day.toString();
String sql = "SELECT done, task, label, color " + "FROM tasks " + "WHERE day = '"
+ dayString + "' ORDER BY orderInDay";
List<HomeworkTask> homeworkTasks = new ArrayList<>();
setConnection();
try {
statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
HomeworkTask homeworkTask = new HomeworkTask(
resultSet.getBoolean("done"),
resultSet.getString("task"),
resultSet.getString("label"),
resultSet.getString("color"));
homeworkTasks.add(homeworkTask);
}
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
return homeworkTasks;
}
private void setConnection() {
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection(databasePath);
} catch (SQLException e) {
e.printStackTrace();
}
}
HomeworkTaks.java
class HomeworkTask implements Serializable {
private boolean done;
private String text;
private String label;
private String color;
public HomeworkTask(final boolean done, final String text, final String label, final String color) {
this.done = done;
this.text = text;
this.label = label;
this.color = color;
}
public boolean getDone() {
return done;
}
public void setDone(final boolean done) {
this.done = done;
}
public String getText() {
return text;
}
public void setText(final String text) {
this.text = text;
}
public String getLabel() {
return label;
}
public void setLabel(final String label) {
this.label = label;
}
public String getColor() {
return color;
}
public void setColor(final String color) {
this.color = color;
}
}
我认为用下面的方法直接创建对象存在一些问题
HomeworkTask homeworkTask = new HomeworkTask(
resultSet.getBoolean("done"),
resultSet.getString("task"),
resultSet.getString("label"),
resultSet.getString("color"));
我宁愿做
boolean done = resultSet.getBoolean("done");
String task = resultSet.getString("task");
String label = resultSet.getString("label");
String color = resultSet.getString("color");
HomeworkTask homeworkTask = new HomeworkTask(done,task,label,color);
如果可能的话,试试看。我认为用下面的方法直接创建对象会有一些问题
HomeworkTask homeworkTask = new HomeworkTask(
resultSet.getBoolean("done"),
resultSet.getString("task"),
resultSet.getString("label"),
resultSet.getString("color"));
我宁愿做
boolean done = resultSet.getBoolean("done");
String task = resultSet.getString("task");
String label = resultSet.getString("label");
String color = resultSet.getString("color");
HomeworkTask homeworkTask = new HomeworkTask(done,task,label,color);
如果可能的话,试一试。谢谢你的建议,我没有直接想到这一点。但是,当再次尝试访问数据库时,这仍然会引发数据库已关闭
错误…您的意思是在第二次观察异常时调用“getTasksDay”方法吗?当调用从数据库获取数据的另一个方法时,会出现异常。这也可能是getTasksDay
,我认为这对尝试连接到关闭的数据库没有影响。您的连接对象是单例对象吗?如果它是单例对象,并且您在每次检索后都尝试关闭它,那么您所看到的是预期的。如果线程1打开连接并尝试重设数据,这意味着线程2使用连接执行操作,然后在线程1完成之前关闭连接,那么我们将看到SQLException:数据库已关闭感谢建议,没有直接想到这一点。但是,当再次尝试访问数据库时,这仍然会引发数据库已关闭
错误…您的意思是在第二次观察异常时调用“getTasksDay”方法吗?当调用从数据库获取数据的另一个方法时,会出现异常。这也可能是getTasksDay
,我认为这对尝试连接到关闭的数据库没有影响。您的连接对象是单例对象吗?如果它是单例对象,并且您在每次检索后都尝试关闭它,那么您所看到的是预期的。如果线程1打开连接并尝试重设数据,意味着线程2使用连接执行操作,然后在线程1完成之前关闭连接,那么我们将看到SQLException:数据库已关闭