JDBC使用小记

写了一天JDBC的代码,学到了点东西,乘着还热乎把它们记下来。

Connection Pool
既然要连接数据库,当然会想到使用Connection Pool,节省资源嘛。老实说,我现在也还没完全搞清楚JDBC到底是否包含了Connection Pool,还是它只是标准化了一个接口。而且网上找到的大部分教程都是介绍如何在Tomcat或者Hibernate中配置Connection Pool,可是对于我这种从来不会用这些web框架,只懂得写J2SE的土人来说,难道就没有一个第三方的,开源的,不依赖于任何框架,能够和JDBC很好融合的Connection Pool库可以用了吗?也许是我还没有找到吧。最后只好自己写个极简单的实现。
贴几个找到的不错的link,备案:

http://www.cnblogs.com/panjun-donet/articles/1182204.html
http://dev.csdn.net/htmls/84/84685.html

非活动超时
因为用了自己写的简单的Connection Pool,所以问题就来了:一个长时间不活跃的连接可能会被server端给断了。貌似mysql默认的timeout的时间是8个小时。这意味着,如果今天的一个连接过了夜之后再次使用的时候就可能抛出connection的异常。其实如果不用Connection Pool,每次访问都创建一个新的连接,就不会有这个问题了(我相信一些好的Connection Pool的实现应该都解决了这个问题)。
网上找了很久,但貌似这个问题没有很好的解决办法。在Mysql4之前的版本,还可以在数据库连接字符串中增加“autoReconnect=true ”选项来解决这个问题,但最新的版本没有了这个功能。而JDBC中也没有可以检测Connection是否还活着的方法。网上大部分的解决方案都是修改mysql服务器端的配置文件,将timeout的时间设置得很长。但我觉着这个方法并不理想,因为这个问题应该是在client端解决的。
我现在的解决办法是扑捉异常,如果判断这个异常是由于Connection非活动超时造成的,就再重新连接一个数据库。(土办法,土办法…)

资源释放
用JDBC访问数据库,这中间会用到Connection,Statement,ResultSet,这些资源的释放就很有讲究了。这里给出一个相关的很好的文章:http://www.javaeye.com/topic/97229
文中给出了一个比较好的解决方案:

class SqlReader{ void read(ResultListener l){ final Connection conn = ...; try{ final Statement stmt = ...; try{ final ResultSet rset = ...; try{ l.call(rset); } finally{rset.close();} } finally{stmt.close();} } finally{conn.close();} }

别看代码有些别扭,按照作者的话说,这虽然是一下一下的擦,但也只有这样才能够把屁股擦干净。
不多说了,感兴趣的自己看原文吧。

ResultSet
这可是JDBC中很重要的一个类,看它的Javadoc,洋洋洒洒估计得有好几十个方法吧。可就是这些方法中,愣是没有我要的。我的需求就两个,特简单:判断结果是否为空和返回Set中record的数量。
这两个可以这么做:
判断为空:调用next方法,如果返回为false,说明是空的

if(!rs.next()) { return 0; }

计算数量: 将cursor移动到最后一行,然后返回这一行的行号

rs.last(); int rowCount = rs.getRow(); return rowCount;

Intersect替代方案

最后,今天写了个比较复杂的查询,才发现mysql不支持intersect运算。当然,这也有解决办法:

(SELECT S.Name
FROM STUDENT S, TRANSCRIPT T
WHERE S.StudId = T.StudId AND T.CrsCode = 'CS305')
INTERSECT
(SELECT S.Name
FROM STUDENT S, TRANSCRIPT T
WHERE S.StudId = T.StudId AND T.CrsCode = 'CS315')


在mysql中可以这样实现:
select a.* from
(
SELECT S.Name
FROM STUDENT S, TRANSCRIPT T
WHERE S.StudId = T.StudId AND T.CrsCode = 'CS305'
) as a
cross join
(
SELECT S.Name
FROM STUDENT S, TRANSCRIPT T
WHERE S.StudId = T.StudId AND T.CrsCode = 'CS315'
) as b on a.Name = b.Name;

相关link:http://www.cnblogs.com/cy163/archive/2008/11/08/1329867.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值