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

Java 使用Spring、DBCP和MySQL设置连接时区,java,mysql,spring,jdbc,timezone,Java,Mysql,Spring,Jdbc,Timezone,我的环境 爪哇5 弹簧2.5.5 DBCP数据源(org.apache.commons.DBCP.BasicDataSource) MySQL 类似帖子 链接 我的问题 我需要在连接上设置时区,目的是在处理时间戳列时防止转换 我的想法/研究 DBCP连接池并没有提到任何关于时区的内容 我调查并认为可以的内容在帖子中描述,举例说明如下: 请求帮助区域:) 但这是行不通的 这里我想要的是一种简单的方法,优先使用Spring在jdbc连接上配置时区 提前感谢您提供的任何

我的环境

  • 爪哇5
  • 弹簧2.5.5
  • DBCP数据源(org.apache.commons.DBCP.BasicDataSource)
  • MySQL
类似帖子

链接

我的问题

  • 我需要在连接上设置时区,目的是在处理时间戳列时防止转换
我的想法/研究

  • DBCP连接池并没有提到任何关于时区的内容

  • 我调查并认为可以的内容在帖子中描述,举例说明如下:


请求帮助区域:)

  • 但这是行不通的
  • 这里我想要的是一种简单的方法,优先使用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>

(...)
(...)

我希望这篇文章能对将来的人有所帮助。任何问题都让我吃惊

如果数据源没有这样的属性,可以对其进行扩展并添加该属性:

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;
    }
}
有关查询详细信息,请参见此处

:

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

mysql>设置时区=时区


您还可以检查是否没有内置内容。

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

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

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


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

可能的解决方案之一:

<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>


您确定GMT-3已被识别吗?你有没有试过美国/洛杉矶例如(为了测试),我会不断更新我的帖子和我的发现!我刚刚放弃寻找有关DBCP配置的信息@Bozho,我会在几个小时内再次检查我不是@home,但作为对等链接,我提到的错误是抱怨属性(无效属性“sessionTimeZone”),而不是它的值。嗨,Treydone,谢谢你的帮助。我看到了可以使用C3P0配置的地方,但我不知道这是否是一个选项,记住这是一个非常坚固的庞大系统。但我会找到你的解决办法!有趣的是,C3P0数据源中也没有sessionTimeZone或等效成员…@Bozho,这看起来像个解决方案!!!我会集中一些时间在这上面!你认为这样做有什么问题吗!?这是从我的头顶传来的。我实际上没有看到问题,但我还没有在生产中使用它;)我认为在多线程环境中定义数据库中的某些属性不是一个好主意:S@Treydone我不明白你的评论。我认为查询设置了每个连接的时区,而不是全局的(至少这是文章声称的)@Treydone您对此有什么担心?我断言,当使用时间戳列时,MySQL不会因为时区不同而更改我的日期。认为MySQL将始终在UTC启动。对于Oracle,查询可以是:alter session set time_zone=''${database.timezone}