【问题标题】:Enable PostgreSQL extensions in JDBC在 JDBC 中启用 PostgreSQL 扩展
【发布时间】:2015-08-02 19:48:20
【问题描述】:

我正在使用 Spring + Tomcat8 和 PostgreSQL 9.2。 我在数据库上安装了Trigram 扩展以改进表中的搜索。

当我手动连接到我的数据库时,以下语句有效:

SELECT id, name, similarity(name, 'a') FROM dev.customer WHERE name % 'a' ORDER BY similarity ;

但是,当我在 Spring 中使用 jdbcTemplate.query() 尝试此操作时,出现错误:

PSQLException: ERROR: function similarity(character varying, character varying) does not exist

当我删除 similarity() 函数并仅使用 % 运算符时,我得到以下异常:

ERROR: operator does not exist: character varying % character varying

好像需要配置postgres jdbc驱动才能支持非标准语法:https://jdbc.postgresql.org/documentation/81/ext.html

我的 tomcat 安装的server.xml 包含以下资源:

<Resource name="jdbc/NasPostgresDB" auth="Container" type="javax.sql.DataSource"
          username="usr" password="pwd"
          url="jdbc:postgresql://127.0.0.1/dbname"
          driverClassName="org.postgresql.Driver"
          initialSize="5" maxWait="5000"
          maxActive="120" maxIdle="5"
          validationQuery="select 1"
          poolPreparedStatements="true"/>

应该是正确的:https://jdbc.postgresql.org/documentation/81/load.html

我需要做什么才能使三元组匹配起作用?

【问题讨论】:

  • 您是否 100% 确定您正在使用同一个用户连接到同一个数据库?
  • @RadekPostołowicz 是的,我是。我目前只有一个数据库和一个用户。
  • 你能发布两次select current_database(), current_schema(), current_schemas(true), current_user, inet_client_addr(), inet_client_port(), inet_server_addr(), inet_server_port(), pg_my_temp_schema(), pg_postmaster_start_time(), session_user, version(); 执行的结果吗:一次在 psql 中,一次来自应用程序的 java 代码?
  • @RadekPostołowicz 结果来自 psql"sapling , , {pg_catalog} , postgres , 192.168.0.13 , 20290 , 192.168.0.3 , 5432 , 0 , "2015-05-21 12:00:20.422757+02" , postgres , "PostgreSQL 9.1.15 on x86_64-unknown-linux-gnu , compiled by gcc (Debian 4.7.2-5) 4.7.2 , 64-bit"" 结果来自 javasapling , , {pg_catalog} , postgres , 192.168.0.13 , 19955 , 192.168.0.3 , 5432 , 0 , "2015-05-21 12:00:20.422757+02" , postgres , "PostgreSQL 9.1.15 on x86_64-unknown-linux-gnu , compiled by gcc (Debian 4.7.2-5) 4.7.2 , 64-bit"
  • 我正在使用来自 postgres HP 的 JDBC41 Postgresql Driver, Version 9.4-1201 驱动程序:jdbc.postgresql.org/download.html

标签: spring postgresql tomcat jdbc


【解决方案1】:

在 PostgreSQL 中,每个对象(无论是表、索引还是函数)都属于一个模式。正如您在评论中所说,您使用以下方式安装了扩展:

SET SCHEMA 'dev'; CREATE EXTENSION pg_trgm;

我假设这些函数可以在 dev shema 中访问。

如果是这样,您应该可以在 JDBC 中以这种方式使用它们:

SELECT id, name, dev.similarity(name, 'a') as similarity FROM dev.customer 
    WHERE name % 'a' ORDER BY similarity ;

【讨论】:

  • 谢谢!相似性函数有效。 % 运算符却没有。有没有办法在全球范围内启用扩展?如果没有,% 运算符应该如何工作?
  • 使用ALTER EXTENSION pg_trgm SET SCHEMA pg_catalog; 在任何地方使用它而不引用架构dev。这也将解决您使用% 运算符的问题。
  • 最好不要使用alter user ... set search_path = ... 在默认搜索路径中包含包含扩展名的架构
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 2022-10-13
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多