一直以来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 的修正。
分享到:
相关推荐
Proxool是Apache软件基金会的一个项目,它提供了一个轻量级、高效的数据库连接池解决方案,能有效地管理和优化数据库连接资源,提高应用系统的性能和稳定性。 在描述中提到了三个特定的jar包: 1. **proxool-cglib....
在使用过程中,你需要正确配置Proxool的属性,比如数据库URL、用户名、密码、最大连接数等,以确保连接池能够满足你的应用需求。同时,根据项目需求,选择合适的日志实现,并配置 Commons Logging 来控制日志输出的...
使用Proxool时,开发者首先需要在应用程序中配置Proxool,包括指定数据库驱动、URL、用户名和密码等信息。然后,通过Proxool提供的API创建连接池,并在需要时从池中获取数据库连接。当不再需要连接时,应将其返回给...
示例中的XML配置展示了如何配置基本的Hibernate连接信息,如JDBC驱动、数据库URL、用户名、密码、字符编码,以及显示SQL语句和指定方言等。但是,连接池相关的配置并未在示例中展示,实际使用时需要额外添加。 8. ...
配置连接池时,开发者需要设置一系列属性,如JDBC驱动类、数据库URL、用户名、密码,以及连接池特定的属性,例如最小连接数、最大连接数、超时时间等。下面是一个使用C3P0连接池的配置示例: ```xml ...
- `connection.*`属性用于设置数据库连接信息,包括驱动类、用户名、密码和URL。 - 接下来是C3P0连接池的具体配置: - `c3p0.max_size`设定连接池的最大连接数,这里是2。 - `c3p0.min_size`设定最小连接数,也...
在Hibernate中配置连接池时,还需要配置其他数据库相关的属性,如JDBC驱动类(`connection.driver_class`)、数据库用户名(`connection.username`)、密码(`connection.password`)以及数据库URL(`connection.url`)等。...
在开发过程中,可以通过多种方式参与到Hibernate社区中,例如提交bug报告、提出改进意见或贡献代码等。社区的活跃成员还包括Hibernate团队和JBoss视觉设计团队。 #### 三、入门指南 ##### 1. 数据库访问 ###### ...