为了载入附加的功能或者达到提高性能的目的,可用多个设置来预先载入共享库到服务器中。例如'$libdir/mylib'设置可能会导致mylib.so(或者某些平台上的mylib.sl)从安装的标准库目录被预装载。这些设置之间的区别在于生效的时间以及改变它们所需的特权。
可以用这个方法预装载TeleDB的过程语言库,通常是使用'$libdir/plXXX'语法,其中的XXX是pgsql、perl、tcl或python。
只有特别为与TeleDB一起使用设计的共享库才能以这种方式载入。每一个TeleDB支持的库都有一个“魔法块”,它会被检查以保证兼容性。由于这个原因,非TeleDB无法以这种方式被载入。你可能可以使用操作系统的工具(如LD_PRELOAD)载入它。
总之,请参考特定模块的文档来用推荐的方法载入它。
local_preload_libraries (string)
这个变量指定一个或者多个要在连接开始时预载入的共享库。它包含逗号分隔的库名称列表,其中每个名称都被解释为LOAD命令。项之间的空白被忽略;如果需要在名称中包含空格或逗号,请用双引号括住库名。这个参数在连接启动时起作用,对后续更改没有影响。 如果指定的库没有找到,连接尝试将会失败。任何用户都能设置这个选项。正因为如此,能被这样载入的库被严格限制为出现于安装的标准库目录中plugins子目录下的共享库(保证只有“安全的”库被安装到 这里是数据库管理员的责任)。local_preload_libraries中的项可以显式 指定这个目录,例如libdir/plugins/mylib,或者只是指定库的名称— mylib 和 libdir/plugins/mylib的效果是相同的。这个功能的目的是允许非特权用户加载调试或性能测量库到特定会话, 而不需要显式的LOAD命令。为达到此目的,典型的使用PGOPTIONS环境变量或使用ALTER ROLE SET设置这个参数。除非一个模块被特别设计成由非超级用户以这种方式使用,通常不推荐使用这个设置。应该看看 session_preload_libraries。
session_preload_libraries (string)
这个变量指定一个或者多个要在连接开始时预载入的共享库。它包含逗号分隔的库名称列表,其中每个名称都被解释为LOAD命令。项之间的空白被忽略; 如果需要在名称中包含空格或逗号,请用双引号括住库名。 这个参数只在连接开始时起效。后续的改变没有效果。如果指定的库没有找到,连接尝试将会失败。只有超级用户更够更改这个设置。这个特性的意图是允许在特定会话中载入调试用的或者测量性能的库,而不需要显式的给出一个 LOAD命令。例如,通过用ALTER ROLE SET设置这个参数可以 为一个给定用户名下的所有会话启用auto_explain。还有,无需重启 服务器就能更改这个参数(但是只有新会话启动时才会生效),这样可以以这种方式更容易地增加新模块,即便它们会应用到所有会话。和shared_preload_libraries不同,相对于在库被第一次使用时载入它,在会话开始时载入库并没有什么性能优势。不过,当使用连接池时这样做还是有一些优势。
shared_preload_libraries (string)
这个变量指定一个或者多个要在服务器启动时预载入的共享库。它包含逗号分隔的库名称列表,其中每个名称都被解释为LOAD命令。项之间的空白被忽略;如果需要在名称中包含空格或逗号,请用双引号括住库名。这个参数只能在服务器启动时设置。如果指定的库没有找到,服务器将无法启动。有些库需要执行只能在postmaster启动时发生的特定操作,例如分配共享内存、保留轻量级锁 或者启动后台工作者。这些库必须通过这个参数在服务器启动时载入。其他库也能被预载入。通过预载入一个共享库,当该库被第一次使用时就可以避免库的启动时间。不过,启动每个新服务器进程的时间可能会略有增加,即使该进程从不使用该库。因此,推荐只把这个参数用于那些要在大多数会话中使用的库上。还有,改变这个参数要求重启服务器,因此对于短期的调试任务来说这不是好的选择,应该转用 session_preload_libraries。注意在 Windows 主机上,在服务器启动时预载入一个库并不会减少启动每个新服务器进程所需的时间;每一个服务器进程将会重新载入预载入的库。不过,对于那些要在postmaster启动时执行操作的库来说,Windows 主机上的 shared_preload_libraries任然有用。