首页 > 数据库 >java数据库连接池介绍与例子

java数据库连接池介绍与例子

时间:2023-09-20 15:04:45浏览次数:33  
标签:jdbc java 数据库 连接数 proxool 连接 连接池


一、连接池原理及介绍:
    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
    数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连 接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连 接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:1.最小连接数是连接池一直保持的数据库连 接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。2.最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过 此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。3.如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之 后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复 使用或是空闲超时后被释放。

二、Java中开源的数据库连接池:
    1.Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
  2.C3P0 是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。  
  3.Jakarta DBCP 是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。
    在hibernate3.0中,已经不再支持dbcp了,hibernate的作者在hibernate.org中,明确指出在实践中发现dbcp有 BUG,在某些种情会产生很多空连接不能释放,所以抛弃了对dbcp的支持。至于c3p0,有评论说它的算法不是最优的,c3p0占用资源比较大,效率也 不高。proxool不少行家推荐使用,是负面评价是最少的一个。从性能和出错率来说,proxool稍微比前两种好些。

三、Proxool和C3P0例子(以sqlserver2000数据库为例)
   
    1.Proxool例子
      Proxool下载地址:http://sourceforge.net/projects/proxool/files/proxool/
      必须加入的包:commons-logging  下载地址:http://commons.apache.org/logging/
     
1).Proxool.properties配置:
         jdbc-0.proxool.alias=sqlserver
         jdbc-0.proxool.driver-class=com.microsoft.jdbc.sqlserver.SQLServerDriver
         jdbc-0.proxool.driver-url=jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind
         jdbc-0.user=sa
         jdbc-0.password=sa
         jdbc-0.proxool.maximum-connection-count=20
         jdbc-0.proxool.prototype-count=4
         jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
         jdbc-0.proxool.verbose=true
         jdbc-0.proxool.statistics=10s,1m,1d
         jdbc-0.proxool.statistics-log-level=ERROR

         属性说明:
         maximum-connection-count: 最大的数据库连数.
         maximum-connection-lifetime: 连接最大生命时间 默认4小时
         minimum-connection-count: 最小的数据库连接数
         prototype-count: 连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值.新的连接将被建立(假设没有超过最大可用数)
         simultaneous-build-throttle:  同时最大连接数
         statistics:  连接池使用状况统计。 参数“10s,1m,1d”
         statistics-log-level:  日志统计跟踪类型。 参数“ERROR”或 “INFO”
         verbose: 详细信息设置。 参数 boolean 值
     
2).例子:

public class Test { 
 public static void main(String[] args) { 
 Connection conn=null; 
 try { 
             PropertyConfigurator.configure("Proxool.properties"); 
                conn = DriverManager.getConnection("proxool.sqlserver"); 
                     if(conn!=null) 
                        System.out.println("数据连接测试成功!"); 
                     Statement Stmt=conn.createStatement(); 
                     ResultSet Rst=null; 
                     Rst=Stmt.executeQuery("select * from orders"); 
                     while(Rst.next())  
                     System.out.println(Rst.getString(1)); 
 }catch(SQLException e) { 
                    System.out.println("error"+e); 
                 }catch(ProxoolException e1){ 
                    System.out.println(e1); 
                 }finally{ 
                    try{ 
                      if (conn != null) 
                        conn.close(); 
                    }catch(SQLException e2){ 
                        System.out.println(e2); 
                    }               
                 } 
      } 
 }



    2.C3P0例子
     c3po 下载地址:http://sourceforge.net/projects/c3p0/
     必须加入的包:log4j 下载地址:http://jakarta.apache.org/log4j
    
1).特别注意:
c3p0用微软提供的数据库驱动连接sqlserver2000时(sqlserver其他版本未测试)后台会报错,但是不影响使用,这是由于微软提供的驱动与c3p0有兼容问题(主要是c3p0日志级别问题),使用第 

三方的驱动JTDS就不会有任何问题。
JTDS 下载地址 :http://sourceforge.net/projects/jtds/files/
    
2).例子:

