springjdbc:数据源

在项目中经常会需要连接数据库,可以使用的数据库有很多,平时我们还用连接池来管理数据库,现在学习了spring,我们知道了,spring的核心功能就是对象创建依赖注入

而我们在使用连接池时,连接对象也是通过DataSource接口获取的,那么怎样使用spring来注入数据库连接信息呢?

学习了spring之后,我们可以将数据库连接对象Connection的创建和关闭交给spring来管理

在spring中默认提供了很多种数据库连接

1.DriverMangerDataSource  spring自带数据源

2.DBCP数据源

3.C3P0数据源

4.JNDI数据源

这四种都是spring默认的数据库连接,不过我们平时使用的比较多的还是阿里的druid连接池

下面依次介绍这几种数据源

为了方便我们使用.properties文件来配置连接池信息

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.username=root
jdbc.password=123456

1.DriverMangerDataSource

这是spring自带的数据源,它与之前我们使用jdbc创建连接对象时使用的DriverManger一样,只能创建一个对象,不支持连接池

springjdbc:数据源

2.DBCP数据源

dbcp数据源依赖两个jar包:

commons-dbcp.jar,commons-pool.jar
<!--配置dbcp连接池-->
    <!--BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性, 
    以便Spring容器关闭时,数据源能够正常关闭。-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!--设置连接池属性-->
        <!--设置初始连接数-->
        <property name="initialSize" value="10"/>
        <!--最大连接数-->
        <property name="maxActive" value="15"/>
        <!--maxActive:最大连接数据库连接数,设置为0时,表示没有限制;-->
        <property name="maxWait" value="60000"/>
        <!--defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为 true;-->
        <property name="defaultAutoCommit" value="true"/>
        <!--defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为 false;-->
        <property name="defaultReadOnly" value="false"/>
        <!--maxIdle:最大等待连接中的数量,设置为0时,表示没有限制;-->
        <property name="maxIdle" value="15"/>
        <!--validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据,
        如你可以简单地设置为:“select count(*) from emp”;-->
        <property name="validationQuery" value="select count(*) from emp"/>
        <!--removeAbandoned:是否自我中断,默认是 false;-->
        <property name="removeAbandoned" value="false"/>
        <!--removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值;-->
        <!--<property name="removeAbandonedTimeout" value=""/>-->
        <!--logAbandoned:是否记录中断事件, 默认为 false;-->
        <property name="logAbandoned" value="false"/>
    </bean>

3.C3P0数据源

c3p0是一个开源的jdbc数据源实现项目,依赖于c3p0.jar

  <bean id="dataSource" class="com.mchange.v2.c3p0.jboss.C3P0PooledDataSource" destroy-method="close">
        <!--内部属性与dbcp一样-->
    </bean>

4.JNDI数据源

JNDI:Java命名和目录的服务接口

作用:将一些资源(数据源),以目录的形式提供给程序访问

如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源 使用JNDI开放调用者用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。  

  <bean id="" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="资源路径"/>
    </bean>

5.Druid连接池

druid可以做什么?

1.替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

2.可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。

3.数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和 DruidDataSource都支持PasswordCallback。

4.SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

5.扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

druid的基本配置:
<!-- 阿里 druid 数据库连接池 -->  
  < bean id = "dataSource" class = "com.alibaba.druid.pool.DruidDataSource"destroy-method = "close" >    
       <!-- 数据库基本信息配置 -->  
       < property name = "url" value = "${url}" />    
       < property name = "username" value = "${username}" />    
       < property name = "password" value = "${password}" />    
       < property name = "driverClassName" value = "${driverClassName}" />    
       < property name = "filters" value = "${filters}" />    
        <!-- 最大并发连接数 -->  
       < property name = "maxActive" value = "${maxActive}" />  
       <!-- 初始化连接数量 -->  
       < property name = "initialSize" value = "${initialSize}" />  
       <!-- 配置获取连接等待超时的时间 -->  
       < property name = "maxWait" value = "${maxWait}" />  
       <!-- 最小空闲连接数 -->  
       < property name = "minIdle" value = "${minIdle}" />    
       <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
       < property name = "timeBetweenEvictionRunsMillis" value ="${timeBetweenEvictionRunsMillis}" />  
       <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
       < property name = "minEvictableIdleTimeMillis" value ="${minEvictableIdleTimeMillis}" />    
       < property name = "validationQuery" value = "${validationQuery}" />    
       < property name = "testWhileIdle" value = "${testWhileIdle}" />    
       < property name = "testOnBorrow" value = "${testOnBorrow}" />    
       < property name = "testOnReturn" value = "${testOnReturn}" />    
       < property name = "maxOpenPreparedStatements" value ="${maxOpenPreparedStatements}" />  
       <!-- 打开 removeAbandoned 功能 -->  
       < property name = "removeAbandoned" value = "${removeAbandoned}" />  
       <!-- 1800 秒,也就是 30 分钟 -->  
       < property name = "removeAbandonedTimeout" value ="${removeAbandonedTimeout}" />  
       <!-- 关闭 abanded 连接时输出错误日志 -->     
       < property name = "logAbandoned" value = "${logAbandoned}" />  
  </ bean >

平时练习可以只要前四条,用在项目上时建议全写