这几天天昏地暗地编程,今天终于完成到了可以实现编译文件和判题功能的部分,上次写文章的时候大年29,现在都快正月十五了,除了过年那两天实在没什么心情,我实在还是效率很低的,才写了一千多行代码,今天不想解释编译和判题的部分了,来谈谈连接池技术.
在JDBC2.0以后的版本中,JDK是提供自动的连接池功能的,很多人都用过,我不想多说,在这里,我要说的是我自己实现的一个连接池(当然,不能算是原创,我参考了Karl Moss在《Java Servlet Developer's Guide》里面的实现方法).为什么要自己实现一个连接池?呃,第一,我对JAVA提供的用法没有什么把握,不清楚到底是怎么工作的,第二,个人兴趣吧,放寒假中的我实在很无聊。
先说说为什么需要连接池。在对数据库的操作中,开销最大的建立到数据库的连接。这是很容易明白的道理,建立一个连接,最省的操作也起码有检验用户信息、打开文件、在内存中创建缓存等等。更不用说在对不同数据库、不同数据库引擎使用统一方法操作涉及到的协议交换、接口转换等等。这些时间是无法或者很难消除的。一个很小的不要求效率的系统或许没问题,但是一旦对响应时间作出需求,这就是个大问题。就拿我在做的在线评测系统来说,1分钟内一个用户在线答一题,随便怎么创建连接都没问题(再耗时也不过十几毫秒),如果同时答题的人达到10个(对于在线答题系统来说,这个数字太平常了,参考ZOJ,POJ的日常数量就在这个范围左右)就有可能会出现问题了,因为每个用户的每个操作几乎都和数据库有关,最少包括显示题目,提交代码,判题,查看提交状态,再查看其他题目。而整个判题过程中又包括获取提交编号,验证用户信息,验证题目信息,建立提交记录,获取判题相关信息,判题,更新提交状态等等,每个操作起码代表访问一次数据库,粗粗一算就是十几次,并且很多部分使用一个连接并不合理,且这样降低了系统的安全性。如果多建立几次连接,耗去的时间就是秒级的了,秒级的响应时间,一个用户是很容易感觉出来的,更不用说调用编译器编译代码,判断运行结果等等这些更加耗时,却无法节省的时间。如果是举行在线竞赛,参加过ACM的人都知道在开始和快结束的时候,服务器都是爆满状态,这时候,即使只节省一豪秒,对于每分钟几百次的提交和点击来说节省的总时间也是很可观的。这就是连接池的必要性。
所谓连接池,就是预先获得并且保存一定量的活动连接放在容器里,称为一个池。在需要使用数据库连接的时候,从中取出一个连接,用完了再放回来的技术。总体来说,使用JAVA还是比较容易实现的。当然,还有不少细节问题需要考虑。
…………………………………………未完成,睡觉先~明天继续