使用 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 和 DBCP 处理 JDBC 连接的正确方法是啥?
Springboot+mybatis+dbcp+mysql简单集成