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


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

    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 不是植物
    【转载文章务必保留出处和署名,谢谢!】
  • 相关阅读:
    监控mysql的存储引擎
    基于复制的高可用
    No orientation specified, and the default is
    iOS 图标、图形尺寸? iPhone、iPad、 iPod touch
    cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程)
    loaded some nib but the view outlet was not set
    IOS开发:UIAlertView使用
    UIAlertView笔记
    Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖)
    iOS 开发者能用上的 10 个 Xcode 插件
  • 原文地址:https://www.cnblogs.com/zhuziyu/p/8733150.html
Copyright © 2020-2023  润新知