Springboot配置外部容器使用JNDI讀取數據源
簡介
JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標准的Java命名系統接口,JNDI提供統一的客戶端API,通過不同的訪問提供者接口JNDI服務供應接口(SPI)的實現,由管理者將JNDI API映射為特定的命名服務和目錄系統,使得Java應用程序可以和這些命名服務和目錄服務之間進行交互。目錄服務是命名服務的一種自然擴展。兩者之間的關鍵差別是目錄服務中對象不但可以有名稱還可以有屬性(例如,用戶有email地址),而命名服務中對象沒有屬性 [1] 。(by百度百科)
百度百科就是說的太專業了,簡單來說就是將資源引入到服務器中通過JNDI提供給程序使用。
需求
將數據庫連接配置改為讀取JNDI數據源,由於公司用的是Resin環境下面示例我只在Resin上測試通過,其實換成Tomcat也是一樣的原理。
步驟
- resin.xml配置
將mysql-connector-java-5.0.8-bin.jar 放到resin的lib目錄下
<!-- the default host, matching any host name -->
<host id="" root-directory=".">
<database>
<jndi-name>jdbc/intf</jndi-name>
<driver type="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<url>jdbc:mysql://192.168.xxx.xxx:3306/intf</url>
<user>root</user>
<password>root</password>
</driver>
<prepared-statement-cache-size>8</prepared-statement-cache-size>
<max-connections>80</max-connections>
<max-idle-time>30s</max-idle-time>
</database>
<web-app id="/" root-directory="/data/web/all-adintf"/>
</host>
- 修改application.yml
spring:
# jndi-name 數據源 沒見過這個屬性吧我也是頭一次見 (#^.^#)
datasource:
jndi-name: jdbc/intf
- 創建DataSourceConfig
package cn.pconline.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jndi.JndiLocatorSupport;
import org.springframework.jndi.JndiObjectFactoryBean;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* @Description 使用Resin配置的數據源
* 1.配置Spring JNDI名稱
* 2.resin.xml
* 3.注入dataSource Bean PS:Springboot就是實現零配置文件!! 所有的配置Bean的方法都是可以通過注解的方式注入
* @Bean("dataSource") 如果使用Spring XML配置如下:
* <jee:jndi-lookup id="dataSource" jndi-name="${sys.jndi.name}" expected-type="javax.sql.DataSource"/>
*
* 存在問題不能使用數據庫連接池Alibaba Druid
*
* --- 備份 ---
* JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
* DataSource dataSource = dataSourceLookup.getDataSource(jndiName);
* System.out.println(dataSource);
* return dataSource;
* @Author jie.zhao
* @Date 2019/7/29 14:24
*/
@Configuration
@EnableConfigurationProperties
public class DataSourceConfig {
@Value("${spring.datasource.jndi-name}")
private String jndiName;
@Bean("dataSource")
@Primary
public DataSource primaryDataSource() throws NamingException {
JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
bean.setJndiName(JndiLocatorSupport.CONTAINER_PREFIX + jndiName);
bean.setProxyInterface(DataSource.class);
bean.setLookupOnStartup(false);
bean.afterPropertiesSet();
return (DataSource) bean.getObject();
}
}
這樣的的話我們就把數據源改為引用外部JNDI的了。
存在的不足因為使用了外部容器啟動,在開發時Springboot Main方法就不能用了,大大影響了開發調試的效率。