数据库连接池-Tomcat-dbcp、dbcp、c3p0

本文详细介绍了三种常见的数据库连接池技术:Tomcat-dbcp、commons-dbcp 和 c3p0 的配置与使用方法。包括如何通过 Java 代码获取数据源、连接池参数配置以及通过 JNDI 在 Tomcat 中配置数据源。

关于数据源

将连接的指向改了,现在指向的是数据源 而不是数据库。

访问流程

数据库访问核心 -> pstmt/stmt ->connection ->1.直接数据库 2.数据源 ds.getConnection()

①Tomcat-dbcp

关于JNDI:java命名与目录接口(Java Naming and Directory Interface)

我的理解:将一个资源以key的方式存入,运行时可以根据key取
具体定义:https://baike.baidu.com/item/JNDI/3792442?fr=aladdin

对于Tomcat配置方式
tomcat/conf/context.xml配置:
<Environment  name="jndiName"  value="jndiValue" type="java.lang.String" />

jsp中用那值 :

必要前缀 :java:comp/env/
<%@ page import="javax.naming.InitialContext" %>
    <%
      Context ctx =  new InitialContext() ;
    String testJndi =  (String)ctx.lookup("java:comp/env/jndiName");

    out.print(testJndi);
    %>
连接池
1、tomcat/conf/context.xml中加入以下(具体情况自行配置)
<Resource name="mydbcp" auth="Container" type="javax.sql.DataSource" 
		maxActive="400" 
		maxIdle="20"  maxWait="5000"  username="scott" password="tiger" 
driverClassName="oracle.jdbc.driver.OracleDriver"  url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" />

