发布一个自己写的数据库连接池(测试),附带源码!

MagicianLiu 2006-03-28 04:02:59
这是自己开发的一个数据库连接池,在设计时充分考虑的开发中效率,效果还是欢迎大家都来测试。
下载地址:http://down5.zol.com.cn/bbs_upload/upload/2006/03_28/1143531695286.rar

包中已经实现了Connection接口。开发时引用本包内的Connection类

特点:
1、实现跨数据库平台:因为程序传递的参数一定的,但是各个数据库语句有很大差别。将SQL语句存放在文件外部(一般为properties文件)给与一个关键字。在程序中调用此关键字获得SQL语句。如果有参数可以使用?或者@@参数索引@@调用参数。这样非常方便更改SQL语句而不需要重新编译Class。如果都是?参数。可以用PreparedStatement调用。如果包含@@参数索引@@,通过包内的DynamicSQL调用
例如:
使用?:
SQLServer.properties文件中
authors = select * from authors where au_lname like ? and au_fname like ?

在Java中
Connection = ConnectionPools.getConnection();
PreparedStatement ps = cn.createPreparedStatement(cn.getSQL("authors"));
ps.setString(1,"h");ps.setString(2,"h");
java.sql.ResultSet rs = ps.executeQuery();

使用@@索引@@
SQLServer.properties文件中
authors = select * from authors where au_lname like @@1@@ and au_fname like @@1@@

在Java中
Connection = ConnectionPools.getConnection();
DynamicSQL ds = cn.getDynamicSQL("authors");
ds.setString(1,"h");
org.magus.sql.ResultSet rs = cn.executeQuery(ds);
可以看出使用索引方式更灵活

通过使用自定义的ResultSet。可以实现不需要引入java.sql.*包。该对象通过cn.executeQuery获得,参数可以为SQL语句,也可以是ds。但是自定义ResultSet执行的SQL语句(DynamicSQL)。只支持常用类型,例如数字、字符、时间。其他还是需要使用preparedStatement。

2、启动缓存方式:在配置文件中设定cache=true。缓存中使用SQL语句和DynamicSQL作为键。将结果储存在缓存中,通过自己实现的ResultSet,并且不在常连数据库连接。使数据库利用更为合理,数据访问更快。也可以将PreaparedStatement生成的ResultSet缓存。不过需要做转换。org.magus.sql.ResultSet rs = new ResultSet(java.sql.ResultSet)。通过Connection.addCache(String key,ResultSet)存储,获得通过Connection.getCache(key)获得。Connection为org.magus.sql.Connection实例。
3、自动清理选项:autoClear=true。设定此选项后。可以时时找出未被释放的连接,并加入到空闲连接池中。该选项主要作用是找到那些没有使用关闭操作的的Connection和Statement。使资源能及时释放。
4、可自定义开发多种数据库,可以参考src目录下的org.magus.sql.database.DataBase。

配置说明:
1、配置单例数据库:只需要在根目录下设置db.properties。这是默认的位置。调用直接用无参的

ConnectionPoosl.getConnection();调用
2、配置多例数据库:需要pools.properties。在文件中指定多例数据库的文件路径
例如:pools.properties
db=/db.properties
oralce=/oracle.properties
3、数据库实例配置信息:例如db.properties
Driver=数据库驱动
Connection=连接字符串
User=连接用户名
Password=连接密码
Type=数据库类型。在org.magic.sql.database下SQLServer和MySQL、Oracle中一个。也可

以自定义。
//自动清理。注意启动自动清理会占用服务器端内存,并且可能会推迟一点访问时间。因为要遍历

一次连接池。
autoClear=true
//连接超时时间。在启动autoClear时有效
timeOut=10000
//Statement超时时间 在启动autoClear时有效
stmtTimtOut=10000
//启动缓存。缓存中保存的是ResultSet。是自己实现的ResultSet。避免和数据库常连。位于org.
cache=true
//清理时间间隔 在启动autoClear时有效
time=10000
//SQL语句存放路径,默认数据库类型.sql.properties
SQLPath=/SQLServer.properties
//最大连接数。默认无限制
maxConnection=100
//最大空闲数。默认无限制
maxFree=-1
//调试,显示信息
debug=false

