理解JNDI中 java:comp/env/jdbc/datasource 与 jdbc/datasource 的不同之处。

本文介绍了JNDI中两种不同的地址写法及其配置方式的区别,一种是通过环境命名上下文提高程序移植性的方法,另一种是直接引用实际地址的硬链接方式,并通过实例展示了如何在配置文件中进行资源映射。


在描述JNDI,例如获得数据源时,JNDI地址有两种写法,例如同是  jdbc/testDS 数据源:
A:        java:comp/env/jdbc/testDS
B:        jdbc/testDS

这两种写法,配置的方式也不尽相同,第一种方法应该算是一种利于程序移植或迁移的方法,它的实现与“映射”的概念相同,而B方法,则是一个硬引用。
java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。
在J2EE中的引用常用的有:
        JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明
        JMS 连接工厂在java:comp/env/jms 子上下文中声明
        JavaMail 连接工厂在java:comp/env/mail 子上下文中声明
        URL 连接工厂在 java:comp/env/url子上下文中声明

可以通过下面的结构示意来发现这两种描述的不同之处:
A:       java:comp/env/jdbc/testDS(虚地址)   ------>    映射描述符   ------>        jdbc/testDS (实际的地址)
B:       jdbc/testDS (实际的地址)
从这种结构上来看,A的确是便于移植的。

再来看一个例子:
假如你需要获取datasource,例如:dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/testDS");
那么在配置文件中进行资源映射时,在web.xml中,
      <resource-ref>
        <res-ref-name>jdbc/testDS</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
      </resource-ref>
在相应的资源配置xml中(不同的应用服务器均不同,WSAD中,可以进行可视化的设置),
    <reference-descriptor>
      <resource-description>
        <res-ref-name>jdbc/DBPool</res-ref-name>
        <jndi-name>OraDataSource</jndi-name>
      </resource-description>
    </reference-descriptor>
实际服务器中的JNDI名字是OraDataSource,逻辑名jdbc/DBPool只是用来和它作映射的,这样做的好处是为了提高可移植性,移植的时候只需要把配置文件改一下就可以,而应用程序可不用改动。

假如你写了一个一般的应用程序,想直接通过JNDI来获取数据源,那么直接lookup(“mytest”)就可以了(假如服务器上的JNDI为mytest),用第一种写法反而会报错的。

server: port: 80 servlet: context-path: /ecpdataservice spring: datasource: type: com.alibaba.druid.pool.DruidDataSource master: jndi-name: java:comp/env/jdbc/db_ecp_data_service #driver-class-name: com.mysql.cj.jdbc.Driver #url: jdbc:mysql://10.100.199.2:4000/db_ecp_data_service?useUnicode=true&characterEncoding=UTF-8 #username: zd_cgpt #password: ecp_zd_cgpt@mysql2021 slave1: jndi-name: java:comp/env/jdbc/zd_cgpt #driver-class-name: com.mysql.cj.jdbc.Driver #url: jdbc:mysql://10.100.199.2:4000/zd_cgpt?useUnicode=true&characterEncoding=UTF-8 #username: zd_cgpt #password: ecp_zd_cgpt@mysql2021 slave2: jndi-name: java:comp/env/jdbc/scm_order_cgn #driver-class-name: com.mysql.cj.jdbc.Driver #url: jdbc:mysql://10.100.199.86:3306/scm_order_cgn?useUnicode=true;characterEncoding=UTF-8 #username: scm_order_cgn #password: K5uTa0Fq140x3VS6 slave3: jndi-name: java:comp/env/jdbc/scm_product_cgn #driver-class-name: com.mysql.cj.jdbc.Driver #url: jdbc:mysql://10.100.199.86:3306/scm_product_cgn?useUnicode=true;characterEncoding=UTF-8 #username: scm_product_cgn #password: K5uTa0Fq140x3VS6 #druid连接配置 #启用ConfigFilter druid: filter: config: enabled: true #配置 connection-properties,启用加密,配置公钥。 #connection-properties: config.decrypt=true;config.decrypt.key=${public-key} # 配置初始化大小、最小、最大 initial: size: 5 max: active: 20 idle: 1 #配置获取连接等待超时的时间 位是毫秒 wait: 60000 #是否缓存preparedStatement,也就是PSCache。 PSCache对支持游标的数据库性能提升巨大,比如说oracle。mysql建议关闭 pool: prepared: statements: false #要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。 pool: prepared: statement: per: connection: size: -1 #用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用 validation: query: select 1 from dual #检测超时时间 #validation-query-timeout: 60000 #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 test: on: borrow: true #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 return: false #建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 while: idle:true #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time: between: eviction: runs: millis: 60000 #配置一个连接在池中最小生存的时间,单位是毫秒 min: evictable: idle: time: millis: 300000 #链接使用超过时间限制是否回收 remove: abandoned: true #超过时间限制时间(单位秒) timeout: 300 #链接回收的时候控制台打印信息,测试环境可以加上true,线上环境false。会影响性能。 log: abandoned: false #----redis配置开始---- redis: ## 集群ip端口 sentinel.nodes: 10.100.140.15:26379,10.100.140.15:26380,10.100.140.15:26381 ## 集群名称 sentinel.master: mymaster ## 密码 password: cgn_Redis@ECP ## Redis数据库索引 database: 1 ## 连接超时时间(毫秒) timeout: 6000 ## 连接池最大连接数(使用负值表示没有限制)如果是集群就是每个ip的连接数 pool.max-active: 300 ## 连接池最大阻塞等待时间(使用负值表示没有限制) pool.max-wait: -1 ## 连接池中的最大空闲连接 pool.max-idle: 100 ## 连接池中的最小空闲连接 pool.min-idle: 20 #-----redis配置结束---- pagehelper: #指定分页插件使用哪种方言,支持:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,informix,h2,derby。。。 helperDialect: mysql # pageNum<=0 时会查第一页, pageNum>pages(超过总数时),会查最后一页 reasonable: true # 支持通过 Mapper 接口参数来传递分页参数,默认值false supportMethodsArguments: true # 为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值 params: count=countSql mybatis-plus: global-config: db-config: id-type: assign_id configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath:mapper/*/*.xml # 日志配置 logback: # 日志存储路径 #logdir: 'D:\logs\ecpdataservice' #logdir: '../logs/ecpdataservice' # 日志文件名称 appname: ecpdataservice logging: config: classpath:logback-spring.xml level: cgn.ecp.data.service.*: info fdfs: connect-timeout: 600 #连接超时时间(秒) so-timeout: 600 #读取超时时间(秒) tracker-list: 10.100.140.25:22122,10.100.140.26:22122 #tracker服务器地址 pool: max-wait-millis: 5000 # 获取连接的最大等待时间(毫秒) max-total: 50 # 连接池最大连接数这是我的application-dev的具体配置你说下怎么修改
最新发布
01-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值