与编码相关的数据库连接错误

时间:2014-10-06 16:06:01

标签: java spring hibernate postgresql encoding

我有Spring + Hibernate申请。

我使用PostgreSQL作为数据存储。

应用程序编译良好,但当我将其部署到Tomcat并启动它时,我看到以下堆栈跟踪:

  INFO : org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'
    WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 28P01
    ERROR: org.hibernate.util.JDBCExceptionReporter - ?????: ???????????? "my_db" ?? ?????? ???????? ??????????? (?? ??????)
    WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 28P01
    ERROR: org.hibernate.util.JDBCExceptionReporter - ?????: ???????????? "my_db" ?? ?????? ???????? ??????????? (?? ??????)
    ERROR: org.springframework.web.context.ContextLoader - Context initialization failed
    org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:597)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417)
    .....
    Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
    ....
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:556)
    ... 57 more
    Caused by: org.postgresql.util.PSQLException: ?????: ???????????? "my_db" ?? ?????? ???????? ??????????? (?? ??????)
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
    at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
    at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
    at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
    at org.postgresql.Driver.makeConnection(Driver.java:393)
    ...
    ... 62 more

在另一台PC上,此应用程序启动良好。区别:区域设置。工作PC有英语,但另一种 - 不是。

请帮助找出问题的原因。

更新

看起来数据库不了解密码:

从:PostgreSQL Error Codes

  

28P01 INVALID PASSWORD invalid_password

更新

我不知道问题的原因,但数据库重新创建后问题就消失了。

1 个答案:

答案 0 :(得分:1)

这是PostgreSQL版本3协议的一个已知问题,其中客户端不知道编码以解码服务器在协议握手早期发送的错误消息。

在生成版本4协议时将会修复,但还有很长的路要走。

同时,唯一真正的解决方法是确保客户端的默认编码与服务器兼容。最简单的方法是将LC_MESSAGES设置为en_US.UTF-8,可能通过lc_messages中的postgresql.conf选项。