PGJDBC:无法从客户端接收数据:

时间:2018-08-17 14:08:22

标签: java postgresql events pg-jdbc

尊敬的StackOverFlowers,

我正在Postgres 9.6(Windows 10)上尝试事件驱动的LISTENER / NOTIFY。

我遵循了史蒂夫·泰勒(Steve Taylor)在https://www.openmakesoftware.com/postgresql-listen-notify-events-example/给出的PGJDBC示例。

我从下载pgjdbc-ng-0.7-complete.jar开始,并将其替换为标准JDBC驱动程序放在CLASSPATH中。

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

已收到连接:host = 127.0.0.1 port = 50325

授权连接:user = postgres database = scott

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

这是我的系统变量:

DBHost:本地主机

DBName:斯科特

DBPort:5432

DBUserName:postgres

DBPassword:postgres

我没有越过第一步,休息看起来像珠穆朗玛峰。请帮我。如果您需要代码,我将遵循Steve的代码同上。

根据Joseph Larson的回答,数据库始终处于运行状态。我已经从PGADMIN和Java成功连接到Postgres数据库。我认为问题在于连接字符串。在Java中,当我使用Postgres提供的标准JDBC时,我在使用URL,例如jdbc:postgresql:// localhost:5432 / dbname,但是PGJDBC建议使用其他连接字符串,例如JDBC:PGSQL:// localhost:5432 / dbname。我试图用该字符串连接(强制),但没有用。 PGJDBC PGDataSource中没有直接提供URL的方法。我必须经历:

dataSource.setHost(DBHost);

dataSource.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();
}
}                             

2 个答案:

答案 0 :(得分:1)

这看起来像pgjbdc-ng中的Windows locale bug。已解决,请尝试最新版本0.8.1

最新版本具有与异步通知here相关的详细文档。

如果仍然无法在Windows系统上执行,请创建问题here

答案 1 :(得分:0)

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

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

如果要连接,则问题可能是:

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

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