Java Timer定时器的问题。
本帖最后由 cxmessage 于 2013-08-10 13:34:17 编辑 如图所示:
java timer 定时器 jdbc
public List<Articles> query(int indexone, int indextwo, String titleonetitle) {
String sqlstr = "SELECT articles.id,articles.title,MAX(clickcounts) AS clickcounts,articles.img FROM articles WHERE "
+ "forid IN(SELECT titletwo.`ID` FROM titletwo WHERE forid IN (SELECT id FROM titleone WHERE titletab=?)) GROUP BY clickcounts desc limit ?,?;";
mysqlcon = Mysqlcon.getInstacce();
Connection connection = null;
try {
connection = mysqlcon.getConnection();
} catch (SQLException e1) {
System.err.println("获取连接桥失败..");
e1.printStackTrace();
}
List<Articles> list = new ArrayList<>();
try {
ps = (PreparedStatement) connection.prepareStatement(sqlstr);
ps.setString(1, titleonetitle);
ps.setInt(2, indexone);
ps.setInt(3, indextwo);
ResultSet rs = (ResultSet) ps.executeQuery();
while (rs.next()) {
Articles articles = new Articles();
articles.setId(rs.getInt(1));
articles.setTitle(rs.getString(2));
articles.setClickcounts(rs.getInt(3));
articles.setImg(rs.getString(4));
list.add(articles);
}
timer = new Timer(true);
timer.schedule(new TimerTask() {
public void run() {
这里会报错,说的是必须设置rs,connection为final类型
mysqlcon.free(rs, ps, connection);
}
}, 0, 5000);
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
代码块结束后普通的局部变量会消亡,而创建的局部内部类对象并不会随着语句块的结束而消亡。final的局部变量的存储方式和普通的局部变量不同,其不会因为语句块的结束而消失,还会长期存在,因此可以被局部内部类访问。
[解决办法]
要求final,就满足它吧。
这时候外边可不能再close它们了。
[解决办法]
timer.schedule(new EveryNMinuteDataCollectionTask(location),m*1000,n*1000*60);