ctripcorp / dal

Ctrip Database Access Layer
Apache License 2.0
1.24k stars 447 forks source link

dal-client 1.15.3功能不正常 #34

Closed slankka closed 6 years ago

slankka commented 6 years ago
  1. 在启动页面设置数据库之后,连接测试通过,但是保存就报错,控制台都是NPE,初始化数据失败。 具体现象就是 #31 所描述。

  2. dal-dao-gen的 classpath 内可以看到 页面输入的datasource,数据库连接信息,用户名密码都保存在datasource.xml,是否和程序设计的原则不符合?推测原本是存储连接池属性的,没有看到 datasource.properties 这个文件,或者是 jdbc.properties?

  3. PropertyFileConnectionStringProvider 这个类只有测试用例在引用,推测用于解析上一步保存的文件,根据源码,文件应该叫做datasource.properties,但没有在 DataSourceConfigureParser / DefaultDataSourceConfigureLocator 等类中使用,没有看到解析ConnectionString 和 更新connectionStrings缓存 的相关代码。

非常感谢,很期待能够使用贵公司的DAL。

whyoyyx commented 6 years ago

有2中方法: 第一种方法:修改下DefaultDataSourceConfigureProvider的getDataSourceConfigure这个方法的代码由原来的DataSourceConfigure dataSourceConfigure = DataSourceConfigureLocatorManager.getInstance().getDataSourceConfigure(dbName);修改成PoolPropertiesConfigure dataSourceConfigure = DataSourceConfigureLocatorManager.getInstance().getUserPoolPropertiesConfigure(dbName); 第二种共方法就是通过修改Dal.config,增加如下`

/opt/apache-tomcat-8.0.23/webapps/ROOT/WEB-INF/classes/database.properties com.ctrip.platform.dal.dao.configure.PropertyFileConfigureProvider

`即可。

DiaosX commented 6 years ago

从1.14.10到1.15.5我挨个都测试了一遍,统统都报“不能初始化连接池”,经调试根本原因就是出在DefaultDataSourceConfigureLocator这个类上的getDataSourceConfigure方法。里面提供了一个setConnectionStrings方法,但从来都没用过,但获取DataSourceConfigure的时候又多了一个判断: if (connectionStringConfigure == null) return null;从而导致DataSourceConfigure=null,可以简单如下修改:修改方法_getDataSourceConfigure:private DataSourceConfigure _getDataSourceConfigure(String name) { DataSourceConfigure configure = null; configure = dataSourceConfiguresCache.get(name); if (configure != null) { return configure; } ConnectionString connectionString = connectionStrings.get(name); if (connectionString == null) { configure = (DataSourceConfigure) this.getUserPoolPropertiesConfigure(name); } else { configure = mergeDataSourceConfigure(connectionString); } if (configure != null) { dataSourceConfiguresCache.put(name, configure); } return configure; } 核心变动点: if (connectionString == null) { configure = (DataSourceConfigure) this.getUserPoolPropertiesConfigure(name); } else { configure = mergeDataSourceConfigure(connectionString); }

wangyenan commented 6 years ago

近期会修复这个问题,代码待合并。

wangyenan commented 6 years ago

master分支上的最新版已修复这个问题。