作用:为了解决资源的频繁分配﹑释放
1、连接池代码实现:
1 //编写class 实现DataSource 接口 2 public class MyDataSource implements DataSource { 3 4 privateLinkedList<Connection> dataSources = new LinkedList<Connection>(); 5 //在class构造器一次性创建10个连接,将连接保存LinkedList中(链表 --- 实现栈结构) 6 publicMyDataSource() { 7 //一次性创建10个连接 8 for(int i = 0; i < 10; i++) { 9 try { 10 //1、装载sqlserver驱动对象 11 DriverManager.registerDriver(new SQLServerDriver()); 12 //2、通过JDBC建立数据库连接 13 Connection con =DriverManager.getConnection( 14 "jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123"); 15 //3、将连接加入连接池中 16 dataSources.add(con); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 } 21 } 22 //实现getConnection,从 LinkedList中返回一个连接 23 @Override 24 publicConnection getConnection() throws SQLException { 25 //取出连接池中一个连接 26 finalConnection conn = dataSources.removeFirst(); // 删除第一个连接返回 27 returnconn; 28 } 29 30 //将连接放回连接池 31 publicvoid releaseConnection(Connection conn) { 32 dataSources.add(conn); 33 } 34 }
2、使用连接池实现JDBC
1 //查询所有用户 2 Public void FindAllUsers(){ 3 //1、使用连接池建立数据库连接 4 MyDataSource dataSource = new MyDataSource(); 5 Connection conn =dataSource.getConnection(); 6 //2、创建状态 7 Statement state =con.createStatement(); 8 //3、查询数据库并返回结果 9 ResultSet result =state.executeQuery("select * from users"); 10 //4、输出查询结果 11 while(result.next()){ 12 System.out.println(result.getString("email")); 13 } 14 //5、断开数据库连接 15 result.close(); 16 state.close(); 17 //6、归还数据库连接给连接池 18 dataSource.releaseConnection(conn); 19 }
还存在问题:
1、并发
1 public synchronized connection getconnection()
2、使用开源的连接池
主流开源连接池对比
C3P0和DBCP单线程,适用小型系统
Tomcat jdbc pool、BoneCP、Durid多线程异步,适用高并发大型系统
3、Durid配置方法
(1)配置依赖
1 <dependency> 2 <groupId>com.alibaba</groupId> 3 <artifactId>druid</artifactId> 4 <version>1.0.28</version> 5 </dependency>
(2)配置文件(主要参数:JDBC地址,用户名,密码,连接池连接初始值/最小值/最大值,超时等待时间,生存时间)
1 <!--Spring Druid 数据源配置--> 2 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 3 <!-- 基本属性 url、user、password --> 4 <property name="url" value="${jdbc.url}" /> 5 <property name="username" value="${jdbc.username}" /> 6 <property name="password" value="${jdbc.password}" /> 7 <!-- 配置初始化大小、最小、最大 --> 8 <property name="initialSize" value="1" /> 9 <property name="minIdle" value="1" /> 10 <property name="maxActive" value="20" /> 11 <!-- 配置获取连接等待超时的时间 --> 12 <property name="maxWait" value="60000" /> 13 <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 14 <property name="timeBetweenEvictionRunsMillis" value="60000" /> 15 <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> 16 <property name="minEvictableIdleTimeMillis" value="300000" /> 17 <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> 18 <property name="poolPreparedStatements" value="true" /> 19 <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> 20 <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 --> 21 <property name="filters" value="stat" /> 22 </bean> 23 Web.xml配置 24 <!--druid WebStatFilter用于采集web-jdbc关联监控的数据--> 25 <filter> 26 <filter-name>DruidWebStatFilter</filter-name> 27 <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> 28 <init-param> 29 <param-name>exclusions</param-name> 30 <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> 31 </init-param> 32 </filter> 33 <filter-mapping> 34 <filter-name>DruidWebStatFilter</filter-name> 35 <url-pattern>/*</url-pattern> 36 </filter-mapping> 37 <!--druid访问监控界面 /druid/index.html--> 38 <servlet> 39 <servlet-name>DruidStatView</servlet-name> 40 <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> 41 </servlet> 42 <servlet-mapping> 43 <servlet-name>DruidStatView</servlet-name> 44 <url-pattern>/druid/*</url-pattern> 45 </servlet-mapping>