所以,我意识到数据库池可能有比 JDBC 更好的选择,但仍然有一些东西让我发疯。在所有示例代码中,他们建议像这样进行池化。
GenericObjectPool connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, un, pw);
PoolableConnectionFactory poolableConnectionFactory =
new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true);
PoolingDataSource dataSource = new PoolingDataSource(connectionPool);
return dataSource;
为什么要创建 PoolableConnectionFactory?它从未被使用过,从源代码来看,我看不出它实际上在构造函数中将任何东西联系在一起,或者除了设置它自己的私有(private)变量之外还做了任何神奇的事情。 JDBC 站点的信息相当神秘,我对源代码的所有挖掘都让我感到困惑。有理由这样做吗?显然,你也可以只用 new 实例化对象,而不实际将其分配给变量,这就足够了......让我更加困惑。
最佳答案
假设这些类是公共(public) DBCP 类,PoolableConnectionFactory
的构造函数将正在创建的实例注册为作为参数传递的池工厂:
_pool = pool;
_pool.setFactory(this);
因此,创建工厂会创建它,并使池在需要时使用它来创建新连接。
关于java - 为什么我们要创建 PoolableConnectionFactory 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11537213/