相关 基本参数
其中的name属性是数据源名称,通常采取jdbc/**.

   type属性是数据源方式。
   driverClassName属性是驱动程序名称。(上文为Oracle信息)
   username,password,数据库名称和密码
   url:访问的数据库路径。其中url的内容组成解析上篇博客中已经分析——Oracle安装以及测试Oracle数据库
   maxActive属性是并发连接的最大数。设置为0则无限制。
   maxWait属性是等待连接的最大连接的时间。
   maxIdle属性是连接池中空闲的连接的个数。
  上文中的设置的 maxActive="400"说明可以最大连接的个数为400个,再建立连接,则出现异常。
  而maxIdle="20"说明当关闭数据库时(不是真正的断开连接,而是归还连接池中)连接池中最大可以有空闲的连接数为20个。
  若是再有建立连接,此时若连接池中没有空闲的连接,但是又没有达到maxActive并发的最大连接数,则在连接池中建立连接。
2、在web.xml中加入申明
<resource-ref>
        <res-ref-name>mydbcp</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
3、通过Java代码拿到数据源

传统方式

connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);

通过连接池过得数据库连接池

    Context ctx = new InitialContext() ;//context.xml
    DataSource ds = (DataSource)ctx.lookup("java:comp/env/mydbcp") ;
    connection = ds.getConnection();

②commons-dbcp

1、jar : commons-dbcp-1.4.jar、commons-pool.jar
2、获得数据源
相关参数配置方式一: 硬编码
 BasicDataSource dbcp = new BasicDataSource();    //dbcp数据源的基类
        dbcp.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dbcp.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
        dbcp.setUsername("scott");
        dbcp.setPassword("tiger");
        dbcp.setInitialSize(20);
        dbcp.setMaxActive(10);
      return   dbcp  ;
相关参数配置方式一: 配置文件 dbcpconfig.properties(k-v的形式)
  DataSource dbcp = null ;
  //加载配置文件
        Properties props = new Properties();
        InputStream input = new DBCPDemo().getClass().getClassLoader().getResourceAsStream("dbcpconfig.properties");
        props.load(  input );

        dbcp = BasicDataSourceFactory.createDataSource(props ) ;  //核心语句
        return dbcp;
返回值均为 javax.sql.DataSource : DataSource 是所有 sql 数据源的上级类

dbcp基础参数

    initialSize: 初始化连接
    maxIdle: 最大空闲连接
    minIdle: 最小空闲连接
    maxActive: 最大连接数量  
    removeAbandoned: 是否自动回收超时连接
    removeAbandonedTimeout: 超时时间(以秒数为单位)
    maxWait: 超时等待时间以毫秒为单位 
    timeBetweenEvictionRunsMillis:在空闲连接回收器执行周期(毫秒)
    numTestsPerEvictionRun 在每次空闲连接回收器线程(如果有)运行时检查的连接数量
    minEvictableIdleTimeMillis:最小空闲时间
    validationQuery:验证链接是否有效的sql语句
    testOnBorrow:获取链接之前是否测试链接的可用性

③c3p0

1、jar

c3p0.jar
如果是Oracle数据库则 添加:c3p0-oracle-thin-extras.jar

2、获取数据源
相关参数配置方式一: 硬编码
       ComboPooledDataSource c3p0 = new ComboPooledDataSource();  //核心方法
        try {
            c3p0.setDriverClass("oracle.jdbc.driver.OracleDriver");
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        c3p0.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
        c3p0.setUser("scott");
        c3p0.setPassword("tiger");

        return c3p0 ;
相关参数配置方式一: 配置文件 ,c3p0-config.xml
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>   // 默认配置
        <!-- 如果要研究某个xml中可以设置哪些属性。找相关类的 属性 或者setXxx()-->
        <property name="user">scott</property>
        <property name="password">tiger</property>
        <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
        <property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
        <property name="checkoutTimeout">30000</property>
    </default-config>
    <named-config name="id">  //自定义的配置 可覆盖默认配置
        <property name="user">scott</property>
        <property name="password">tiger</property>
        <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
        <property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
        <property name="checkoutTimeout">20000</property>
    </named-config>
</c3p0-config>

获取

  ComboPooledDataSource c3p0 = new ComboPooledDataSource("id"); //核心方法 自动寻找 c3p0-config.xml
        return c3p0 ;

相关参数

acquireIncrement:当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数。Default: 3 
acquireRetryAttempts: 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30  
acquireRetryDelay:两次连接中间隔时间,单位毫秒。Default: 1000 -
autoCommitOnClose :连接关闭时默认将所有未提交的操作回滚。Default: false
automaticTestTable: c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。
	如果定义了这个参数那么 属性preferredTestQuery将被忽略。
	你不能在这张Test表上进行任何操作,它将只供c3p0测试 使用。Default: null
breakAfterAcquireFailure:获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。
	但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。
	如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false
checkoutTimeout: 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 
SQLException,如设为0则无限期等待。单位毫秒。Default: 0 
connectionTesterClassName:通过实现ConnectionTester或QueryConnectionTester的类来测试连接。
  类名需制定全路径。 
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester
factoryClassLocation: 指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 
  Default: null
forceIgnoreUnresolvedTransactions:  Strongly disrecommended. 
	Setting this to true may lead to subtle and bizarre bugs.  (文档原文)作者强烈建议不使用的一个属性
idleConnectionTestPeriod : 每60秒检查所有连接池中的空闲连接。Default: 0
 initialPoolSize: 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3
maxIdleTime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
maxPoolSize:连接池中保留的最大连接数。Default: 15
maxStatements:JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。
	但由于预缓存的statements 属于单个connection而不是整个连接池。
	所以设置这个参数需要考虑到多方面的因素。 
  如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0
maxStatementsPerConnection:定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 
numHelperThreads: c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。
	扩展这些操作可以有效的提升性能 通过多线程实现多个操作同时被执行。Default: 3
overrideDefaultUser : 当用户调用getConnection()时使root用户成为去获取连接的用户。
	主要用于连接池连接非c3p0 的数据源时。Default: null
overrideDefaultPassword:与overrideDefaultUser参数对应使用的一个参数。Default: null
password:密码。Default: null
preferredTestQuery : 定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。
	 注意: 
 	 测试的表必须在初始数据源的时候就存在。Default: null 可填写语句 select id from test where id=1
propertyCycle:用户修改系统配置参数执行前最多等待XX秒。Default: 30
0testConnectionOnCheckout:
	因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 
 	时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 
 	等方法来提升连接测试的性能。Default: false
testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
user:用户名。Default: null
usesTraditionalReflectiveProxies : 早期的c3p0版本对JDBC接口采用动态反射代理。
	在早期版本用途广泛的情况下,这个参数 , 允许用户恢复到动态反射代理以解决不稳定的故障。
	最新的非反射代理更快并且已经开始 广泛的被使用,所以这个参数未必有用。
	现在原先的动态反射与新的非反射代理同时受到 支持,
	但今后可能的版本可能不支持动态反射代理。Default: false

所有连接池的思路:
a.硬编码,某个连接池数据源的 对象 ds = new XxxDataSource(); ds.setXxx(); return ds ;
b.配置文件, ds = new XxxDataSource();加载配置文件 ,return ds ;

数据源工具类
dbcp、c3p0, druid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值