欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决proxool必须把用户名和密码写在连接串里面的bug

程序员文章站 2022-05-24 08:47:33
...
一直以来proxool都存在这个bug,在Spring的"applicationContext.xml"中定义dataSource时,必须把用户名和密码写在连接串里面,ProxoolDataSource类提供的user,password属性没有用,无论提供什么,它都会以空用户名、密码去连接数据库,不过配置中的user,password两个属性还必须设置,否则会报空指针错误。
这种方式还有另外一个小问题,就是在使用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 的修正。