java的threadlocal能否自定义清理函数或servlet数据库技巧

来源:百度知道 编辑:UC知道 时间:2024/06/20 19:03:01
直接说我现在的问题吧。。。
我在用servlet,其中要访问数据库
现在的问题是,我希望我的statement是可重用的。但同时statement不是线程安全的。而servlet里面每次rpc调用都是一个新的线程,这样我就不能只用一个statement了。。。
我现在的想法是用Threadlocal,但是遗憾的是threadlocal并不会在线程结束后调用statement的close函数,所以请问下有没有办法扩展出这样的一个threadlocal来。
或者如果有更好的方法的话也请告诉我,谢谢了。
话说当时也这样想自己封装个threadstatement,不过没想清楚怎么继承,然后觉得不可行,不过现在仔细想想,根本不用继承。最后给大家看看代码吧:
private class ThreadStatement
{
private Statement stmt;

public ThreadStatement(Statement stmt)
{
this.stmt = stmt;
}

@Override
protected void finalize() throws Throwable
{
stmt.close();
}

public Statement getStatement()
{
return stmt;
}
}

private Connection conn = null;
private ThreadLocal<ThreadStatement> stmt;
public Statement getStatement() throws SQLException
{
if (this.stmt.get() == null)
{
this.stmt.set(new ThreadStatement(conn.createStatemen

自己封装一个类threadStatement,statement放这个类里边,threadStatement放到ThreadLocal里边,threadStatement重写protected void finalize()方法释放资源

我解决的办法就是 在 servlet 开头 判断 session.getAtr("user") == null

user 对应的是 登陆的用户实体bean `

如果用户有足够的权限` 就可以去访问数据库`
如果用户没有足够的权限`就直接跳转到错误页面`

至于重用` 我建议通过 权限判断之后` 把数据读给一个 List ``
然后把 List 加入到 request.getSession().setAtr("users") 中`
但是这样也就有了 清理session的困难`
所以什么时候清理 session 是要靠自己把握的``
比如在用户刚跳转到此页面的时候``就把 session 清理掉`

如果是做了分页`就在进入第一页之前把 session 清理掉``
然后在第一页中读取所有数据给 List ``然后扔进新的 session 中`
再后面的页只要判断 session 中有没有` 有的话就可以直接读了```

提供分页实体bean 方法:

subList(startnum , endnum);
详细请参考 API `

希望能帮到你``

用连接池呗,create statement并不费什么事吧,connection你重用不就好了。如果你非要重用statement,整个statement的list放到application 里