springboot 中 druid+jpa+MYSQL數(shù)據(jù)庫配置過程
Druid來自于阿里的一個開源連接池能夠提供強大的監(jiān)控和擴展功能,Spring Boot默認不支持Druid和jpa,需要引入依賴。
1、引入依賴包
<!--druid-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
<!--jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2、配置application.properties
#druid配置-MYSQL spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test1?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=123456 # 初始化大小,最小,最大 spring.datasource.initialSize=5 spring.datasource.maxActive=20 spring.datasource.minIdle=5 # 配置獲取連接等待超時的時間 spring.datasource.max-wait=60000 # 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒 spring.datasource.time-between-eviction-runs-millis=60000 # 配置一個連接在池中最小生存的時間,單位是毫秒 spring.datasource.min-evictable-idle-time-millis=300000 #檢測連接是否有效的sql,要求是一個查詢語句,常用select 'x'.如果validationQuery為null,testOnBorrow,testOnBorrow,testOnReturn,testWhileIdle都不會起作用。這個可以不配置 spring.datasource.validation-query=SELECT 'x' #檢測連接是否有效的超時時間。 spring.datasource.validation-query-timeout=60000 spring.datasource.test-while-idle=true spring.datasource.test-on-borrow=false spring.datasource.test-on-return=false # 打開PSCache,并且指定每個連接上PSCache的大小 spring.datasource.pool-prepared-statements=true spring.datasource.max-pool-prepared-statement-per-connection-size=20 # 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻,#別名方式,擴展插件,監(jiān)控統(tǒng)計用的filter:stat,日志用的filter:log4j,防御sql注入的filter:wall spring.datasource.filters=stat,wall,slf4j
3、Druid配置信息定制
@Configuration
public class DruidConfig {
@Autowired
private DruidDataSourceProperties properties;
@Bean(name = "druidDataSource", initMethod = "init", destroyMethod = "close")
@Qualifier("druidDataSource")
public DataSource dataSource() throws Exception {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(properties.getUrl());
druidDataSource.setUsername(properties.getUsername());
druidDataSource.setPassword(properties.getPassword());
druidDataSource.setDriverClassName(properties.getDriverClassName());
druidDataSource.setInitialSize(properties.getInitialSize());
druidDataSource.setMaxActive(properties.getMaxActive());
druidDataSource.setMinIdle(properties.getMinIdle());
druidDataSource.setMaxWait(properties.getMaxWait());
druidDataSource.setTimeBetweenEvictionRunsMillis(properties
.getTimeBetweenEvictionRunsMillis());
druidDataSource.setMinEvictableIdleTimeMillis(properties
.getMinEvictableIdleTimeMillis());
druidDataSource.setValidationQuery(properties.getValidationQuery());
druidDataSource.setTestWhileIdle(properties.isTestWhileIdle());
druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());
druidDataSource.setTestOnReturn(properties.isTestOnReturn());
druidDataSource.setPoolPreparedStatements(properties
.isPoolPreparedStatements());
druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties
.getMaxPoolPreparedStatementPerConnectionSize());
druidDataSource.setFilters(properties.getFilters());
try {
if (null != druidDataSource) {
druidDataSource.setFilters("wall,stat");
druidDataSource.setUseGlobalDataSourceStat(true);
// Properties properties = new Properties();
// properties.setProperty("decrypt", "true");
// druidDataSource.setConnectProperties(properties);
druidDataSource.init();
}
} catch (Exception e) {
throw new RuntimeException(
"load datasource error, dbProperties is :", e);
}
return druidDataSource;
}
}
3、獲取Properties中配置信息
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DruidDataSourceProperties {
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize;
private int maxActive;
private int minIdle;
private int maxWait;
private long timeBetweenEvictionRunsMillis;
private long minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
private String filters;
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 getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public int getMaxWait() {
return maxWait;
}
public void setMaxWait(int maxWait) {
this.maxWait = maxWait;
}
public long getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public long getMinEvictableIdleTimeMillis() {
return minEvictableIdleTimeMillis;
}
public void setMinEvictableIdleTimeMillis(long 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 DruidDataSourceProperties() {
// TODO Auto-generated constructor stub
}
public DruidDataSourceProperties(String url, String username,
String password, String driverClassName, int initialSize,
int maxActive, int minIdle, int maxWait,
long timeBetweenEvictionRunsMillis,
long minEvictableIdleTimeMillis, String validationQuery,
boolean testWhileIdle, boolean testOnBorrow, boolean testOnReturn,
boolean poolPreparedStatements,
int maxPoolPreparedStatementPerConnectionSize, String filters) {
this.url = url;
this.username = username;
this.password = password;
this.driverClassName = driverClassName;
this.initialSize = initialSize;
this.maxActive = maxActive;
this.minIdle = minIdle;
this.maxWait = maxWait;
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
this.validationQuery = validationQuery;
this.testWhileIdle = testWhileIdle;
this.testOnBorrow = testOnBorrow;
this.testOnReturn = testOnReturn;
this.poolPreparedStatements = poolPreparedStatements;
this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
this.filters = filters;
}
}
如果需要Druid的監(jiān)控統(tǒng)計功能在配置代碼中加入以下代碼:
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// IP白名單 (沒有配置或者為空,則允許所有訪問)
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// IP黑名單(共同存在時,deny優(yōu)先于allow)
//servletRegistrationBean.addInitParameter("deny", "");
//控制臺管理用戶
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
//是否能夠重置數(shù)據(jù) 禁用HTML頁面上的“Reset All”功能
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
訪問地址:http://127.0.0.1:8080/druid, 使用配置的賬號密碼登錄即可查看數(shù)據(jù)源及SQL統(tǒng)計等監(jiān)控信息。
4、jpa配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager",
basePackages = {"*.dao"})//指定需要掃描的dao所在包
public class RepositoryConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("druidDataSource")
private DataSource druidDataSource;
@Bean(name = "entityManager")
@Primary
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactory(builder).getObject().createEntityManager();
}
/**
* 指定需要掃描的實體包實現(xiàn)與數(shù)據(jù)庫關(guān)聯(lián)
* @param builder
* @return
*/
@Bean(name = "entityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(druidDataSource)
.properties(getVendorProperties(druidDataSource))
.packages("*.entity")//指定需要掃描的entity所在包
.build();
}
/**
* 通過jpaProperties指定hibernate數(shù)據(jù)庫方言以及在控制臺打印sql語句
* @param dataSource
* @return
*/
private Map<String, String> getVendorProperties(DataSource dataSource) {
Map<String, String> map = jpaProperties.getProperties();
map.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
map.put("hibernate.show_sql", "true");
return map;
}
/**
* 創(chuàng)建事務(wù)管理
* @param builder
* @return
*/
@Bean(name = "transactionManager")
@Primary
PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactory(builder).getObject());
}
}
到此這篇關(guān)于springboot 中 druid+jpa+MYSQL數(shù)據(jù)庫配置的文章就介紹到這了,更多相關(guān)springboot druid+jpa+MYSQL配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Java設(shè)計一個高并發(fā)的秒殺系統(tǒng)
這篇文章主要為大家詳細介紹了如何基于Java設(shè)計一個高并發(fā)的秒殺系統(tǒng),文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下2023-10-10
解決IDEA使用maven創(chuàng)建Web項目,出現(xiàn)500錯誤的問題
本文主要介紹了在使用Maven創(chuàng)建項目并導(dǎo)入依賴寫完測試代碼后運行出現(xiàn)500錯誤的解決步驟,這種問題的根本原因是Tomcat啟動后缺少某些支持的jar包,導(dǎo)致運行出錯,解決方法是在項目結(jié)構(gòu)中找到Artifacts,點擊要編輯的項目2024-10-10
spring+maven實現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細介紹了spring+maven實現(xiàn)發(fā)送郵件功能,利用spring提供的郵件工具來發(fā)送郵件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Struts2之Action接收請求參數(shù)和攔截器詳解
這篇文章主要介紹了Struts2之Action接收請求參數(shù)和攔截器詳解,非常具有實用價值,需要的朋友可以參考下2017-05-05

