springboot使用JNDI连接mysql数据库

一、什么是JNDI?

JNDI(Java Naming and Directory Interface,Java命名和目录接口):在程序中使用JNDI获取数据源。说白了就是把数据源取个名字,再根据名字来找数据源。

在JDBC时代,需要把数据库信息,写在代码中去连接。

使用JNDI就是把数据库的连接信息放到j2ee的容器中取一个名字。例如放到tomcat的conf/context.xml中

 

二、本地springboot项目JNDI怎么配置?

1、配置文件增加jndi的name

spring.datasource.jndi-name=java:comp/env/jdbc/mysql/test

2、增加配置类,定义内置tomcat工厂bean。先打开jndi数据源,再添加Context资源到tomcat上下文中。


@Configuration
public class TomcatConfigs {
	
	@Bean
    public TomcatEmbeddedServletContainerFactory tomcatFactory() {
        return new TomcatEmbeddedServletContainerFactory() {
            @Override
            protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
                tomcat.enableNaming();// 打开JNDI数据源
                return super.getTomcatEmbeddedServletContainer(tomcat);
            }
            @Override
            protected void postProcessContext(Context context) {
                ContextResource resource = new ContextResource();
                resource.setName("jdbc/mysql/test");
                resource.setType(DataSource.class.getName());
                resource.setProperty("driverClassName", "com.mysql.jdbc.Driver");
                resource.setProperty("url", "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8");
                resource.setProperty("username", "root");
                resource.setProperty("password","root");
                //数据库连接池
                resource.setProperty("maxTotal","100");
                resource.setProperty("maxIdle","80");
                resource.setProperty("minIdle","10");
                resource.setProperty("maxWaitMillis","30000");
                resource.setProperty("testOnCreate","false");
                resource.setProperty("testOnBorrow","true");
                resource.setProperty("testOnReturn","false");
                resource.setProperty("testWhileIdle","false");
                resource.setProperty("numTestsPerEvictionRun","3");//设定在进行后台对象清理时,每次检查几个链接
                resource.setProperty("minEvictableIdleTimeMillis","1800000");//空闲逐出连接池的时间 毫秒
                context.getNamingResources().addResource(resource);
            }
        };
    }	
	
}

3、之后项目启动时,满足springboot-autoconfig的JndiDataSourceAutoConfiguration。就开始使用jndi连接数据库,创建连接池。

4、完毕

JndiDataSourceAutoConfiguration源码如下:

注意:JNID使用的是org.apache.tomcat.dbcp.dbcp2.BasicDataSource数据源、连接池是:GenericObjectPool<PoolableConnection>

