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
NDI(Java Naming and Directory Interface)是Java中用于访问命名和目录服务的API,它提供了一种标准的方式来查找和访问各种命名和目录服务,例如LDAP、DNS、NIS等。通过JNDI,Java应用程序可以从命名服务中获取数据源,并使用该数据源来访问数据库。
在JNDI中,数据源通常被配置为一个JNDI名称,并在应用程序中通过该名称来获取数据源。由于JNDI名称是全局唯一的,因此多个应用程序可以共享同一个数据源。
根据您提供的代码和描述,确实在JNDI每次获取数据源时都会创建一个新的数据源对象。这是因为在createDataSourceInternal
方法中,每次调用new DruidDataSource()
都会创建一个新的DruidDataSource
对象。
这种行为是正常的,因为JNDI的设计初衷是通过配置和管理数据源的方式来提供连接池功能。每次调用JNDI获取数据源时,都会根据配置文件或其他方式创建一个新的数据源对象。这样做的好处是可以根据不同的需求和环境配置不同的数据源,而不是重复使用同一个数据源。
尽管每次获取的是新的数据源对象,但是您仍然可以使用这些数据源对象来获取连接。每个数据源对象都会维护自己的连接池,可以从中获取连接来执行数据库操作。
如果您希望在应用程序中共享同一个数据源对象,而不是每次获取都创建新的数据源对象,可以考虑将数据源对象缓存起来,供应用程序的其他部分使用。这样可以确保在应用程序的生命周期中使用同一个数据源对象,并从中获取连接。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。