开发者社区> 问答> 正文

JNDI 每次取数据源都是新的数据源

JNDI lookup的时候,取到了DruidDataSource的ObjectFactory。

factory = getObjectFactoryFromReference(ref, f); if (factory != null) { return factory.getObjectInstance(ref, name, nameCtx, environment); }

在DruidDataSourceFactory调用的是createDataSourceInternal, 是新建数据源

protected DataSource createDataSourceInternal(Properties properties) throws Exception { DruidDataSource dataSource = new DruidDataSource(); config(dataSource, properties); return dataSource; }

jndi每次取的时候,都根据原来的properties新建了一个数据源,那每次连接都是新的数据源,二不是取这个数据源的连接了。。

原提问者GitHub用户kylemick

展开
收起
山海行 2023-07-05 22:02:09 38 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    NDI(Java Naming and Directory Interface)是Java中用于访问命名和目录服务的API,它提供了一种标准的方式来查找和访问各种命名和目录服务,例如LDAP、DNS、NIS等。通过JNDI,Java应用程序可以从命名服务中获取数据源,并使用该数据源来访问数据库。

    在JNDI中,数据源通常被配置为一个JNDI名称,并在应用程序中通过该名称来获取数据源。由于JNDI名称是全局唯一的,因此多个应用程序可以共享同一个数据源。

    2023-07-29 23:14:58
    赞同 展开评论 打赏
  • DBCP也是这样实现的

    原回答者GitHub用户wenshao

    2023-07-06 12:58:35
    赞同 展开评论 打赏
  • 根据您提供的代码和描述,确实在JNDI每次获取数据源时都会创建一个新的数据源对象。这是因为在createDataSourceInternal方法中,每次调用new DruidDataSource()都会创建一个新的DruidDataSource对象。

    这种行为是正常的,因为JNDI的设计初衷是通过配置和管理数据源的方式来提供连接池功能。每次调用JNDI获取数据源时,都会根据配置文件或其他方式创建一个新的数据源对象。这样做的好处是可以根据不同的需求和环境配置不同的数据源,而不是重复使用同一个数据源。

    尽管每次获取的是新的数据源对象,但是您仍然可以使用这些数据源对象来获取连接。每个数据源对象都会维护自己的连接池,可以从中获取连接来执行数据库操作。

    如果您希望在应用程序中共享同一个数据源对象,而不是每次获取都创建新的数据源对象,可以考虑将数据源对象缓存起来,供应用程序的其他部分使用。这样可以确保在应用程序的生命周期中使用同一个数据源对象,并从中获取连接。

    2023-07-06 09:16:23
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载