现在正在测试性能,希望和大家一起交流。
QQ:1168064
magus.org@163.com
...全文
781 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kill8108 2006-04-03
  • 打赏
  • 举报
回复
学习。。。。
MagicianLiu 2006-04-03
  • 打赏
  • 举报
回复
peihexian(知其然.知其所以然) 说的极是。最初开发时考虑的是替代java.sql包,实现跨数据库开发、提高访问速度和效率、降低服务器负担考虑的。。。并且通过自定义的一些加强功能。
当然可以用java.sql包中的对象来引用连接池对象java.sql.connection = ConnectionPools.getConnection();那么这个实例只能引用原来Connection的接口。而不能使用加强功能接口。因为连接池中Connection实现了java.sql.Connection接口,ResultSet也实现了java.sql.ResultSet接口。如果不引入本包的类,那么只能作为一个连接池使用了,引用本包的类就可以实现跨数据库平台开发程序了。

supersunyi(赖赖虫) 我可不是高人啊,我也是刚学JAVA不久啊,只是有点自己的想法而已,还要向各位老大们学习啊。。。。


Saro(三生) 好主意啊。。。我考虑一下。呵呵
Saro 2006-04-01
  • 打赏
  • 举报
回复
楼主应该改个名字,不该叫连接池的,你这是ConnectionPool+object pool+cache的一个东东。
还有,如果别人用了这个,就和你的连接池绑定,基本上没法换了。
supersunyi 2006-04-01
  • 打赏
  • 举报
回复
高人啊高人,什么时候我们可以互相讨论下数据库连接池的一些别人想不到的问题啊,我是说假设我们要自己写连接池,会有写漏掉,这些东西谁能提一下呢,比如jfy3d(剑事)说的,这个我就没考虑过,所以谁可以说一下呢,学习中,因为我也在写,但我不想看人家代码,我就想从大家的考虑中获取信息,从而去写出来
peihexian 2006-04-01
  • 打赏
  • 举报
回复
下载了,没细看,只看了一眼你的demo中使用的connection不是java.sql.connection就不看了,楼主注意一般的程序开发者在使用dbpool时不会影响到现有的任何程序代码,也就是说不需要引用你的dbpool包中的任何package或类,更不会使用你的package中定义的connection对象,所以楼主在实现dbpool时要使用java的代理机制来管理java.sql.connection.close方法,实际上c3p0或apache的dbcp也都是这么做的,目的就是dbpool不会侵入使用者的代码。

如果楼主只是想自己用就无所谓了,如果发布出来给大家用,要考虑支持spring等现在流行的框架,好多人现在是用or mapping工具+spring来做应用的。

最后,楼主精神可嘉,值的我们学习!
lulu123ma 2006-03-31
  • 打赏
  • 举报
回复
向高手致敬!
Saro 2006-03-31
  • 打赏
  • 举报
回复
支持。
MagicianLiu 2006-03-31
  • 打赏
  • 举报
回复
有用过的吗??多给点批评意见啊!!
MagicianLiu 2006-03-29
  • 打赏
  • 举报
回复
jfy3d(剑事) 不能重新连接,因为后台中已经把断开的连接清除了,断开后都是新申请的连接,而不是原来连接池中的连接。但断开后重新启动数据库不影响现有页面中的连接应用,在断开时间不过连接都为新连接而已。

csclg(csclg) :可以在添加记录时清空缓存cn.clearCache()
lilygt 2006-03-29
  • 打赏
  • 举报
回复
mark
weichenggao 2006-03-29
  • 打赏
  • 举报
回复
好东西,学习..
zeq258 2006-03-29
  • 打赏
  • 举报
回复
关注,学习!
csclg 2006-03-29
  • 打赏
  • 举报
回复
保存在缓存中,比如我现在新加了一条数据,那岂不是显示不出来了?
duye 2006-03-28
  • 打赏
  • 举报
回复
mark
wjr1982et 2006-03-28
  • 打赏
  • 举报
回复
顶,先看看
剑事 2006-03-28
  • 打赏
  • 举报
回复
网络中断 可以自动重新连接么

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