3

我的要求如下:

  1. 一旦应用程序启动 PostgreSQL 服务将由应用程序启动
  2. 一旦应用程序关闭,PostgreSQL 服务将被应用程序关闭
  3. ...所以我将负责 PostgreSQL 设置、运行脚本和启动服务等

我目前的做法是:

  1. 当我在新进程中启动 PostgreSQL 时,我正在重定向RedirectStandardErrorRedirectStandardOutput,它是静默启动,用户看不到命令​​窗口等

问题是,

  • 当我对此进行编码时,我寻找消息字符串并且只支持英语。换句话说,我曾经在其中查找字符串successRedirectStandardOutput但现在我们支持多种语言,因此比较失败。

有什么方法可以查明 PostgreSQL 设置是否已成功启动并且 PostgreSQL 服务是否正在运行?

我通过在单独的进程中调用 pg_ctl.exe 来启动 PostgreSQL。

4

5 回答 5

4

(我们正在做类似的事情)您Postgres使用此批处理文件为服务加注星标

"C:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exe"  -D "C:\Program Files\PostgreSQL\9.0\data" start

和 [停止] 服务

"C:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exe"  -D "C:\Program Files\PostgreSQL\9.0\data" stop

您可以从哪里C:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exe获得您的安装位置PostgreSQl

    HKEY_LOCAL_MACHINE\SOFTWARE\PostgreSQL\Installations\postgresql-9.0

现在在运行批处理文件以检查服务是否确实在运行时,您可以使用进程运行中的此代码 检查postgres.exe它是否正在运行。

另外 1.检查 Windows 应用程序是否正在运行 2.我如何知道如果进程正在运行

  public bool IsProcessOpen(string name)
    {
 //here we're going to get a list of all running processes on
 //the computer
 foreach (Process clsProcess in Process.GetProcesses()) {
    //now we're going to see if any of the running processes
    //match the currently running processes. Be sure to not
    //add the .exe to the name you provide, i.e: NOTEPAD,
    //not NOTEPAD.EXE or false is always returned even if
    //notepad is running.
    //Remember, if you have the process running more than once, 
    //say IE open 4 times the loop thr way it is now will close all 4,
    //if you want it to just close the first one it finds
    //then add a return; after the Kill
    if (clsProcess.ProcessName.Contains(name))
    {
        //if the process is found to be running then we
        //return a true
        return true;
    }
}
//otherwise we return a false
return false;
}
于 2012-06-06T06:36:42.227 回答
2

启动一个数据库连接,如果它工作,PostgreSQL 正在运行。如果没有,那就是出了点问题。

于 2012-06-06T05:45:32.020 回答
1

您正在尝试将 PostgreSQL 用作嵌入式数据库,以便与用户完全不可见的应用程序捆绑在一起。

这不会很好地工作。PostgreSQL 并非设计为以这种方式工作,它显示:

  • postmaster 期望作为由 pg_ctl 产生的服务或守护进程运行,而不是其他东西的子进程。它旨在在其父进程终止后仍然存在,这不是您在嵌入时想要的。

  • 当然,没有办法将 PostgreSQL 嵌入到可执行文件中或将其作为库加载。

  • postmaster 没有带外管理接口;所有管理都是通过 SQL 级别的连接或通过配置文件和日志完成的。也许这是一个缺陷;如果有一个简单的管理 API,它使用简单的进程间通信(例如,Pg 的共享内存)来查询 postmaster 状态,而不需要工作的 TCP 连接和数据库引擎,这可能会很好。现在,没有这样的东西存在,对于 PostgreSQL 的预期用例,没有强烈的论据来创建它,因为如果 PostgreSQL 不启动安装它的管理员应该修复它。

  • 在 Windows 上,PostgreSQL 仅支持通过 TCP/IP 进行通信,为此它需要一个在主机范围内唯一的端口。如果您可能同时运行多个程序实例并希望它们是独立的,那将无法正常工作。

做你想做的事是可能的,只是烦人和困难,因为 PostgreSQL 不是为用作嵌入式数据库而设计的。

我真的很想看到一个用于 PostgreSQL 的低级诊断/状态客户端,它可以使用与 postmaster 一起传递的共享内存消息来向 postmaster 询问简单的状态报告。这对于诊断安装问题非常有用,尤其是在所有损坏的 Windows 机器上。

在与 pgsql-hackers 团队讨论并提交补丁到 commitfest 之后,也许您会考虑对您需要的功能进行原型设计?PostgreSQL 是开源的,因此如果您愿意实现它们并且能够说服其他人相信它们应该被包括在内,那么您可能会获得您需要添加的功能。

于 2012-06-06T11:25:40.310 回答
0

使用ServiceController类启动/停止服务。

于 2012-06-06T06:03:23.937 回答
0

链接这将对您有所帮助。在此之前检查您的数据库连接。或启动/停止 IIS 服务器(如果正在运行)

于 2012-06-06T06:44:01.583 回答