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}