• 1. 数据库连接池2018年10月22日1
  • 2. 注册一个driver; Class.forName(driverClassName); 建立一个到数据库的连接; Connection connection=DriverManager.getConnection(url); 创建一个statement; Statement statement=connection.createStatement(); PreparedStatement preparedStatement=connection.prepareStatement(sql); preparedStatement.setXXX(index,Object);2018年10月22日2JDBC访问数据库
  • 3. JDBC访问数据库执行SQL语句; ResultSet resultSet=statement.executeQuery(sql); int num=statement.executeUpdate(sql); 处理结果; while(resultSet.next()){ resultSet.getXXX(index); } 关闭JDBC对象; connection.close(); 2018年10月22日3
  • 4. JDBC2018年10月22日4
  • 5. 数据库访问优化1.prepareStatement优于Statement, 欲编译sql语句,效率高。 避免sql拼接产生安全漏洞。 2.sql语句中少用“*” 3.resultSet.getXXX(index)优于resultSet.getXXX(colName); 4.多数据更新用批量操作 5.事务处理手动提交,抛异常后回滚 6.基于异常的编程思想,异常向上层抛出2018年10月22日5
  • 6. 为什么要使用连接池在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法。 解决方案:复用这些已经建立的数据库连接2018年10月22日6
  • 7. 连接池工作流程数据库连接池的主要操作如下: (1)建立数据库连接池对象(服务器启动)。 (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。 (3)对于一个数据库访问请求,直接从连接池中得到一个连接。 (4)存取数据库。 (5)将连接重新放入池中   (6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。 2018年10月22日7
  • 8. JSP数据库连接池2018年10月22日8
  • 9. 思考:如果连接池空闲连接都拿完了,怎么办? 连接池没有空闲连接时,连接池会不断产生连接吗? 所有的活跃连接一直不归还连接池,连接池也不再产生新的连接,该怎么办? 什么时候触发回收机制? 什么样的连接是无效连接? 2018年10月22日9
  • 10. DBCPDBCP是一个依靠Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用 可到http://commons.apache.org/dbcp/了解详情 下载页面:http://commons.apache.org/downloads/download_dbcp.cgi 配置参数说明:http://commons.apache.org/dbcp/configuration.html api说明:http://commons.apache.org/dbcp/apidocs/index.html2018年10月22日10
  • 11. 编程步骤导入commons-pool.jar,commons-dbcp.jar 构造BasicDataSource对象 BasicDataSource basicDataSource=new BasicDataSource(); 设置配置参数 basicDataSource.setDriverClassName(driverClassName); basicDataSource.setUrl(url); basicDataSource.setUsername(username); basicDataSource.setPassword(password); 2018年10月22日11
  • 12. 编程步骤从BasicDataSource中得到Connection Connection connection = basicDataSource.getConnection(); 关闭Connection(把Connection放入池中) connection.close(); 关闭BasicDataSource basicDataSource.close();2018年10月22日12
  • 13. DBCP参数配置说明 连接数据库驱动类名 driverClassName=com.mysql.jdbc.Driver 连接数据库的 URL url=jdbc:mysql://127.0.0.1:3306/user_manager?user=root&password=285022 登陆数据库用户名 username=root 登陆数据库密码 password=285022 2018年10月22日13
  • 14. DBCP参数配置说明 是否自动提交事务,默认值为 true defaultAutoCommit=false 对数据库操作是否只读,默认值为 false defaultReadOnly=false 默认连接的数据库 defaultCatalog=user_manager2018年10月22日14
  • 15. DBCP参数配置说明 连接池创建时产生的初始化连接数,默认为0 initialSize=10 连接池在同一时间内分配的最大使用连接数量,设负数为没有限制 maxActive=50 最大空闲连接,没有多余的连接被释放或负数时为没有限制 maxIdle=20 最小空闲连接,没有多余的连接被创建或0为不创建 minIdle=5 最大等待毫秒数,没有可用连接时,超过此时间会丟出错误信息 maxWait=10002018年10月22日15
  • 16. DBCP参数配置说明是否回收无效连接, 默认是 false removeAbandoned=true 几秒后回收无效连接, removeAbandoned 必须为 true removeAbandonedTimeout=180 是否在自动回收超时连接的时候打印连接的超时错误, 默认为 false logAbandoned=true2018年10月22日16
  • 17. DBCP参数配置说明取得连接是否进行有效性验证,默认为false,如果验证失败,会删除此连接转而连接其他的连接 testOnBorrow=true 对空闲的连接空闲是否进行有效性验证,如果验证失败,会删除此连接 testWhileIdle=true 返回连接时是否进行有效性验证 testOnReturn=true 验证连接是否成功, SQL SELECT 指令至少要返回一行 validationQuery=select sysdate from dual2018年10月22日17
  • 18. DBCP参数配置说明以毫秒表示空闲对象回收器运行间隔。 值为负数时表示不运行空闲对象回收器 #若需要回收, 该值最好小于 minEvictableIdleTimeMillis 值 timeBetweenEvictionRunsMillis=300000 设定在进行后台对象清理时,视休眠时间超过了多少毫秒的对象为过期。过期的对象将被回收。如果这个值不是正数,那么对休眠时间没有特别的约束。 minEvictableIdleTimeMillis=320000 每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。 2018年10月22日18
  • 19. DBCP参数配置说明设定在进行后台对象清理时,每次检查几个对象。如果这个值不是正数,则每次检查的对象数是检查时池内对象的总数乘以这个值的负倒数再向上取整的结果??也就是说,如果这个值是-2(-3、-4、-5……)的话,那么每次大约检查当时池内对象总数的1/2(1/3、1/4、1/5……)左右。 numTestsPerEvictionRun=3 2018年10月22日19