Closed xbl closed 9 years ago
求可重现该问题的最小代码
多大并发?
有的时候2个人访问不停的刷就会出现,刚刚做了一个实验,100个线程就会出现
http://pan.baidu.com/s/1bnD9K55 把测试代码上传到百度网盘了,请看一下
重现了
@wendal 咋办?不明白,sqlManager会被销毁吗?
加个同步?
在设置FileSqlManager时载入,这样就避免了map()在未载入完成的情况下直接返回了结果
不是同步, 同步也没用. 因为map()里面是判断是否为null,而reflush中一开始就把实例变量给初始化了.
现在项目已经投入使用了,能有什么好办法不等下一个版本就回避掉这个问题吗?
有, 在Setup的init方法里面调用 dao.sqls().count()
配置文件如下: // dao 数据链接 dao: { type : "org.nutz.dao.impl.NutDao", args : [{refer:"dataSource"}, {refer:"fileSqlManager"} ] }, // sqls 文件地址 fileSqlManager: { type: "org.nutz.dao.impl.FileSqlManager", args : ['sqls/common.sqls'] }, // 数据源 dataSource: { type: "com.alibaba.druid.pool.DruidDataSource", events: { depose: 'close' }, fields: { driverClassName: "org.postgresql.Driver", testWhileIdle: false, jdbcUrl : 'jdbc:postgresql://localhost/abc', username : 'abc', password : 'abc' } }
按说sqlManager是单例的,AbstractSqlManager 中的_sql_map 不是线程安全的,需要项目启动的时候手动加载一下,加载之后确还是偶尔会报出SqlNotFoundException: fail to find SQL ‘xxxx’,实在搞不清楚是为什么