2019-05-19 19:34
@泰山日出 通过代码:
new DictCustom().findById(id)
可以猜出你的对象是 model, 那么你的 #(dictCustom.function_name??) 具体行为如下:
1:先找 dictCustom.getFunction_name() 方法,找到则调用
2:直接调用 dictCustom.get("function_name") 方法
查看一下上面两个是否可以获取到值,在 getFunction_name() 方法以及 Model.get(String) 方法中设置断点,看程序走没走这里
这里可能的问题在于:不要认为会调用 getFunctionName() 方法,这里的 getter 方法并不会理会下划线,只会将 fieldName 的首字线变大写字母,并在之前添加 "get",即:
getFunction_name()
2019-05-19 19:30
@RichardHe 我天天都在用的,没有问题,注意要配置好 maven conf 目录下的 settings.xml
2019-05-19 17:11
@zzutligang 这个问题是 java 有关线程安全的基础问题,大致就是:只要对象可能被多线程使用,这个对象就必须保障是线程安全的
2019-05-19 17:10
最简单是通过直接配置 mysql 为读写分离,做主从配置,主库可读写,从库只读。这种方案对于你的代码来说是透明的,是最省事的
再一个就是直接使用第三方中间件,类似于 shareding jdbc、mycat 之类的,同样也是对你的代码透明化,代码完全不需要知道这件事
如果你非要自己写代码解决,做个全局拦截器,参考 Tx.java,事先往 Config 中的 ThreadLocal 中放入 Connection 对象,后续一切数据库操作都会使用这个 Connection,从而实现读写分离
全局拦截器大致为:
String methodName = nv.getMethodName();
Connection conn;
// 根据 methodName 判断出是写库操作
if (isWriteDb(methodName)) {
conn = DbKit.getConfig("写库数据源对应的 configName").getDataSource().getConnection();
} else { // 读库操作
conn = DbKit.getConfig("读库数据源对应的 configName").getDataSource().getConnection();
}
// 设置到 ThreadLocal 中去,当前线程后续的所有数据库操作都将用到这个 conn
DbKit.getConfig().setThreadLocalConnection(conn);
try {
inv.invoke();
}finally {
DbKit.getConfig().removeThreadLocalConnection();
}
注意,使用上面的方法以后,后面的数据库操作就不要再使用 Db.use(...)、model.use(...) 方法了,否则将覆盖掉上面拦截器的努力
@海哥 的 jpress 或 jboot 项目就是通过拦截器实现的读写分离,可以参考一下
2019-05-19 12:03
注意观察 TaskNote dao 这个变量,前方是有 static 修饰的,意味着这个变量是全局共享的,所有线程都可以用它
那么,这个 dao 对象就 “不是” 线程安全的,所以在 new TaskNote() 的时候,后面追加一个 dao() 方法,可以让这个对象变成线程安全的,可以全局共享
但是变成线程安全就必须限制对 dao 对象的写操作,否则就不会线程安全
综上,你去掉了 dao() 方法,必然导致极多的问题,如果你一定要使用 use 方法,这么来用才可保证线程安全:
new TaskNote().use(...).find(...)
也就是说临时 new 出来对象,再 use(...)
2019-05-19 11:57
@netwild 这个方案复杂度、学习成本都提升了,而且会拉低 jfinal 的 aop 性能,而这个需求其实并不强烈
所以暂不支持这个方案,否则会得不偿失
2019-05-19 11:56
maven 下载 jar 包只是第一次比较慢,而且不需要翻墙,更重要的是你可以配置 maven 指向阿里提供的公共库,速度极快:
https://blog.csdn.net/bladeandmaster88/article/details/88071344
https://www.cnblogs.com/charlesblc/p/6104804.html
最后,既然还是菜鸟,反正也是学新东西,还不如一步到位学最有用的东西,以免后面还得再学一次,可节省学习成本
最后的最后, maven 用起来要学的知识点极少, 10 分钟足够了,本站就有学习文档:
https://www.jfinal.com/doc/1-1