Spring提供了两个这样的数据源(都位于org.springframework.jdbc.datasource程序包里):
DriverManagerDataSource:这个类实现了javax.sql.DataSource接口,但它并无提供池化链接的机制,每次调用getConnection()获取新链接时,只是简单地建立一个新的链接。所以,这个数据源类比较适合在单元测试 或简单的独立应用中使用,由于它不须要额外的依赖类。
SingleConnectionDataSource:在每一个链接请求时都返回同一个链接。虽然它不一样严格意义上的池管理数据源,但咱们能够把它看做只有一个链接的池。
对两个数据源的配置都相似于配置DBCP的BasicDataSource,区别在于因为DriverManagerDataSource和SingleConnectionDataSource都没有提供链接池,因此在此没有设置池配置属性。
虽然这两个数据源都对于小程序来讲是很不错的,并且还在不断发展,但把它们用于生产程序仍是须要认真考虑的。SingleConnectionDataSource只使用一个数据库链接,因此不适合用于多线程程序。
而 DriverMangerDataSource虽然可以支持多线程,但它会在每次链接请求时都新建一个链接,这是以性能为代价的。因为这些限制,咱们强烈 建议应该使用数据源池。
若是应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,咱们可能更但愿使用应用服务器自己提供的数据源。应用服务器的数据源 使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。css
SSM框架之DriverManagerDataSource--spring-mybatis.xmlhtml
<!-- Spring提供了的数据源,每一个链接请求时都新建一个链接 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${datasource.driverClassName}"></property> <property name="url" value="${datasource.url}"></property> <property name="username" value="${datasource.userName}"></property> <property name="password" value="${datasource.userPassword}"></property> </bean>
datasource.driverClassName=com.mysql.cj.jdbc.Driver datasource.userName=root datasource.userPassword=123456 datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
SSM框架之dbcp2链接池--spring-mybatis.xml(如果dbcp,个别参数对应不上)java
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${dbcp.driverClassName}" /> <property name="url" value="${dbcp.url}" /> <property name="username" value="${dbcp.username}" /> <property name="password" value="${dbcp.password}" /> <!--initialSize: 初始化链接 --> <property name="initialSize" value="${dbcp.initialSize}" /> <!--maxIdle: 最大空闲链接 --> <property name="maxIdle" value="${dbcp.maxIdle}" /> <!--minIdle: 最小空闲链接 --> <property name="minIdle" value="${dbcp.minIdle}" /> <!--maxActive: 最大链接数量 --> <property name="maxTotal" value="${dbcp.maxActive}" /> <!--removeAbandonedTimeout: 超时时间(以秒数为单位) --> <property name="removeAbandonedTimeout" value="${dbcp.removeAbandonedTimeout}" /> <!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> <property name="maxWaitMillis" value="${dbcp.maxWait}" /> <!-- 在空闲链接回收器执行周期(毫秒) --> <property name="timeBetweenEvictionRunsMillis" value="${dbcp.timeBetweenEvictionRunsMillis}" /> <!-- 在每次空闲链接回收器线程(若是有)运行时检查的链接数量 --> <property name="numTestsPerEvictionRun" value="${dbcp.numTestsPerEvictionRun}" /> <!-- 最小空闲时间 --> <property name="minEvictableIdleTimeMillis" value="${dbcp.minEvictableIdleTimeMillis}" /> <!-- 验证连接是否有效的sql语句 --> <property name="validationQuery" value="${dbcp.validationQuery}" /> <!-- 获取连接以前是否测试连接的可用性 --> <property name="testOnBorrow" value="${dbcp.testOnBorrow}" /> </bean>
#src/config/dbcp.properties dbcp.driverClassName=com.mysql.cj.jdbc.Driver dbcp.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC dbcp.username=root dbcp.password=123456 dbcp.initialSize=3 dbcp.minIdle=5 dbcp.maxIdle=10 dbcp.maxActive=15 dbcp.maxWait=60000 dbcp.numTestsPerEvictionRun=10 dbcp.timeBetweenEvictionRunsMillis=60000 dbcp.minEvictableIdleTimeMillis=300000 dbcp.validationQuery=SELECT 1 dbcp.testOnBorrow=false dbcp.removeAbandoned=true dbcp.removeAbandonedTimeout=1800
SSM框架之c3p0链接池--spring-mybatis.xmlmysql
<!-- c3p0链接池配置 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${c3p0.driverClassName}"/> <property name="jdbcUrl" value="${c3p0.jdbcUrl}"/> <property name="user" value="${c3p0.user}"/> <property name="password" value="${c3p0.password}"/> <!--当链接池中的链接耗尽的时候c3p0一次同时获取的链接数。Default: 3 --> <property name="acquireIncrement" value="${c3p0.acquireIncrement}"/> <!--初始化时获取三个链接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize" value="${c3p0.initialPoolSize}"/> <property name="minPoolSize" value="${c3p0.minPoolSize}"/> <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/> <!--最大空闲时间,60秒内未使用则链接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/> <!--每60秒检查全部链接池中的空闲链接。Default: 0 --> <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/> <!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但因为预缓存的statements 属于单个connection而不是整个链接池。 因此设置这个参数须要考虑到多方面的因素。 若是maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> <property name="maxStatements" value="${c3p0.maxStatements}"/> <!-- c3p0是异步操做的,缓慢的JDBC操做经过帮助进程完成。扩展这些操做能够有效的提高性能 经过 多线程实现多个操做同时被执行。Default: 3 --> <property name="numHelperThreads" value="${c3p0.numHelperThreads}"/> </bean>
#src/config/c3p0.properties c3p0.driverClassName=com.mysql.cj.jdbc.Driver c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC c3p0.user=root c3p0.password=123456 c3p0.acquireIncrement=3 c3p0.initialPoolSize=3 c3p0.idleConnectionTestPeriod=60 c3p0.minPoolSize=5 c3p0.maxPoolSize=100 c3p0.maxStatements=100 c3p0.numHelperThreads=10 c3p0.maxIdleTime=60
SSM框架之Druid链接池--spring-mybatis.xmlweb
<!-- druid链接池配置 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <!-- 数据库基本信息配置 --> <property name="driverClassName" value="${druid.driverClassName}"></property> <property name="url" value="${druid.url}"></property> <property name="username" value="${druid.userName}"></property> <property name="password" value="${druid.userPassword}"></property> <!-- 初始化链接数量 --> <property name="initialSize" value="${druid.initialSize}" /> <!-- 最大并发链接数 --> <property name="maxActive" value="${druid.maxActive}" /> <!-- 最小空闲链接数 --> <property name="minIdle" value="${druid.minIdle}" /> <!-- 配置获取链接等待超时的时间 --> <property name="maxWait" value="${druid.maxWait}" /> <!-- 配置间隔多久才进行一次检测,检测须要关闭的空闲链接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" /> <!-- 配置一个链接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" /> <!-- 打开PSCache,而且指定每一个链接上PSCache的大小 --> <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" /> <!-- 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改成true --> <property name="maxPoolPreparedStatementPerConnectionSize" value="${druid.maxOpenPreparedStatements}" /> <!-- 用来检测链接是否的sql,要求是一个查询语句。在mysql中一般设置为SELECT 'X' --> <property name="validationQuery" value="${druid.validationQuery}" /> <!-- 申请链接的时候检测,若是空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery链接是否有效 --> <property name="testWhileIdle" value="${druid.testWhileIdle}" /> <!-- 申请链接时执行validationQuery检测链接是否有效 这个配置会下降性能 --> <property name="testOnBorrow" value="${druid.testOnBorrow}" /> <!-- 归还链接时执行validationQuery检测链接是否有效 这个配置会下降性能 --> <property name="testOnReturn" value="${druid.testOnReturn}" /> <!-- 超过期间限制是否回收: 打开removeAbandoned功能 --> <property name="removeAbandoned" value="${druid.removeAbandoned}" /> <!-- 超时时间:1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" /> <!-- 关闭abanded链接时输出错误日志 --> <property name="logAbandoned" value="${druid.logAbandoned}" /> <!-- 监控统计拦截的filters stat是statfilter的别名,log4j是logFilter的别名 --> <property name="filters" value="${druid.filters}" /> <property name="proxyFilters"> <list> <ref bean="stat-filter" /> <ref bean="log-filter" /> </list> </property> </bean> <!-- 慢SQL记录 --> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <!-- 开启合并sql --> <property name="mergeSql" value="true" /> <!-- 用来配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢。slowSqlMillis的缺省值为3000,也就是3秒。 --> <property name="slowSqlMillis" value="1000" /> <property name="logSlowSql" value="true" /> </bean> <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter"> <!-- <property name="resultSetLogEnabled" value="false" /> --> <!-- <property name="statementExecutableSqlLogEnable" value="true" /> --> </bean>
#src/config/druid.properties druid.driverClassName=com.mysql.cj.jdbc.Driver druid.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC druid.userName=root druid.userPassword=123456 druid.initialSize=0 druid.maxActive=20 druid.minIdle=1 druid.maxIdle=20 druid.maxWait=60000 druid.timeBetweenEvictionRunsMillis=60000 druid.minEvictableIdleTimeMillis=300000 druid.poolPreparedStatements=true druid.maxOpenPreparedStatements=20 druid.validationQuery=SELECT 'x' druid.testWhileIdle=true druid.testOnBorrow=false druid.testOnReturn=false druid.removeAbandoned=true druid.removeAbandonedTimeout=1800 druid.logAbandoned=true druid.filters=stat,log4j
在web.xml添加以下内容spring
<!-- druid链接池监控过滤器 --> <filter> <filter-name>DruidWebStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <init-param> <param-name>exclusions</param-name> <!-- 常常须要排除一些没必要要的url --> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 这个StatViewServlet的用途包括:提供监控信息展现的html页面;提供监控信息的JSON API --> <servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <!-- 白名单 --> <!-- <init-param> 若是是限定指定的子网里的全部ip均可以访问,那就是ip/子网掩码数。例如 192.168.1.120/24 就至关于192.168.1.* <param-name>allow</param-name> <param-value>127.0.0.1</param-value> </init-param> --> <!-- 若是不配置用户名密码,就是任何人均可以访问了--> <init-param> <!-- 用户名 --> <param-name>loginUsername</param-name> <param-value>root</param-value> </init-param> <init-param> <!-- 密码 --> <param-name>loginPassword</param-name> <param-value>root</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping>
输入用户名root、密码root便可登陆sql