使用数据库连接池优化程序性能

 

使用数据库连接池优化程序性能

缺点:用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

编写数据库连接池

编写连接池需实现javax.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:

Connection getConnection()

Connection getConnection(String username, String password)

实现DataSource接口,并实现连接池功能的步骤:

在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。

实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。

当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。

使用DBCP示例代码:

static{

       InputStream in = JdbcUtil.class.getClassLoader().

                     getResourceAsStream("dbcpconfig.properties");

       Properties prop = new Properties();

       prop.load(in);

 

       BasicDataSourceFactory factory = new BasicDataSourceFactory();

       dataSource = factory.createDataSource(prop);

}

编写自己的JDBC框架

元数据- DataBaseMetaData

元数据:数据库、表、列的定义信息。

Connection.getDatabaseMetaData()

DataBaseMetaData对象

getURL():返回一个String类对象,代表数据库的URL。

getUserName():返回连接当前数据库管理系统的用户名。

getDatabaseProductName():返回数据库的产品名称。

getDatabaseProductVersion():返回数据库的版本号。

getDriverName():返回驱动驱动程序的名称。

getDriverVersion():返回驱动程序的版本号。

isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

PreparedStatement . getParameterMetaData()

获得代表PreparedStatement元数据的ParameterMetaData对象。

Select * from user where name=? And password=?

ParameterMetaData对象

getParameterCount()

获得指定参数的个数

getParameterType(int param)

获得指定参数的sql类型

ResultSet. getMetaData()

获得代表ResultSet对象元数据的ResultSetMetaData对象。

ResultSetMetaData对象

getColumnCount()

返回resultset对象的列数

getColumnName(int column)

获得指定列的名称

 getColumnTypeName(int column)

获得指定列的类型

所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。

实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
v1.8优化了超过maxUsingTime的链接的处理,(直接关闭超长链接,新建新链接放回池中),防止出现超长链接直接放回池中后原超长链接使用者仍存在此链接产生的preparedstatement并执行preparedstatement,造成此语句被超长链接的后一使用者提交。 v1.7对池中返回的所有链接做了默认setAutoCommint(true)设置。 v1.6增加了一个配置项(类似于proxool的最大连接使用时间),当一个连接的使用时间超过这个配置后将被自动回收,改连接内的内容将被自动回滚。 v1.5将整个工具包优化减少了一个Wrap包装类,减少少量内存消耗。 v1.3改进了清理线程可能出现的减少连接池中链接而不计数的问题。 v1.2处理了oracle环境下由于服务器关闭休眠链接造成的连接池循环检测进程异常退出的情况,改为当循环周期大于服务器关闭休眠链接间隔时,后台打印异常并重新连接数据库。 R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用时确保存在log4j的jar包。 单池调用方式为Connection conn = R2PoolUtil.getStaticPool().getConnection(); conn用完后必须关闭,不然池中连接会被用完(原理:关闭conn时放回池中)。 多池调用方式为R2Pool pool1=R2PoolUtil.getPool(new File("第一个连接池的配置文件.properties")); Connnection conn1 = pool1.getConnection(); R2Pool pool2=R2PoolUtil.getPool(new File("第二个连接池的配置文件.properties")); Connnection conn2 = pool2.getConnection(); 修改源代码,请保留作者信息 张人杰 北京师范大学 计算机系 [email protected] 2012.01.05

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值