public class Test { 
 public static void main(String[] args) { 
      try { 
 ComboPooledDataSource cpds = new ComboPooledDataSource(); 
 cpds.setDriverClass("net.sourceforge.jtds.jdbc.Driver"); 
 cpds.setJdbcUrl("jdbc:jtds:sqlserver://localhost:1433;DatabaseName=Northwind"); 
 cpds.setUser("sa"); 
 cpds.setPassword("sa"); 
 cpds.setInitialPoolSize(2); 
 cpds.setMaxPoolSize(10); 
 cpds.setAutoCommitOnClose(true); 
 Connection con = null; 
 Statement stmt = null; 
 ResultSet rs = null; 
 con = cpds.getConnection(); 
 stmt = con.createStatement(); 
 rs = stmt.executeQuery("select * from orders"); 
 while (rs.next()) { 
   System.out.println(rs.getString(1)); 
 } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
    } 
 }

标签:jdbc,java,数据库,连接数,proxool,连接,连接池
From: https://blog.51cto.com/u_16242566/7537242

相关文章

  • Java学习之路--oop--面向对象编程(封装、继承、多态)01
    packagecom.oop.demo01;importjava.io.IOException;//什么是面向对象/*面向对象编程:Object-OrientedPrograming(简称OOP)面向对象编程的本质就是:**以类的方式组织代码,以对象的组织(封装)数据抽象三大特性:封装继承多态*///Demo01-类publicclassDemo01{publicstaticvoid......
  • Java学习之路--oop--面向对象编程(封装、继承、多态)03
    packagecom.oop.demo04;/*封装:设计程序要追求“高内聚,低耦合”属性私有,get/set封装的意义:1.提高程序的安全性,保护数据2.隐藏代码的实现细节3.统一接口4.系统的可维护性增加*/publicclassApplication{publicstaticvoidmain(String[]args){Students1=newS......
  • Java学习之路--oop--面向对象编程(封装、继承、多态)02
    packagecom.oop.demo02;//一个项目应该只存一个main方法publicclassApplication{publicstaticvoidmain(String[]args){//new实例化了一个对象Personperson=newPerson("无言");System.out.println(person.name);}}////类:抽象......
  • rabbitmq Broker not available; cannot force queue declarations during start: jav
    一、概述使用SpringBoot集成RabbitMQ遇到的问题。2023-09-2014:19:39.655INFO10256---[restartedMain]o.s.b.w.embedded.tomcat.TomcatWebServer:Tomcatstartedonport(s):80(http)withcontextpath''2023-09-2014:19:39.656INFO10256---[rest......
  • Java学习之路--array--数组
    packagecom.chao.array;/*数组定义:1.数组市相同类型数据的有序集合2.数组描述的是相同类型的若干个数据,按照一定的先后顺序排列组合而成3.其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们数组声明创建首先必须声明数组变量,才能在程序中使用数组,声明数组变......
  • mysql数据库服务主从搭建
    mysql数据库服务主从搭建1、搭建两台数据库服务环境,master,slave数据库搭建参考:https://www.cnblogs.com/zuouncle/p/17713806.html2、查看服务运行状态systemctlstatusmysqld 如果显示以下内容就关闭mysql服务重新启动 3、主库(master)配置配置mysql的启动配置......
  • Java学习之路--struct--结构
    packagecom.chao.struct;/*breakbreak在任何循环语句的主体部分,均可用break控制循环的流程**break**用于强行终止退出循环,不执行循环剩余的语句,(break语句也在switch语句中使用)continue**continue**语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行......
  • Java学习之路--method--加减乘除的实现
    packagecom.chao.method;importjava.util.Scanner;//加、减、乘、除/*键盘输入两个数选择+-*/四个中的一个,对应输出选择运算符计算后的结果*/publicclassDemo05{publicstaticvoidmain(String[]args){doublesum=0;doubledb=0;do......
  • Java学习之路--method--加减乘除的简单进阶
    packagecom.chao.method;importjava.util.Scanner;//加、减、乘、除/*键盘输入两个数选择+-*/四个中的一个,对应输出选择运算符计算后的结果分别写四个方法加、减、乘、除*/publicclassDemo06{publicstaticvoidmain(String[]args){while(true){......
  • Java学习之路--operator--运算符的使用
    packagecom.chao.operator;publicclassDemo01{publicstaticvoidmain(String[]args){//二元运算符//Ctrl+D:复制当前行到下一行inta=10;intb=20;intc=30;System.out.println(a+b);System.out.pr......