Jfinal多数据源,如何在业务类中优雅的获取dataSource对象

 背景:

 有个旧项目计划迁移至Jfinal-undertow下。旧项目中是使用DB工具类来获取DataSource,进而进行其他数据库库操作。这样迁移的话就需要获取JFinalconfig中的多个DataSource 我在JFinalConfig中加入了一个静态方法:有业务类来调用此方法获取DataSource。

image.png

业务类会频繁访问数据库,进而会导致在此处会频繁new一个DruidPlugin对象而且会频繁调用druidPlugin.start(); 

请教大家:这样会不会因为造成内存泄漏风险?

或者有在业务类中无其他优雅的获取dataSource的方法?

最后解决如下:

image.png

image.png

评论区

JFinal

2019-04-21 10:04

通过 DbKit.getConfig().getDataSource() 可以在任何地方获取到这个 DataSource

这里要注意的是,从该 DataSource 获取 Connection 对象以后,要在 finally 块中关闭 connection, 否则出现资源泄漏 JVM 会挂掉

124653847atqq.com

2019-04-21 11:27

@JFinal 多谢。另外发现DbKit.getConfig()一直返回null,是需要其他操作或者加入其他参数吗?

JFinal

2019-04-21 11:29

@124653847atqq.com 需要 new ActiveRecordPlugin(...).start() 启动 active record plugin 才可以

124653847atqq.com

2019-04-21 14:29

@JFinal 多谢波总。由于存在一个filter,在filter的init方法中就需要获取数据源,而此时即使ActiveRecordPlugin(...).start() 启动DbKit.getConfig()方法返回的也是null,最后写了一个static方法手动启动,并且将启动之后获取的datasource保存在jfinalConfig的static变量中,每次调用getDataSource时就从这个变量中获取。

JFinal

2019-04-21 15:40

ActiveRecordPlugin 可以在全体地方创建和初始化,不一定要在 configPlugin

所以,挑选一个符合你需求的地方做这事就行,唯一多做的事情就是手动 arp.start() 一下

wdl6949

2019-05-30 11:52

@JFinal 怎么获取指定的数据源呢 我在项目中使用了两个数据库

JFinal

2019-05-30 11:54

@wdl6949 根据文档来,model 是自动的,Db 可以使用 Db.use(dsName)

wdl6949

2019-05-30 12:01

@JFinal 波总 我的意思是说获取另外一个数据源的连接,因为使用 DbKit.getConfig().getDataSource().getConnection()拿到的是我默认的数据源的,我想要的是另一个的连接

124653847atqq.com

2019-05-30 13:12

我是在初始化时将datasource放在一个dsMap里面,用到时直接从map中读取的