【问题标题】:Setting connection timezone with Spring and DBCP and MySQL使用 Spring 和 DBCP 和 MySQL 设置连接时区
【发布时间】:2011-08-23 16:07:46
【问题描述】:

我的环境

  • Java 5
  • 春季 2.5.5
  • DBCP 数据源 (org.apache.commons.dbcp.BasicDataSource)
  • MySQL

类似帖子

链接

我的问题

  • 我需要在我的连接上设置时区,以防止在处理 TIMESTAMP 列时发生转换。

我的想法/研究

  • DBCP 连接池未提及时区周围的任何内容。 LINK

  • THIS 帖子中描述了我调查并认为没问题的内容,例如:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="URL" value="${database.url}" /> 
    <property name="user" value="${database.username}" /> 
    <property name="password" value="${database.passwd}" /> 
    <property name="connectionCachingEnabled" value="true"/>
    <property name="sessionTimeZone" value="GMT-3"/>
</bean>

求助区:)

  • 但这不起作用!!
  • 我这里想要的是一个简单的方法,优先使用Spring在jdbc连接上配置时区。

提前感谢任何帮助/提示/建议/知识分享


解决方案:

我的解决方案基于这篇文章中收集的提示!谢谢大家!

(...)
@Override
public Connection getConnection() {
    Connection conn = null;
    Statement statement = null;
    try {
        conn = super.getConnection();
        statement = conn.createStatement();
        statement.execute("SET time_zone = \'" + timezone+"\'");
    } catch (SQLException e) {
        LOG.fatal("Error while SET time_zone", e);
    } finally {
        try {
            statement.close();
        } catch (SQLException e) {
            LOG.warn("Error while closing statement", e);
        }
    }
    if(LOG.isDebugEnabled())
        LOG.debug("SET time_zone("+timezone+") for connection, succeed!");
    return conn;
}
(...)

在我的 Spring 配置文件中:

<bean id="dataSource" class="com.my.package.dbcp.TimezoneEnabledDataSource" destroy-method="close">
    (...)
    <property name="timezone" value="${database.timezone}" />
    (...)
</bean>

我希望这篇文章可以在将来对某人有所帮助。有任何问题请联系我!

【问题讨论】:

  • 您确定可以识别 GMT-3 吗?例如,您是否尝试过America/Los_Angeles(为了测试)
  • 我会不断更新我的帖子,提供我所有的发现!我刚刚放弃寻找有关 DBCP 配置的信息!
  • @Bozho,我会在几个小时内再次检查我不是@home,但作为同行,我提到错误的链接是抱怨属性(无效属性'sessionTimeZone'),而不是物有所值。

标签: java mysql spring jdbc timezone


【解决方案1】:

可能的解决方案之一:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="URL" value="${database.url}?serverTimezone=America/Los_Angeles" /> 
    <property name="user" value="${database.username}" /> 
    <property name="password" value="${database.passwd}" /> 
    <property name="connectionCachingEnabled" value="true"/>
    <property name="sessionTimeZone" value="GMT-3"/>
</bean>

【讨论】:

    【解决方案2】:

    BasicDataSource 中没有“sessionTimeZone”成员。使用 C3P0,它是一个比 DBCP“更好”的连接池,甚至更好,如果您在 Java EE Web 服务器中,使用它来初始化 JNDI 数据源;)

    【讨论】:

    • 您好 Treydone,感谢您的帮助。我在某处看到可以使用 C3P0 进行配置,但我不知道是否是一个选项,请记住这是一个非常坚固的庞大系统。但我会寻找你的解决方案!
    • 有趣的是,C3P0 数据源中也没有 sessionTimeZone 或等效成员...
    【解决方案3】:

    您应该能够将相同的 SQL 语句放在 DBCP 配置元素的 initConnectionSqls 属性中。只需将其添加到 DBCP 配置元素中

    <property name="initConnectionSqls" value="SET time_zone = '${database.timezone}'"/>
    

    根据您的 DBCP 版本,您可能必须使用 connectionInitSqls 作为属性名称。此信息直接来自 DBCP configuration 文档。

    【讨论】:

    • 对于 Oracle,查询可能是:alter session set time_zone= ''${database.timezone}
    【解决方案4】:

    如果数据源没有这样的属性,你可以扩展它并添加该属性:

    public TimezoneEnabledDataSource extends BasicDataSource {
        private String timezone;
        //getter and setter for it
    
        @Override    
        public Connection getConnection() {
            Connection c = super.getConnection();
            // execute a query: SET time_zone = '-8:00'
            return c;
        }
    }
    

    查询详情请看这里http://www.electrictoolbox.com/mysql-set-timezone-per-connection/

    MySQL documentation writes:

    每个连接的时区。每个连接的客户端都有自己的时区设置,由会话 time_zone 变量给出。最初,会话变量从全局 time_zone 变量中获取其值,但客户端可以使用以下语句更改自己的时区:

    mysql> SET time_zone = timezone;

    你也可以检查c3p0是否没有内置的东西。

    【讨论】:

    • @Bozho,这看起来像一个解决方案!!!我会花一些时间在这上面!做这种解决方法有没有发现什么问题!?
    • 这是我的想法。我实际上没有看到问题,但我没有在生产中使用它;)
    • 我认为在多线程环境中定义数据库中的某些属性不是一个好主意:S
    • @Treydone 我不明白你的评论。我认为查询设置每个连接的时区,而不是全局的(至少那是文章声称的)
    • @Treydone 您对此有何担忧?我断言当使用时间戳列时,由于时区不同,MySQL 不会更改我的日期。认为 MySQL 将始终在 UTC 启动。
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2013-05-28
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多