1

亲爱的 StackOverFlowers,

我在 Postgres 9.6(Windows 10)上尝试事件驱动的监听器/通知。

我遵循了 Steve Taylor 在https://www.openmakesoftware.com/postgresql-listen-notify-events-example/给出的 PGJDBC 示例。

我首先下载 pgjdbc-ng-0.7-complete.jar 并将其放入我的 CLASSPATH 替换标准 JDBC 驱动程序。

当我尝试使用 pgjdbc 驱动程序连接到 Postgres 数据库时,出现错误:

收到的连接:主机=127.0.0.1 端口=50325

连接授权:用户=postgres 数据库=scott

无法从客户端接收数据:现有连接被远程主机强行关闭。

这是我的系统变量:

数据库主机:本地主机

数据库名称:斯科特

数据库端口:5432

数据库用户名:postgres

数据库密码:postgres

我没有越过第一个障碍,休息看起来像珠穆朗玛峰。请帮我。如果您需要代码,我将按照史蒂夫的代码同上。

除了约瑟夫拉森的回答,数据库一直在运行。我已成功从 PGADMIN 和 Java 连接到 Postgres 数据库。我认为问题在于连接字符串。当我使用 Postgres 提供的标准 JDBC 时,从 Java 中使用类似 jdbc:postgresql://localhost:5432/dbname 的 URL,但 PGJDBC 建议使用不同的连接字符串,如 JDBC:PGSQL://localhost:5432/dbname。我试图(强制)连接该字符串,但它不起作用。PGJDBC PGDataSource 中没有直接提供 URL 的方法。我不得不经历:

数据源.setHost(DBHost);

数据源.setPort(5432);

dataSource.setDatabase(DBName);

dataSource.setUser(DBUserName);

dataSource.setPassword(DBPassword);

我无法弄清楚它发送到数据库的 URL 是什么。请建议我一个连接字符串,这个问题就解决了。

谢谢

非常感谢您要求我发布错误消息:

Exception in thread "main" java.lang.NullPointerException                                                
        at com.impossibl.postgres.system.BasicContext.loadLocale(BasicContext.java:294)                  
        at com.impossibl.postgres.system.BasicContext.init(BasicContext.java:273)                        
        at com.impossibl.postgres.jdbc.PGConnectionImpl.init(PGConnectionImpl.java:251)                  
        at com.impossibl.postgres.jdbc.ConnectionUtil.createConnection(ConnectionUtil.java:182)          
        at com.impossibl.postgres.jdbc.AbstractDataSource.createConnection(AbstractDataSource.java:723)  
        at com.impossibl.postgres.jdbc.PGDataSource.getConnection(PGDataSource.java:66)                  
        at com.impossibl.postgres.jdbc.PGDataSource.getConnection(PGDataSource.java:58)                  
        at PGListenNotify.<init>(PGListenNotify.java:26)                                                 
        at PGListenNotify.main(PGListenNotify.java:37)          

这是源代码:

import java.sql.SQLException;
import java.sql.Statement;

import com.impossibl.postgres.api.jdbc.PGConnection;
import com.impossibl.postgres.jdbc.PGDataSource;

public class PGListenNotify
{
PGConnection connection;

public PGListenNotify()
{
String DBHost = System.getenv("DBHost");
String DBName = System.getenv("DBName");
String DBUserName = System.getenv("DBUserName");
String DBPassword = System.getenv("DBPassword");
try
{
PGDataSource dataSource = new PGDataSource();
dataSource.setHost(DBHost);
dataSource.setPort(5432);
dataSource.setDatabase(DBName);
dataSource.setUser(DBUserName);
dataSource.setPassword(DBPassword);

connection = (PGConnection) dataSource.getConnection();
Statement statement = connection.createStatement();
}
catch (SQLException e)
{
e.printStackTrace();
}
}

public static void main(String[] args)
{
PGListenNotify ln = new PGListenNotify();
}
}                             
4

2 回答 2

1

看起来pgjbdc-ng. 已经解决了,试试最新版本0.8.1

最新版本在此处提供了与异步通知相关的详细文档。

如果它仍然无法在您的 Windows 系统上执行,请在此处创建问题。

于 2019-02-05T20:18:34.080 回答
0

你真的启动了数据库服务器吗?我不知道 PostgreSQL 服务器可以在 Windows 上运行,但我从未尝试过。

我会稍微简化你的问题。我对 Windows 上的 psql 一无所知,但在 Mac 上,我会启动服务器,然后使用 psql 命令(它是 PostgreSQL 的一部分)来确保服务器启动并运行。

如果您要连接,那么问题可能是:

- 根本没有服务器 - 服务器未在您尝试的端口上运行 - 服务器未在主机 127.0.0.1 上侦听连接,但可能正在侦听您机器的实际 IP 地址 -I' m 不确定该特定错误,但用户名、密码或数据库可能不存在。

我会使用 psql 来找出哪些可能的原因是真正的问题。这将您的程序隔离为问题的一部分,并且它完全成为管理您的数据库服务器之一。

于 2018-08-17T16:19:03.007 回答