连接池技术


为什么要使用连接池
数据库连接的建立及关闭资源消耗巨大。传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开、关闭该物理连接, 系统性严重受损。
解决方案:数据库连接池(Connection Pool)。
系统初始运行时,主动建立足够的连接,组成一个池.每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接,使用完后,不再关闭,而是归还。


图-3 连接池示意图
连接池中连接的释放与使用原则
  • 应用启动时,创建初始化数目的连接
  • 当申请时无连接可用或者达到指定的最小连接数,按增量参数值创建新的连接
  • 为确保连接池中最小的连接数的策略:
  1. 动态检查:定时检查连接池,一旦发现数量小于最小连接数,则补充相应的新连接,保证连接池正常运转
  2. 静态检查:空闲连接不足时,系统才检测是否达到最小连接数
  • 按需分配,用过归还,超时归还
连接池也只是JDBC中定义的接口,具体实现由厂商实完成。
使用Apache DBCP连接池
DBCP(DataBase connection pool):数据库连接池,是Apache的一个 Java 连接池开源项目,同时也是 Tomcat 使用的连接池组件。相当于是Apache开发的针对连接池接口的一个实现方案。
连接池是创建和管理连接的缓冲池技术,将连接准备好被任何需要它们的应用使用。


图-4连接池在数据访问中的应用
使用Apache DBCP需要两个jar包文件:
  • commons-dbcp-1.4.jar 连接池的实现
  • commons-pool-1.5.jar 连接池实现的依赖库
将上述两个文件在MyEclipse的Build Path选项中导入到项目
通过DataSource获取连接
先通过属性文件获取连接池参数,然后加载这些参数,获得连接:
  1. //创建数据源对象
  2. private static BasicDataSourcedataSource = new BasicDataSource();
  3. //加载参数
  4. dataSource.setDriverClassName(driveClassName);
  5. dataSource.setUrl(url);
  6. dataSource.setUsername(username);
  7. dataSource.setPassword(password);
  8. //获得连接
  9. Connection conn = dataSource.getConnection();
连接池参数
 
  1. initialSize :连接池启动时创建的初始化连接数量(默认值为0)
  2. maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
  3. maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
  4. minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)
  5. maxWait  :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)
  6. poolPreparedStatements:开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)
  7. maxOpenPreparedStatements:开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)
  8. minEvictableIdleTimeMillis  :连接池中连接,在时间段内一直空闲, 被逐出连接池的时间
  9. (默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关)
  10. removeAbandonedTimeout  :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
  11. removeAbandoned  :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)

. 异常处理
. SQLException简介
Java.sql.SQLException是在处理JDBC时常见的exception对象,用来表示JDBC操作过程中发生的具体错误;
一般的SQLException都是因为操作数据库时出错 , 比如Sql语句写错,或者数据库中的表或数据出错。
常见异常:
  • 登录被拒绝
可能原因:程序里取键值对信息时的大小写和属性文件中不匹配
  • 列名无效
可能原因:查找的表和查找的列不匹配
  • 无效字符
可能原因:SQL语句语法有错 , 比如语句结尾时不能有分号
  • 无法转换为内部表示
可能原因:结果集取数据时注意数据类型。
  • 表或者视图不存在
检查SQL中的表名是否正确
  • 不能将空值插入
检查执行insert操作时,是否表有NOT NULL约束,而没有给出数据
  • 缺少表达式
检查SQL语句的语法
  • SQL 命令未正确结束
检查SQL语句的语法
  • 无效数字:
  • 企图将字符串类型的值填入数字型而造成,检查SQL语句
其他可能出现的异常
  • 文件找不到
可能原因:db.properties文件路径不正确
注意: 新增数据后务必要commit, 否则Java程序运行查询后找不到数据。
. 处理SQLException
SQLException属于Checked Exception,必须使用try…catch或throws明确处理。
  1. public static synchronized Connection getConnection() throws SQLException {
  2. //语句,省略
  3. }
或者:
  1. try {
  2.     //语句,省略    
  3. } catch (SQLException e) {
  4.     e.printStackTrace();//追踪处理
  5. //throw new RuntimeException(e);//或者抛出
  6. }

spring-dbcp配置
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
<property name="driverClassName" value="${db.driverClassName}"/>  
<property name="url" value="${db.url}"/>  
<property name="username" value="${db.username}"/>  
<property name="password" value="${db.password}"/>  
<!--initialSize: 初始化连接-->  
<property name="initialSize" value="5"/>  
<!--maxIdle: 最大空闲连接-->  
<property name="maxIdle" value="10"/>  
<!--minIdle: 最小空闲连接-->  
<property name="minIdle" value="5"/>  
<!--maxActive: 最大连接数量-->  
<property name="maxActive" value="15"/>  
<!--removeAbandoned: 是否自动回收超时连接-->  
<property name="removeAbandoned" value="true"/>  
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->  
<property name="removeAbandonedTimeout" value="180"/>  
<!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒-->  
<property name="maxWait" value="3000"/>  
<property name="validationQuery">  
<value>SELECT 1</value>  
</property>  
<property name="testOnBorrow">  
<value>true</value>  
</property>  
</bean>  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值