使用Spring Boot配置JNDI資料來源 -Roy教程
在這篇文章中,我們將看到如何使用Spring Boot配置JNDI資料來源。JNDI資料來源與JDBC資料來源非常相似。JNDI資料來源訪問在應用程式伺服器中預定義和配置並作為JNDI資源或服務釋出的資料庫連線。無需像使用JDBC資料來源那樣指定驅動程式和資料庫,只需在應用程式伺服器中指定JNDI資源名稱。當您必須在以下環境之間移動應用程式時,JNDI可以提供幫助:開發->整合->測試->生產。如果將每個應用程式伺服器配置為使用相同的JNDI名稱,則每個環境中可以具有不同的資料庫,但無需更改程式碼。您只需要在新環境中刪除可部署的WAR檔案。
(總體思路:在application.properties中配置JNDI名稱和資料庫連線資訊,然後在Spring Boot應用中使用JNDI名稱呼叫)
Oracle配置:
#datasource spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver spring.datasource.url=jdbc:Oracle:thin:@//:/ spring.datasource.username=scott spring.datasource.password=tiger spring.datasource.jndiName=jdbc/myDataSource #disable schema generation from Hibernate spring.jpa.hibernate.ddl-auto=none #DB dialect - override default one spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect |
MySQL配置:
#datasource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost/roytuts spring.datasource.username=root spring.datasource.password=root spring.datasource.jndiName=jdbc/myDataSource #disable schema generation from Hibernate spring.jpa.hibernate.ddl-auto=none |
屬性配置類
建立DatabaseProperties屬性類,從application.properties檔案中載入資料庫連線引數的鍵/值對。
對於Spring Boot版本1.5.9,請使用以下配置:
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.roytuts.spring.boot.jndi.datasource.repository") public class AppConfig { @Bean public DatabaseProperties databaseProperties() { return new DatabaseProperties(); } @Bean public TomcatEmbeddedServletContainerFactory tomcatFactory() { return new TomcatEmbeddedServletContainerFactory() { @Override protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) { tomcat.enableNaming(); return super.getTomcatEmbeddedServletContainer(tomcat); } @Override protected void postProcessContext(Context context) { ContextResource resource = new ContextResource(); resource.setName(databaseProperties().getJndiName()); resource.setType(DataSource.class.getName()); resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory"); resource.setProperty("driverClassName", databaseProperties().getDriverClassName()); resource.setProperty("url", databaseProperties().getUrl()); resource.setProperty("password", databaseProperties().getPassword()); resource.setProperty("username", databaseProperties().getUsername()); context.getNamingResources().addResource(resource); } }; } @Bean(destroyMethod = "") public DataSource jndiDataSource() throws IllegalArgumentException, NamingException { JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); bean.setJndiName("java:comp/env/" + databaseProperties().getJndiName()); bean.setProxyInterface(DataSource.class); bean.setLookupOnStartup(false); bean.afterPropertiesSet(); return (DataSource) bean.getObject(); } @Bean public EntityManagerFactory entityManagerFactory() throws SQLException, IllegalArgumentException, NamingException { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setDatabase(Database.ORACLE); vendorAdapter.setShowSql(true); LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan("com.roytuts.spring.boot.jndi.datasource.entity"); factory.setDataSource(jndiDataSource()); factory.afterPropertiesSet(); return factory.getObject(); } @Bean public PlatformTransactionManager transactionManager() throws SQLException, IllegalArgumentException, NamingException { JpaTransactionManager txManager = new JpaTransactionManager(); txManager.setEntityManagerFactory(entityManagerFactory()); return txManager; } } |
對於Spring Boot 2.2.1,請使用以下配置檔案:
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.roytuts.spring.boot.jndi.datasource.repository") public class AppConfig { @Bean public DatabaseProperties databaseProperties() { return new DatabaseProperties(); } @Bean public TomcatServletWebServerFactory tomcatFactory() { return new TomcatServletWebServerFactory() { @Override protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) { tomcat.enableNaming(); return super.getTomcatWebServer(tomcat); } @Override protected void postProcessContext(Context context) { ContextResource resource = new ContextResource(); resource.setType("org.apache.tomcat.jdbc.pool.DataSource"); resource.setName(databaseProperties().getJndiName()); resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory"); resource.setProperty("driverClassName", databaseProperties().getDriverClassName()); resource.setProperty("url", databaseProperties().getUrl()); resource.setProperty("password", databaseProperties().getUsername()); resource.setProperty("username", databaseProperties().getPassword()); context.getNamingResources().addResource(resource); } }; } @Bean(destroyMethod = "") public DataSource jndiDataSource() throws IllegalArgumentException, NamingException { JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); bean.setJndiName("java:comp/env/" + databaseProperties().getJndiName()); bean.setProxyInterface(DataSource.class); bean.setLookupOnStartup(false); bean.afterPropertiesSet(); return (DataSource) bean.getObject(); } @Bean public EntityManagerFactory entityManagerFactory() throws SQLException, IllegalArgumentException, NamingException { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setDatabase(Database.MYSQL); vendorAdapter.setShowSql(true); LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan("com.roytuts.spring.boot.jndi.datasource.entity"); factory.setDataSource(jndiDataSource()); factory.afterPropertiesSet(); return factory.getObject(); } @Bean public PlatformTransactionManager transactionManager() throws SQLException, IllegalArgumentException, NamingException { JpaTransactionManager txManager = new JpaTransactionManager(); txManager.setEntityManagerFactory(entityManagerFactory()); return txManager; } } |
[b]詳細點選標題見原文[/b] |
相關文章
- Spring Boot 多資料來源配置Spring Boot
- Spring Boot 配置多資料來源Spring Boot
- 使用Spring Boot配置多個資料來源 - UdithSpring Boot
- Spring Boot 原始碼分析 資料來源 + Mybatis 配置Spring Boot原始碼MyBatis
- Spring Boot 2.x基礎教程:Spring Data JPA的多資料來源配置Spring Boot
- Spring Boot 2.x基礎教程:MyBatis的多資料來源配置Spring BootMyBatis
- Spring boot 如何快速的配置多個 Redis 資料來源Spring BootRedis
- 【教程】Spring+Mybatis環境配置多資料來源SpringMyBatis
- Spring多資料來源配置Spring
- Spring-Boot 多資料來源配置+動態資料來源切換+多資料來源事物配置實現主從資料庫儲存分離Springboot資料庫
- Spring Boot + Mybatis 多資料來源配置實現讀寫分離Spring BootMyBatis
- Spring Boot入門系列(十四)使用JdbcTemplate運算元據庫,配置多資料來源!Spring BootJDBC
- Spring系列之多個資料來源配置Spring
- Spring Boot 靜態資源配置 A卷Spring Boot
- Spring Boot Security配置教程Spring Boot
- Spring Boot 2.x基礎教程:使用JTA實現多資料來源的事務管理Spring Boot
- Spring全家桶--單資料來源的配置Spring
- Spring Boot與多資料來源那點事兒~Spring Boot
- spring-boot-route(十)多資料來源切換Springboot
- 談談Spring Boot 資料來源載入及其多資料來源簡單實現Spring Boot
- 使用Spring Boot實現資料庫整合配置案例Spring Boot資料庫
- Spring Boot 入門系列(二十三)整合Mybatis,實現多資料來源配置!Spring BootMyBatis
- Spring Boot 揭祕與實戰(二) 資料儲存篇 – 資料訪問與多資料來源配置Spring Boot
- Spring Boot中的Mongodb多資料來源擴充套件Spring BootMongoDB套件
- 關於使用Spring Boot的Kafka教程 - DZone大資料Spring BootKafka大資料
- Spring系列 之資料來源的配置 資料庫 資料來源 連線池的區別Spring資料庫
- Spring Boot MyBatis配置多種資料庫Spring BootMyBatis資料庫
- 使用Spring Boot和Elasticsearch教程Spring BootElasticsearch
- Spring Boot整合swagger使用教程Spring BootSwagger
- 多資料來源配置
- Spring Boot 2.x基礎教程:配置後設資料的應用Spring Boot
- 使用 Spring Boot 2.4配置Oracle的UCP資料庫連線池Spring BootOracle資料庫
- Spring Boot:Spring Boot配置MybatisSpring BootMyBatis
- Spring Boot:Spring Boot配置SwaggerSpring BootSwagger
- Spring Boot中使用PostgreSQL資料庫Spring BootSQL資料庫
- Spring Boot 中使用 JSON Schema 來校驗複雜JSON資料Spring BootJSON
- Spring Boot安全保護使用教程Spring Boot
- 使用Spring Boot整合Apollo配置中心Spring Boot