【问题标题】:Lazarus + Postgres: incomplete startup packetLazarus + Postgres:不完整的启动包
【发布时间】:2014-03-06 11:07:18
【问题描述】:

我一直在使用 Postgresql 在后端构建一个 Lazarus Pascal 程序。它曾经与以下几行一起正常工作以打开数据库。

  dbConn:= TPQConnection.Create(nil);
  dbConn.HostName := 'localhost';
  dbConn.DatabaseName:= 'dbHRS';
  dbconn.UserName:='mizk';
  dbConn.Password:='123';
  dbConn.Open;
    if dbConn.Connected Then
       OpenHRSDB := true
    else
        OpenHRSDB := False;

但当我从 localhost 更改为服务器的 IP(在 LAN 上)时,程序就会停止。没有错误或警告。我不知道发生了什么。

以下是一些可能有助于缩小问题范围的相关细节。

  1. 我正在运行的程序来自与服务器位于同一 LAN 的工作站。
  2. 两台机器都运行 Ubuntu 12.04 Desktop
  3. 我可以使用 PGAdmin III 访问服务器上的 postgres 数据库,所以我猜这不是防火墙问题。
  4. 我已允许来自 ufw 的 postgresql 并且 ufw 已禁用。
  5. 奇怪的是,当防火墙被禁用时,我可以使用工作站从终端对服务器进行 SSH 连接。但是当它启用时,我不能

我现在最担心的是为什么 Pascal 程序在给出 IP 号码时无法运行,以及 postgres 日志中的消息是什么。

非常感谢任何输入。谢谢!

编辑:这里有更多信息:

文件 postgresql.conf 包含以下几行:

listen_addresses = '*'
端口 = 5430

很抱歉...这是打开连接日志记录后的正确日志。 在我关闭、重新启动并运行我的程序后,日志文件包含以下内容:

2014-03-06 18:28:23 IST LOG:数据库系统于 2014-03-06 18:28:22 IST 关闭 2014-03-06 18:28:23 IST LOG:收到连接:主机=[本地] 2014-03-06 18:28:23 IST LOG:不完整的启动包 2014-03-06 18:28:23 IST LOG:数据库系统已准备好接受连接 2014-03-06 18:28:23 IST LOG:autovacuum 启动器启动 2014-03-06 18:28:24 IST LOG:收到连接:主机=[本地] 2014-03-06 18:28:24 IST LOG:连接授权:用户=postgres 数据库=postgres 2014-03-06 18:28:24 IST LOG:收到连接:主机=[本地] 2014-03-06 18:28:24 IST LOG:连接授权:用户=postgres 数据库=postgres 2014-03-06 18:28:25 IST LOG:收到连接:主机=[本地] 2014-03-06 18:28:25 IST LOG:连接授权:用户=postgres 数据库=postgres 2014-03-06 18:28:29 IST LOG:收到连接:主机=[本地] 2014-03-06 18:28:29 IST LOG:启动包不完整

【问题讨论】:

  • 不确定您提到的观点是否涵盖了这一点,但是服务器实例上的服务器参数"listen_addresses" 呢?默认情况下,这是 localhost(当您使用它时,还要检查端口)
  • @DrColossos 是的,listen_addresses 设置为“*”。否则 PGAdmin III 将无法工作。
  • 那么pg_hba文件呢?那里的所有条目也都正确吗?也许 pgAdmin 连接到系统的方式与您的脚本不同?
  • @DrColossos 是的,我已经正确地允许了我所有的 IP 号码。很抱歉我没有在问题中提到这两个:/
  • 请在postgresql.conf开启连接登录后显示PostgreSQL日志文件中的相关行。

标签: postgresql ubuntu-12.04 remote-access remote-server lazarus


【解决方案1】:

当我找到这个谈论 PORT 的链接时,我意识到缺少一些东西: http://lists.lazarus.freepascal.org/pipermail/lazarus/2009-August/044403.html

所以我在我的代码中加入了以下行来连接: dbConn.Params.Text := 'port=5430';

我不确定这是否是执行此连接字符串的最正确方法,因为我认为连接字符串中可能还有其他参数也被使用,并且上述方法可能会覆盖这些参数。出于这个原因,我把它作为第一行。

所以这个方法对我有用。

我还尝试了另一种方法,但它对我不起作用。那就是使用append方法(dbConn.Params.Append)

我还发现参数是区分大小写的,我不得不写'port'('Port'不起作用)。

【讨论】:

  • 您可以尝试在主机名部分指定端口,例如dbConn.HostName := 'yourhost:5430';不知道这是否适用于 postgresql 驱动程序,但适用于许多其他数据库驱动程序。
  • +1 host=a user=x 因“启动数据包不完整”而失败,host=a port=5432 user=x 工作
猜你喜欢
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多