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

一直以来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 的修正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值