是否可以使用 Java 中的通用连接池 (UCP) 为 postgresql 创建连接池。你能提供任何示例java代码吗?
我尝试了以下代码片段:
pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName(PGPoolingDataSource.class.getName());
pds.setURL(cachedUrl); // Connection URI
pds.setUser(userName); // Username for database user
pds.setPassword(password);
但它因 SQLException 而失败
java.sql.SQLException:无法设置数据源名称:java.lang.reflect.InvocationTargetException。
不确定我是否遗漏了代码中的任何内容。
有一个更新:我通过添加一个唯一的数据源名称来修复上面的问题,如下所示:
pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName(PGPoolingDataSource.class.getName());
pds.setURL(cachedUrl); // Connection URI
pds.setUser(userName); // Username for database user
pds.setPassword(password);
pds.setDataSourceName("MyDS");
Connection conn = pds.getConnection();
但是遇到一个不同的问题,即使设置了 URL,它也会尝试连接到默认的 localhost:5432 并且连接失败,因为我的 postgresql 不在我的 localhost 中。任何线索为什么它不采用 setURL 方法中提供的 URL?
更新:我们需要将 URL 添加为连接属性而不是直接数据源属性。postgres 的 JDBC 驱动程序被配置为使用一个定义了数据源类的 PGPolingDataSource。
定义数据源类时,连接 url 必须通过连接属性而不是连接 url 传递。更新后的代码如下:
pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName(PGPoolingDataSource.class.getName());
pds.setConnectionFactoryProperty(PoolDataSource.UCP_URL, cachedUrl);
// pds.setURL(cachedUrl); // Connection URI
pds.setUser(userName);
pds.setPassword(password);
pds.setDataSourceName("MyDS");
Connection conn = pds.getConnection();