JFinal的model用use()方法切换了数据源,进行操作之后,如何切回之前的数据源呢?

波总,在做model保存的时候,先是用use方法切换到另一个数据源,保存后,如何切回原来配置的数据源进行model的保存呢?我用use方法切回去,还是会报错呀。

例子:

List<Student> list = Student.me.find("select * from student where name='pp' and age='33' ");
        Student s = list.get(0);//从开发的数据库中查出数据
        s.remove("tid");
        s.use("csDb").save();//保存到测试的数据库中
        s.remove("tid");
        s.use("kfDb").save();//此处报错。。。
        this.renderNull();

评论区

JFinal

2017-02-24 17:37

首先,查询一条数据,用一下 findFirst 就好,可以避免后面的 list.get(0) 这样的操作

其次,具体报的什么错误?

zhaols33

2017-02-24 18:04

@JFinal 报的空指针,
java.lang.NullPointerException
at com.jfinal.plugin.activerecord.Model.save(Model.java:404)
at erp.controller.StudentController.testChangeDb(StudentController.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.aop.Invocation.invoke(Invocation.java:73)
at erp.interceptor.StudentInterceptor.intercept(StudentInterceptor.java:11)
at com.jfinal.aop.Invocation.invoke(Invocation.java:67)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:48)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:74)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Unknown Source)

zhaols33

2017-02-24 18:06

@JFinal 在save方法里面这一行的时候报错的。
config.dialect.forModelSave(table, attrs, sql, paras);

zhaols33

2017-02-24 18:10

@JFinal 很抱歉,我找到问题了,是我自己切换回kfDb时,拼写错误了,非常感谢您的指导。

JFinal

2017-02-24 18:14

感谢解决问题后回来分享

小智zaki

2018-09-05 10:41

@JFinal 有没方法切换默认的数据源,如我定义了两个数据源,不调用usr("")的时候直接Db.find用的就是默认的数据源,我想把默认数据源切换成另一个,然后在任何默认用的都是这个数据源,有没这个操作呢?

JFinal

2018-09-05 10:56

@小智zaki Db 是不支持的,因为要考虑线程安全问题,多个线程在共享使用数据源,如果某一个线程可以切换全局的这个默认数据源,会影响到其它线程

简单多,默认数据源只能有一个,默认值相当于一个约定不能变来变去

如果默认值确实不能满足需求,不能成为默认值,那么在启动时指定别的数据源成为默认即可

小智zaki

2018-09-05 13:53

@JFinal 谢谢老师回复,我想再了解下,因为我是独立在项目中用ActiveRecord的嘛,项目已启动了,这个插件也已启动连接数据源了,还能不能追加sql脚本,如
DbKit.getConfig().getSqlKit().setBaseSqlTemplatePath(PathKit.getRootClassPath());
DbKit.getConfig().getSqlKit().addSqlTemplate("/com/sql/all.sql");

我调用了这两句来对默认的数据源追加sql映射,但还没生效,引用不了,有没办法让它生效呢

小智zaki

2018-09-05 14:42

@JFinal 挺急的,在线等!我目的是想动态加载template,或者有没有全局template,可以让已启动的activeRecordPlug用到

小智zaki

2018-09-05 15:14

@JFinal 已摸索到解决了
com.jfinal.plugin.activerecord.DbKit.getConfig().getSqlKit().setBaseSqlTemplatePath(com.jfinal.kit.PathKit.getRootClassPath()); //设置根目录
com.jfinal.plugin.activerecord.DbKit.getConfig().getSqlKit().addSqlTemplate("/com/landray/kmss/odm/sql/all.sql"); //加载sql文件
com.jfinal.plugin.activerecord.DbKit.getConfig().getSqlKit().parseSqlTemplate(); //让加载的文件生效

JFinal

2018-09-05 16:46

@小智zaki 追加 sql模板确实可以通过 DbKit.getConfig().getSqlKit() 拿到 SqlKit 对象以后调用其中的方法来实现

建议配置一下 activeRecordPlugin.getEngine().setDevMode(true) ,可以支持热加载。当然,也可以通过 activeRecordPlugin.setDevMode(true) 达到同样的效果,但前者仅仅是对 sql 管理进行 devMode 配置,而后者同时也对 ActiveRecordPlugin 与 sql 管理进行 devMode 配置