数据库各个连接池作用/比较

作用:为了解决资源的频繁分配﹑释放

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>
博客园:http://www.cnblogs.com/zhuziyu/
Copyright ©2018 不是植物
【转载文章务必保留出处和署名,谢谢!】
原文地址:https://www.cnblogs.com/zhuziyu/p/8733150.html