2.一、配置 druid 數據源css
二、 隨後要進行druid 的數據源的配置,若是要想使用druid 的數據源,那麼首先必定要去修改 pom.xml 配置文件,引入如下包:html
oracle官網下載 ojdbc6.jar,直接引入的依賴不能用,親身測試java
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency>
三、 若是要進行數據源的整合處理,直接修改 application.yml 配置文件便可:web
server: port: 8080 tomcat: uri-encoding: UTF-8 servlet: session: timeout: 30 # context-path:項目路徑,默認是localhost:8080/ spring: jpa: database: oracle datasource: # 使用c3p0數據源 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: oracle.jdbc.driver.OracleDriver url: jdbc:oracle:thin:@192.168.0.5:1521:growing username: TeacherCommunity password: Growing2014 # 下面爲鏈接池的補充設置,應用到上面全部數據源中 # 初始化大小,最小,最大 initialSize: 1 minIdle: 3 maxActive: 216 # 配置獲取鏈接等待超時的時間 maxWait: 30000 # 配置間隔多久才進行一次檢測,檢測須要關閉的空閒鏈接,單位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一個鏈接在池中最小生存的時間,單位是毫秒 minEvictableIdleTimeMillis: 30000 validationQuery: select 1 from dual testWhileIdle: true testOnBorrow: false testOnReturn: false # 打開PSCache,而且指定每一個鏈接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置監控統計攔截的filters,去掉後監控界面sql沒法統計,'wall'用於防火牆 filters: stat,wall,slf4j # 經過connectProperties屬性來打開mergeSql功能;慢SQL記錄 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合併多個DruidDataSource的監控數據 #useGlobalDataSourceStat: true # 設置,mapper 接口路徑,mapper 接口對應的xml 配置文件 mybatis: mapper-locations: classpath:mybatis/mapper/*.xml type-aliases-package: com.zcz.dao #在springboot程序入口類處添加註解@MapperScan("com.zcz.dao")此處可省略,不添加的話這裏要寫上,每一個dao層映射接口也要添加註解@Mapping
這裏的都和上一篇博客同樣就不重複了,值得一體的是pom文件,個人以下spring
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zcz</groupId> <artifactId>teachercommunitystudio</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>teachercommunitystudio</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <!--開發web項目相關依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--springboot屬性配置jar--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!--springboot單元測試--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--jpa依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- jackson依賴包 第一個和第二個能夠省略--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.6</version> </dependency> <!-- 數據庫鏈接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!-- mybatis逆向工程 --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.3</version> </dependency> <!--JSON支持 --> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build> </project>
2.三、事務控制sql
一、 修改 IDeptService 接口,追加一個只讀事務控制:數據庫
package cn.study.microboot.service; import java.util.List; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import cn.study.microboot.vo.Dept; public interface IDeptService { @Transactional(readOnly = true) public List<Dept> list() ; }
此時配置了一個只讀的事務操做,那麼也就是說在這個業務方法只可以採用讀的模式來進行操做。apache
二、 可是如今你配置了一個註解並不表示當前已經合理的支持了事務,若是要進行事務的啓用,還須要在程序啓動類上追加一個 新的註解配置:json
package cn.study.microboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication // 啓動SpringBoot程序,然後自帶子包掃描 @EnableTransactionManagement public class StartSpringBootMain { public static void main(String[] args) throws Exception { SpringApplication.run(StartSpringBootMain.class, args); } }
三、 若是如今要想更好的觀察到事務的問題,最簡單的作法是編寫一個數據增長操做,然後爲這個業務方法設置只讀配置。瀏覽器
· 修改 IDeptDAO 接口追加一個新的方法:
package cn.study.microboot.dao; import java.util.List; import org.apache.ibatis.annotations.Mapper; import cn.study.microboot.vo.Dept; @Mapper public interface IDeptDAO { public List<Dept> findAll(); public boolean doCreate(Dept vo) ; }
· 修改 Dept.xml 配置文件,追加一個方法的實現 SQL 語句:
<insert id="doCreate" parameterType="Dept"> INSERT INTO dept(dname) VALUES (#{dname}) ; </insert>
· 在 IDeptService 接口之中追加有一個業務方法:
@Transactional((readOnly = true) public boolean add(Dept vo) ;
· 編寫測試方法:
@Test public void testAdd() throws Exception { Dept dept = new Dept(); dept.setDname("測試部"); System.out.println(this.deptService.add(dept)); }
此時會報錯
四、 若是在實際的工做之中,對於更新操做應該強制性的啓動一個事務控制纔對:
@Transactional(propagation=Propagation.REQUIRED) public boolean add(Dept vo) ;
此時應該明確的表示該操做方法應該啓動有一個事務的配置項。
2.四、druid 監控
druid 數據庫鏈接池之因此使用很是普遍,其最主要的緣由在於它能夠直接提供性能監控。那麼本次來針對於當前已經實現好 的 druid 配置來進行性能監控的處理配置。
一、 若是要想進行 Druid 的性能的監控操做,則須要作一些基礎配置,例如:你訪問的 IP 地址是不是白名單。
這裏直接貼上本身的druid鏈接代碼:綜合各個方面整合出本身的鏈接方式
/** * 德魯伊配置 */ @Configuration @ConfigurationProperties(prefix = "spring.datasource") public class DruidConfig { /** * 主要實現WEB監控的配置處理 * @return */ @Bean public ServletRegistrationBean druidServlet() { // 主要實現WEB監控的配置處理 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean( new StatViewServlet(), "/druid/*"); // 如今要進行druid監控的配置處理操做 // 白名單 servletRegistrationBean.addInitParameter("allow", "127.0.0.1,192.168.0.55"); // 黑名單(與白名單共同存在時,deny優先於allow) // servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); servletRegistrationBean.addInitParameter("loginUsername", "admin"); // 用戶名 servletRegistrationBean.addInitParameter("loginPassword", "admin"); // 密碼 servletRegistrationBean.addInitParameter("resetEnable", "false"); // 是否能夠重置數據源 return servletRegistrationBean ; } /** * 過濾器 * @return */ @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ; filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); // 全部請求進行監控處理 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*"); return filterRegistrationBean ; } /** * 德魯伊詳細配置 * @return */ @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource druidDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setDriverClassName(driverClassName); dataSource.setInitialSize(initialSize); dataSource.setMinIdle(minIdle); dataSource.setMaxActive(maxActive); dataSource.setMaxWait(maxWait); dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); dataSource.setValidationQuery(validationQuery); dataSource.setTestWhileIdle(testWhileIdle); dataSource.setTestOnBorrow(testOnBorrow); dataSource.setTestOnReturn(testOnReturn); dataSource.setPoolPreparedStatements(poolPreparedStatements); dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { dataSource.setFilters(filters); } catch (SQLException e) { e.printStackTrace(); } dataSource.setConnectionProperties(connectionProperties); return dataSource; } //這裏是從配置文件讀取的參數信息 private String url; private String username; private String password; private String driverClassName; private int initialSize; private int minIdle; private int maxActive; private int maxWait; private int timeBetweenEvictionRunsMillis; private int minEvictableIdleTimeMillis; private String validationQuery; private boolean testWhileIdle; private boolean testOnBorrow; private boolean testOnReturn; private boolean poolPreparedStatements; private int maxPoolPreparedStatementPerConnectionSize; private String filters; private String connectionProperties; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public int getInitialSize() { return initialSize; } public void setInitialSize(int initialSize) { this.initialSize = initialSize; } public int getMinIdle() { return minIdle; } public void setMinIdle(int minIdle) { this.minIdle = minIdle; } public int getMaxActive() { return maxActive; } public void setMaxActive(int maxActive) { this.maxActive = maxActive; } public int getMaxWait() { return maxWait; } public void setMaxWait(int maxWait) { this.maxWait = maxWait; } public int getTimeBetweenEvictionRunsMillis() { return timeBetweenEvictionRunsMillis; } public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) { this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; } public int getMinEvictableIdleTimeMillis() { return minEvictableIdleTimeMillis; } public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) { this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } public String getValidationQuery() { return validationQuery; } public void setValidationQuery(String validationQuery) { this.validationQuery = validationQuery; } public boolean isTestWhileIdle() { return testWhileIdle; } public void setTestWhileIdle(boolean testWhileIdle) { this.testWhileIdle = testWhileIdle; } public boolean isTestOnBorrow() { return testOnBorrow; } public void setTestOnBorrow(boolean testOnBorrow) { this.testOnBorrow = testOnBorrow; } public boolean isTestOnReturn() { return testOnReturn; } public void setTestOnReturn(boolean testOnReturn) { this.testOnReturn = testOnReturn; } public boolean isPoolPreparedStatements() { return poolPreparedStatements; } public void setPoolPreparedStatements(boolean poolPreparedStatements) { this.poolPreparedStatements = poolPreparedStatements; } public int getMaxPoolPreparedStatementPerConnectionSize() { return maxPoolPreparedStatementPerConnectionSize; } public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) { this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; } public String getFilters() { return filters; } public void setFilters(String filters) { this.filters = filters; } public String getConnectionProperties() { return connectionProperties; } public void setConnectionProperties(String connectionProperties) { this.connectionProperties = connectionProperties; } }
完畢! 運行項目
在瀏覽器輸入 http://localhost:8080/druid/login.html 而後輸入本身配置的用戶名和密碼,便可登陸,以下圖
首頁: