springboot啟動加載org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement;


使用Springboot + JPA + Druid連接池

1,項目啟動時報錯

2,檢查配置文件中連接池的連接串

#######################oracle數據庫連接池配置【start】############################
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.url=jdbc:oracle:thin:@10.7.101.38:1521:orcl
spring.datasource.druid.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.druid.username=wmxt_img
spring.datasource.druid.password=wmxt_img
# 初始化大小,最小,最大
spring.datasource.druid.initial-size=10
spring.datasource.druid.min-idle=10
spring.datasource.druid.max-active=20
# 配置獲取連接等待超時的時間
spring.datasource.druid.max-wait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
#檢測連接是否有效的sql
spring.datasource.druid.validation-query=SELECT 'x' FROM DUAL
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
#打開PSCache,並且指定每個連接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆
spring.datasource.druid.filters=stat,wall,log4j
# 合並多個DruidDataSource的監控數據
#spring.datasource.druid.use-global-data-source-stat=true
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.datasource.druid.login-user-name=admin
spring.datasource.druid.login-password=123456
#Druid監控ip白名單設置(沒有配置或者為空,則允許所有訪問)
spring.datasource.druid.ip-allow=
#spring.datasource.druid.ip-allow="127.0.0.1,10.7.101.77"
#######################oracle數據庫連接池配置【end】############################

#######################jpa配置【start】##########################
spring.jpa.database=ORACLE
spring.jpa.show-sql=false
#######################jpa配置【end】############################
View Code

3,檢查pom文件中依賴的jar包

JPA包

ojdbc包和druid包, 因為oracle是12c版本,所以通過jar包方式引入

 

 

 

檢查都沒問題,竟發現是:需要在代碼中將Druid實例注入到容器中

DruidDataSourceConfig:
package cn.com.fotic.eimp.ftp.druid;

import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.SQLException;


/**
 * @Title: DruidDataSourceConfig.java
 * @Description:  druid 定制信息配置
 * @author: liqiang
 * @date: 2018年12月14日 上午10:52:36
 */
@Data
@Component
@ConditionalOnClass(DruidDataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource", matchIfMissing = true)
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Slf4j
public class DruidDataSourceConfig {

        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;
        private String loginUserName;
        private String loginPassword;
        private String ipAllow;

        // 解決 spring.datasource.filters=stat,wall,log4j 無法正常注冊
        @Bean
        @Primary
        // 在同樣的DataSource中,首先使用被標注的DataSource
        public DataSource dataSource() {
            DruidDataSource datasource = new DruidDataSource();
            datasource.setUrl(url);
            datasource.setUsername(username);
            datasource.setPassword(password);
            datasource.setDriverClassName(driverClassName);

            // configuration
            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);
                log.info("druid configuration initialization filter...");
            } catch (SQLException e) {
                log.error("druid configuration initialization filter: " + e);
            }
            datasource.setConnectionProperties(connectionProperties);
            return datasource;
        }

}
View Code
DruidMonitorConfig --Druid客戶端配置:
package cn.com.fotic.eimp.ftp.druid;

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

/**
 * @Title: DruidMonitorConfig.java
 * @Description:
 * @author: liqiang
 * @date: 2018年12月14日 上午11:13:02
 */
@Slf4j
@SpringBootConfiguration
public class DruidMonitorConfig {

    @Autowired
    private DruidDataSourceConfig druidDataSourceConfig;

    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        log.info("init Druid Monitor Servlet ...");
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        // IP白名單 (沒有配置或者為空,則允許所有訪問)
        servletRegistrationBean.addInitParameter("allow", druidDataSourceConfig.getIpAllow());
        // IP黑名單(共同存在時,deny優先於allow)
//        servletRegistrationBean.addInitParameter("deny", "172.16.103.173");
        // 控制台管理用戶
//        servletRegistrationBean.addInitParameter("loginUserName", "admin");
//        servletRegistrationBean.addInitParameter("loginPassword", "123456");
        servletRegistrationBean.addInitParameter("loginUserName", druidDataSourceConfig.getLoginUserName());
        servletRegistrationBean.addInitParameter("loginPassword", druidDataSourceConfig.getPassword());
        // 是否能夠重置數據 禁用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;
    }

}
View Code

 

啟動ok

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM