解决proxool必须把用户名和密码写在连接串里面的bug
程序员文章站
2022-05-24 08:47:33
...
一直以来proxool都存在这个bug,在Spring的"applicationContext.xml"中定义dataSource时,必须把用户名和密码写在连接串里面,ProxoolDataSource类提供的user,password属性没有用,无论提供什么,它都会以空用户名、密码去连接数据库,不过配置中的user,password两个属性还必须设置,否则会报空指针错误。
这种方式还有另外一个小问题,就是在使用AdminServlet查看时,能看到明码的用户名和密码。
最近有点时间,修正了这个bug,
原始代码如下
代码中我们看到registerPool中,
先解析了基本属性并给ConnectionPoolDefinition赋值,赋值的最终结果是写入ConnectionPoolDefinition的delegateProperties属性,
但是最后一句cpd.setDelegateProperties(delegateProperties);却覆盖了之前的所有工作。也就是说如果没有采用delegateProperties方式配置,那他就是空的,
所以最后创建连接时,真正起作用的配置只有一个就是url。
我的修正方式是把cpd.setDelegateProperties(delegateProperties);提前,这种做法在此种配置方式下成功,虽然没有做专门的测试,但是用在我目前的项目中暂时没有发现问题。
但是这两种做法导致了参数不同配置方式的优先级不同,也许在其他配置方式中可能会出现问题。
至于不设置user属性出现空指针的问题,好像是因为通用的属性解析方式导致的,具体的有点记不清了,不过在这种调整后不再成为障碍。
同样把修改后的包传上来,包含了上次对admin servlet 的修正。
这种方式还有另外一个小问题,就是在使用AdminServlet查看时,能看到明码的用户名和密码。
最近有点时间,修正了这个bug,
原始代码如下
/** ProxoolDataSource.java **/
private Properties delegateProperties = new Properties();
private synchronized void registerPool() throws ProxoolException {
if (!ConnectionPoolManager.getInstance().isPoolExists(alias)) {
ConnectionPoolDefinition cpd = new ConnectionPoolDefinition();
//这句应该挪到这儿
//cpd.setDelegateProperties(delegateProperties);
cpd.setAlias(getAlias());
cpd.setDriver(getDriver());
...
cpd.setPassword(getPassword());
...
cpd.setUrl(getDriverUrl());
cpd.setUser(getUser());
...
//***就是这一句**//
cpd.setDelegateProperties(delegateProperties);
...
}
}
/** ConnectionPoolDefinition.java **/
private Properties delegateProperties = new Properties();
public void setUser(String user) {
setDelegateProperty(USER_PROPERTY, user);
}
public void setDelegateProperty(String name, String value) {
connectionPropertiesChanged = true;
getDelegateProperties().setProperty(name, value);
}
public Properties getDelegateProperties() {
return delegateProperties;
}
/**DefaultConnectionBuilder.java **/
//最终的创建语句
public Connection buildConnection(ConnectionPoolDefinitionIF cpd) throws SQLException {
Connection realConnection = null;
final String url = cpd.getUrl();
Properties info = cpd.getDelegateProperties();
return DriverManager.getConnection(url, info);
}
代码中我们看到registerPool中,
先解析了基本属性并给ConnectionPoolDefinition赋值,赋值的最终结果是写入ConnectionPoolDefinition的delegateProperties属性,
但是最后一句cpd.setDelegateProperties(delegateProperties);却覆盖了之前的所有工作。也就是说如果没有采用delegateProperties方式配置,那他就是空的,
所以最后创建连接时,真正起作用的配置只有一个就是url。
我的修正方式是把cpd.setDelegateProperties(delegateProperties);提前,这种做法在此种配置方式下成功,虽然没有做专门的测试,但是用在我目前的项目中暂时没有发现问题。
但是这两种做法导致了参数不同配置方式的优先级不同,也许在其他配置方式中可能会出现问题。
至于不设置user属性出现空指针的问题,好像是因为通用的属性解析方式导致的,具体的有点记不清了,不过在这种调整后不再成为障碍。
同样把修改后的包传上来,包含了上次对admin servlet 的修正。
上一篇: 图的DFS和BFS的C++实现
下一篇: 搜索--20