0

是否可以使用 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();
4

0 回答 0