`
laowang
  • 浏览: 38096 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
一直以来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 的修正。
分享到:
评论
1 楼 flyfan 2008-07-23  
太好了,又解决一个问题,楼主真是强人

相关推荐

    proxool相关jar包

    Proxool是Apache软件基金会的一个项目,它提供了一个轻量级、高效的数据库连接池解决方案,能有效地管理和优化数据库连接资源,提高应用系统的性能和稳定性。 在描述中提到了三个特定的jar包: 1. **proxool-cglib....

    proxool-0.9.1.jar commons-logging.jar

    在使用过程中,你需要正确配置Proxool的属性,比如数据库URL、用户名、密码、最大连接数等,以确保连接池能够满足你的应用需求。同时,根据项目需求,选择合适的日志实现,并配置 Commons Logging 来控制日志输出的...

    proxool-0.9.1.zip

    使用Proxool时,开发者首先需要在应用程序中配置Proxool,包括指定数据库驱动、URL、用户名和密码等信息。然后,通过Proxool提供的API创建连接池,并在需要时从池中获取数据库连接。当不再需要连接时,应将其返回给...

    HIbernate连接池配置总结基于第三方c3p0和proxool

    示例中的XML配置展示了如何配置基本的Hibernate连接信息,如JDBC驱动、数据库URL、用户名、密码、字符编码,以及显示SQL语句和指定方言等。但是,连接池相关的配置并未在示例中展示,实际使用时需要额外添加。 8. ...

    hibernate连接池.doc

    配置连接池时,开发者需要设置一系列属性,如JDBC驱动类、数据库URL、用户名、密码,以及连接池特定的属性,例如最小连接数、最大连接数、超时时间等。下面是一个使用C3P0连接池的配置示例: ```xml ...

    Hibernate连接池的三种配置方式

    - `connection.*`属性用于设置数据库连接信息,包括驱动类、用户名、密码和URL。 - 接下来是C3P0连接池的具体配置: - `c3p0.max_size`设定连接池的最大连接数,这里是2。 - `c3p0.min_size`设定最小连接数,也...

    Hibernate 连接池的配置方式.doc

    在Hibernate中配置连接池时,还需要配置其他数据库相关的属性,如JDBC驱动类(`connection.driver_class`)、数据库用户名(`connection.username`)、密码(`connection.password`)以及数据库URL(`connection.url`)等。...

    Hibernate Developer Guide

    在开发过程中,可以通过多种方式参与到Hibernate社区中,例如提交bug报告、提出改进意见或贡献代码等。社区的活跃成员还包括Hibernate团队和JBoss视觉设计团队。 #### 三、入门指南 ##### 1. 数据库访问 ###### ...

Global site tag (gtag.js) - Google Analytics