nutzam / nutz

Nutz -- Web Framework(Mvc/Ioc/Aop/Dao/Json) for ALL Java developer
https://nutzam.com
Apache License 2.0
2.53k stars 942 forks source link

FileSqlManager 在多线程的时候似乎会出现找不到sql的问题 #831

Closed xbl closed 9 years ago

xbl commented 9 years ago

配置文件如下: // 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’,实在搞不清楚是为什么

wendal commented 9 years ago

求可重现该问题的最小代码

zozoh commented 9 years ago

多大并发?

xbl commented 9 years ago

有的时候2个人访问不停的刷就会出现,刚刚做了一个实验,100个线程就会出现

xbl commented 9 years ago

http://pan.baidu.com/s/1bnD9K55 把测试代码上传到百度网盘了,请看一下

wendal commented 9 years ago

重现了

xbl commented 9 years ago

@wendal 咋办?不明白,sqlManager会被销毁吗?

zozoh commented 9 years ago

加个同步?

wendal commented 9 years ago

在设置FileSqlManager时载入,这样就避免了map()在未载入完成的情况下直接返回了结果

wendal commented 9 years ago

不是同步, 同步也没用. 因为map()里面是判断是否为null,而reflush中一开始就把实例变量给初始化了.

xbl commented 9 years ago

现在项目已经投入使用了,能有什么好办法不等下一个版本就回避掉这个问题吗?

wendal commented 9 years ago

有, 在Setup的init方法里面调用 dao.sqls().count()