使用 Spring 和 DBCP 和 MySQL 设置连接时区

Posted

技术标签:

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

我的环境

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

类似帖子

Setting session timezone with spring jdbc oracle

链接

http://www.mysqlfaqs.net/mysql-faqs/General-Questions/How-to-manage-Time-Zone-in-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'),而不是物有所值。 【参考方案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 启动。

以上是关于使用 Spring 和 DBCP 和 MySQL 设置连接时区的主要内容,如果未能解决你的问题,请参考以下文章

Spring集成JDBC

使用 Spring 和 DBCP 处理 JDBC 连接的正确方法是啥?

Springboot+mybatis+dbcp+mysql简单集成

spring配置DBCP数据连接

Spring DBCP用xml和properties2种格式配置DataSource

DBCP基本配置和重连配置+spring中配置