《Spring实战》摘录 - 19

181

Q: #10.2.1 | JNDI是什么

A: Java命名和目录接口(Java Naming and Directory Interface,缩写JNDI),是Java的一个目录服务应用程序界面(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。

182

Q: #10.2.2-1 | 常用的数据库连接池有哪些

A:

  • Apache Commons DBCP (http://jakarta.apache.org/commons/dbcp);
  • c3p0 (http://sourceforge.net/projects/c3p0/) ;
  • BoneCP (http://jolbox.com/) 。
  • Druid( https://github.com/alibaba/druid)

183

Q: #10.2.2-2 | bean的方式配置连接池

A:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  p:driverClassName="org.h2.Driver"  p:url="jdbc:h2:tcp://localhost/~/spitter"  p:username="sa"  p:password=""  p:initialSize="5"  p:maxActive="10" />

184

Q: #10.2.2-3 | Java的方式配置连接池

A:

@Beanpublic BasicDataSource dataSource() {  BasicDataSource ds = new BasicDataSource();  ds.setDriverClassName("org.h2.Driver");  ds.setUrl("jdbc:h2:tcp://localhost/~/spitter");  ds.setUsername("sa");  ds.setPassword("");  ds.setInitialSize(5);  ds.setMaxActive(10);  return ds;}

185

Q: #10.2.2-4 | BasicDataSource的池配置属性

A:

  • initialSize --- 池启动时创建的连接数量
  • maxActive --- 同一时间可从池中分配的最多连接数。如果设置为0,表示无限制
  • maxIdle --- 池里不会被释放的最多空闲连接数。如果设置为0,表示无限制
  • maxOpenPreparedStatements --- 在同一时间能够从语句池中分配的预处理语句(prepared statement)的最大数量。如果设置为0,表示无限制
  • maxWait --- 在抛出异常之前,池等待连接回收的最大时间(当没有可用连接时)。如果设置为-1,表示无限等待
  • minEvictableIdleTimeMillis --- 连接在池中保持空闲而不被回收的最大时间
  • minIdle --- 在不创建新连接的情况下,池中保持空闲的最小连接数
  • poolPreparedStatements --- 是否对预处理语句(prepared statement)进行池管理(布尔值)

186

Q: #10.2.3-1 | 在Spring中,通过JDBC驱动定义数据源是最简单的配置方式。Spring提供了三个这样的数据源类(均位于org.springframework.jdbc.datasource包中)供选择:

A:

  • DriverManagerDataSource:在每个连接请求时都会返回一个新建的连接。与DBCP的BasicDataSource不同,由DriverManagerDataSource提供的连接并没有进行池化管理;
  • SimpleDriverDataSource:与DriverManagerDataSource的工作方式类似,但是它直接使用JDBC驱动,来解决在特定环境下的类加载问题,这样的环境包括OSGi容器;
  • SingleConnectionDataSource:在每个连接请求时都会返回同一个的连接。尽管SingleConnectionDataSource不是严格意义上的连接池数据源,但是你可以将其视为只有一个连接的池

187

Q: #10.2.3-2 | 推荐使用数据库连接池的原因

A: 因为SingleConnectionDataSource有且只有一个数据库连接,所以不适合用于多线程的应用程序,最好只在测试的时候使用。而DriverManagerDataSource和SimpleDriverDataSource尽管支持多线程,但是在每次请求连接的时候都会创建新连接,这是以性能为代价的。鉴于以上的这些限制,我强烈建议应该使用数据源连接池。

188

Q: #10.2.5-1 | 借助Spring的profile特性能够在运行时选择数据源

A:

package com.habuma.spittrconfigimport org.apache commons.dbep.BasicDataSource;import javax.sql.DataSource;import org.springframework context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework context.annotation.Profile;import org.springframework.jdbcdatasource embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc..embedded.EmbeddedData; import org.springframework.jndi.UndiobjectFactoryBean;
@Configurationpublic class DataSourceConfiguration  @Profile("development")//开发数据源  @Bean  public Datasource embeddedDataSource (){    return new EmbeddedDatabaseBuilder ()                .setType(EmbeddedDatabaseType.H2)                .adscript("classpath:schema.sql")                .adsCript("classpath:test-data.sql")                .build();  }
  @Profile("qa")//QA数据源  @Bean  public DataSource Data(){    BasicDataSource ds new BasicDatas()    ds.setDriverclassName("org.h2.Driver"):    ds.setUrl("jdbc: h2: tcp: ///~/spitter");    ds.setUsername("sa");    ds.setPassword("");    ds.setInitialsize(5);    ds.setMaxActive(10);    return ds;  }
  @Profile("production")//生产环境数据源  @Bean  public DataSource dataSource(){    JndiobjectFactoryBean jndiobjectFactoryBean = new JndiobjectFactoryBean();     jindiobjectFactoryBean.setJndiName("jdbc/SpittrDS");    jindiobjectFactoryBean.setResourceR(true);    jindiobjectFactoryBean.setProxyInter(javax.sql.DataSource.class);     return(Datasource)jindiobjectFactoryBean.getobject();  }}

189

Q: #10.2.5-2 | 借助XML配置,基于profile选择数据源

A:

<?xml version="1. 0" encoding="UTF-8"?> <beans xmlns="http: //www.spr org/schema/beans"  xmIns: xsi="http://www.w3.org/2001/XMLSchema-instance"  xmins: jdbe="http: //www. springfrar, org/schema/jabe"  xmIns: jee="http: //www.springfram, org/schema/jee"  xmins: p="http: //www. springfram. org/schema/p"  xsi: schemaLocation="http: //www.springframework. org/schema/jdbc  http: //www. springframework. org/scher/jdbc/spring-jdbc-31.xsd  http: //www.springframework.org/schema/jee  http: //www.springframework. org/schema/jee/spring-jee-3.1.xsd  http: //www. springframework. org/:/beans  http: //www.springframework. org/schema/beans/spring-beansxsd">  <beans profiledevelopment><!-- 开发数据源 -->    <jdbc: embedded-database id="datasource"type="H2">      <jdbc: script location="com/hab uma/spitter/db/jdbc/schema.sql"/>      <jdbc: script location="com/habum a/spitter/ab/jdbc/test-data. sql"/>    </jdbc: embedded-database>   </beans>  <beans profile="ga">    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"      p:driverclassName="org.h2.Driver"      p:url="jdbc:h2:tcp://localhost~/spitter"      p:username="sa"      p:password=""      p:initialsize="5"      p:maxActive="10"/>   </beans>  <beans profile="production">    <jee:jndi-lookup id="datasource" jndi-name="/jdbc/SpitterDS" resource-ref="true"/>  </beans></beans>

190

Q: #11-1 | Spring对ORM框架的支持提供了与这些框架的集成点以及一些附加的服务

A:

  • 支持集成Spring声明式事务;
  • 透明的异常处理;
  • 线程安全的、轻量级的模板类;
  • DAO支持类;
  • 资源管理。

原文发布于微信公众号 - 怀英的自我修炼(hydzwxl)

原文发表时间:2019-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券