附加:手动获取JNDI数据库连接方式

  // 获取数据库连接
  public Connection getConnection() {
   try {
    //初始化上下文
    Context cxt=new InitialContext();
    //获取与逻辑名相关联的数据源对象
    DataSource ds=(DataSource)cxt.lookup("java:comp/env/jdbc/test");
    conn=ds.getConnection();
   } catch (NamingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return conn;
  }

JNDI包括5个包:

  • javax.naming:主要用于命名操作,它包含了命名服务的类和接口,该包定义了Context接口和InitialContext类;
  • javax.naming.directory:主要用于目录操作,它定义了DirContext接口和InitialDir- Context类;
  • javax.naming.event:在命名目录服务器中请求事件通知;
  • javax.naming.ldap:提供LDAP支持;
  • javax.naming.spi:允许动态插入不同实现,为不同命名目录服务供应商的开发人员提供开发和实现的途径,以便应用程序通过JNDI可以访问相关服务。

常用的JNDI操作如下:

  • void bind(String sName,Object object),绑定:把名称同对象关联的过程。
  • void rebind(String sName,Object object),重新绑定:用来把对象同一个已经存在的名称重新绑定。一般使用rebind()而不使用bind(),因为当有重名的时候rebind()不会出现异常,而bind()会报异常。
  • void unbind(String sName),释放:用来把对象从目录中释放出来。
  • void lookup(String sName,Object object),查找:返回目录总的一个对象。
  • void rename(String sOldName,String sNewName),重命名:用来修改对象名称绑定的名称。
  • NamingEnumeration listBindings(String sName),清单:返回绑定在特定上下文中指定属性名对象的清单列表,它返回名字、类和对象本身,它用于那些需要对对象进行实际操作的应用。

 

三、生产环境tomcat JNDI怎么配置?

1、在lib/server.xml文件中<Server>节点下的<GlobalNamingResources>节点下添加下面的资源定义

<Resource name="jdbc/mysql/test" 
      auth="Container"
      type="javax.sql.DataSource"
      maxTotal="1000" 
      maxWaitMillis="10000"
      driverClassName="com.mysql.jdbc.Driver" 
      username="root"
      password="root" 
      url="jdbc:mysql://192.168.1.10:3306/jsw?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;useSSL=fals
e"
    />

参数:

name=指定Resource的JNDI名称
  auth=指定管理Resource的Manager(Container由容器创建和管理,Application由Web应用创建和管理)
  type=指定Resource的java类
  maxActive=指定连接池中处于活动状态的数据库连接的最大数量
  maxIdle=指定连接池中处于空闲状态的数据库的最大数量
  maxWait=指定连接池中连接处于空闲的最长时间,超过这个时间会提示异常

2、在lib/context.xml文件中<Context>节点中添加下面的资源引用<ResourceLink>。 

<ResourceLink name="jdbc/mysql/test" global="jdbc/mysql/test" type="javax.sql.DataSource" />

3、将数据库的驱动jar包,放到Tomcat安装目录下的lib文件夹中。

提示:jndi数据源配置的密码应该是要加密存放在<Resources>中,只是我没有细致了解,请另行百度

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot可以通过配置JNDI数据源来连接数据库。具体步骤如下: 1. 在Tomcat的conf/server.xml文件中添加数据源配置,例如: ``` <Resource name="jdbc/myDataSource" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="myuser" password="mypassword" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydatabase"/> ``` 2. 在Spring Boot的application.properties文件中添加JNDI数据源的配置,例如: ``` spring.datasource.jndi-name=java:comp/env/jdbc/myDataSource ``` 3. 在Spring Boot的启动类中添加注解@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}),排除自动配置的数据源,例如: ``` @SpringBootApplication @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 这样就可以使用JNDI数据源连接数据库了。 ### 回答2: Spring Boot是一种快速开发Web应用程序的框架,并且集成了许多常用的框架和库,其自带的tomcat默认使用了DBCP(Apache Common DBCP)连接池框架作为数据源,但是实际项目存在多种数据源的需求,这时候我们就可以通过配置JNDI来实现多数据源的配置。 JNDI(Java Naming and Directory Interface)是Java命名和目录接口,JNDI数据源就是将数据库的信息绑定到JNDI命名空间中,使Web应用程序可以访问并使用它们。Spring Boot可以使用JNDI数据源来连接各种数据库,只需要在应用程序的配置文件中添加如下配置: ```yaml spring: jndi: name: java:comp/env/jdbc/mydatasource ``` 此配置告诉Spring Boot去查找一个名为“java:comp/env/jdbc/mydatasource”的JNDI数据源并使用它。但是,我们还需要在Tomcat服务器中创建一个名为“jdbc/mydatasource”的JNDI数据源,并将其绑定到数据库上: 1. 打开Tomcat服务器的目录,找到server.xml文件,在GlobalNamingResources节点下添加如下内容: ```xml <Resource name="jdbc/mydatasource" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" username="root" password="password" maxTotal="20" maxIdle="10" maxWaitMillis="10000"/> ``` 其中,name属性指定了JNDI数据源的名称,url指定了JDBC连接URL,username和password是数据库的用户名和密码,其他属性是为连接池设置的。这里使用的是MySQL数据库作为例子。 2. 重启Tomcat服务器,应用程序将能够通过JNDI查找到配置的数据源,并连接数据库。 通过上述方法,我们就可以在Spring Boot应用程序中使用JNDI数据源了,同时也可以添加多个数据源,只需要按照上述步骤配置即可。 ### 回答3: SpringBoot是一个开箱即用的框架,可以轻松帮助我们快速搭建JavaWeb应用程序。而JNDI数据源的配置则是在应用程序中连接数据库时必不可少的一步。在SpringBoot中,我们可以使用Tomcat-jdbc来实现JNDI数据源的配置。 以下是具体的步骤: 1. 在maven中引入Tomcat-jdbc的依赖。 ``` <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> <version>${tomcat-jdbc.version}</version> </dependency> ``` 2. 在application.properties文件中定义数据源的配置信息。 ``` # tomcat datasource spring.datasource.jndi-name=jdbc/myDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=mysql spring.datasource.test-on-borrow=true spring.datasource.test-while-idle=true spring.datasource.validation-query=SELECT 1 ``` 这里我们通过配置spring.datasource.jndi-name=jdbc/myDataSource来指定数据源的JNDI名称为“jdbc/myDataSource”。其他配置信息包括驱动程序类名、URL、用户名和密码等都与普通的数据源配置一致。 3. 在application.properties文件中定义JNDI的配置信息。 ``` # JNDI datasource spring.jndi.enabled=true spring.jndi.name=jdbc/myDataSource ``` 这里我们通过配置spring.jndi.enabled=true和spring.jndi.name=jdbc/myDataSource来启用并指定JNDI的配置信息。 4. 在Tomcat中配置数据源。 在应用程序部署到Tomcat中之后,我们还需要在Tomcat中配置数据源。我们可以在Tomcat的server.xml文件中添加以下配置: ``` <GlobalNamingResources> <Resource name="jdbc/myDataSource" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="root" password="mysql" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" validationQuery="SELECT 1" /> </GlobalNamingResources> ``` 这里我们通过添加Resource元素来定义数据源,其中name属性的值与application.properties文件中定义的JNDI名称相同。 至此,我们就成功地配置了JNDI数据源。在应用程序中可以通过@Resource注解来引用它: ``` @Resource(lookup="java:comp/env/jdbc/myDataSource") private DataSource dataSource; ``` 除了Tomcat-jdbc,其他的JNDI数据源也可以使用相同的方法来配置。如果我们不想使用JNDI数据源,也可以直接在application.properties文件中配置普通的数据源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值