使用Java和MySQL进行过期检测的简单介绍
本文目录:
- 1.Java处理mysql日期问题
- 2.JAVA连接mysql
- 3、谁遇到过Java连接MySQL数据库超时的问题?
java解决mysql日期问题
还能保存为util.date格式吗?是sql.date吧?
所以取出来就用sql.date获取就可以了
如果需要调整大小的话先转成字符串
JAVA连接mysql
查阅了Mysql文档,以及Connector/J文档和网上的说明后,发现这个异常的原因是:Mysql服务器默认的“wait_timeout”是8小时,也就是说一个连接有超过 8 小时未活动。 MySQL自动关闭连接。这就是问题。如果C3P0池中的连接处于非活动状态超过8小时,Mysql将删除它们,并且C3P0不会知道连接已过期。如果客户当前请求连接,C3P0将向客户提供过期的连接,这将导致上述异常。
上网搜了一下,在MySQL论坛上找到了方法。如果执行SQL语句时出现上述异常,请重新执行该SQL语句。
实验表明,该方法对于使用spring+hibernation的这个服务效果不佳。
进一步调查发现MySQL官方并不推荐使用autoReconnect=true,参见
你需要寻找其他方法来解决这个问题。
由于问题的主要原因是服务与数据库的连接长时间处于非活动状态,由于重连方法无效,因此可以尝试另一种方法,即防空闲。
自己编写线程以避免不活动会更加困难。
终于在网上找到了方法。要配置连接池休眠,建议使用c3p0,然后配置c3p0的防空闲设置idle_test_period,只要它比MySQL的延迟短即可。
在 hibernate.cfg.xml 中添加以下内容:
!-- 通过 c3p0 配置池--
属性名称 = "hibernate.connection.provider_class"org.hibernate.connection.C3P0ConnectionProvider/属性
属性名称 = "c3p0.min_size"5/属性
属性名称 = "c3p0.max_size"30/属性
属性名称 = " c3p0.time_out"1800/property !-- 秒 --!-- 默认:0 --
属性名称 = "c3p0.max_statement"50/property !-- 默认:0 --
属性名称 = "c3p0.acquire_increment"1/property !-- 默认值:1 --
属性名称 = "c3p0.idle_test_period"120/property !-- 秒 --!-- 默认值:0 --
property name="c3p0.validate"true/property
更改后进行测试,问题解决。
--------------------------------------------------------- --- - - -------
DBCP连接池说明:
driverClassName
url
username
password
以上四项分别是driver、connection string、username和password。
maxActive 连接池支持的最大连接数
maxIdle 连接池中可空闲的最大 maxIdle 连接数
minIdle 连接池中最小空闲 maxIdle 连接数
initialSize 连接池中已初始化连接数
maxWait 当连接耗尽时,新请求的等待时间,毫秒
timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis 和 minEvictableIdleTimeMillis 一起使用,各
timeBetweenEvictionRunsMillis 每隔毫秒检查一次连接池中的空闲连接,断开空闲时间大于 minEvictableIdleTimeMillis 毫秒的连接,直到连接池中的连接数达到 minIdle
minEvictableIdleTimeMillis 连接池中的连接可以空闲的时间, 毫秒
removeAbandoned true, false, 是否清理在removeAbandonedTimeout秒内未使用的活动连接。清理后不放回连接池
removeAbandonedTimeout 活动连接的最大空闲时间
logAbandoned true, false,连接池是否收回不活动的活动连接 打印消息
minEvictableIdleTimeMillis,removeAbandonedTimeout 这两个参数适用于不同的连接对象。 minEvictableIdleTimeMillis针对连接池中的连接对象,removeAbandonedTimeout针对尚未关闭的活动连接。
c3p0 连接池描述:
driverClass
jdbcUrl
user
password
minPoolSize
maxPoolSize
initialPoolSize
acquireIncrement 当池中没有空闲连接时,一次请求获取的连接数
maxIdle Time 池中连接的最大空闲时间
acquireRetryAttempts 获取连接失败后重试的次数
acquireRetryDelay 连接尝试之间的间隔时间,毫秒
checkoutTimeout 连接等待时间,0 表示无限等待,毫秒
DebugUnreturnedConnectionStack 跟踪 true 和 false 是否应恢复未返回的连接 活动连接
unreturnedConnectionTimeout 活动连接的时间。
jdbcurl 建议不要使用 autoReconnect=true。
--------------------------------------------------------- --- - - ----------------------------------
会话.关闭(); Connection.close() 没有被调用吗?
如果您的连接来自连接池,则它只是被发送回池中,并且不会物理关闭。这是正常结果。
调用Connection.close()时,连接对象是关闭还是不关闭,只返回到连接池?
这取决于连接池的实现。一般会被送回连接池,因为创建新连接的开销太大。
创建SessionFactry就相当于一个连接,SessionFactory中的会话就是一个共享连接。因此,关闭会话不会影响连接。
数据库连接池只是一个特殊的对象池。对象池的作用是避免直接接收新的资源对象,减少开销。将连接返回到连接池会释放对象池中Connection对象的引用,以便该对象可以被其他人使用。当调用 conn.close() 时,仅释放引用,并没有关闭物理连接。
连接对象重写了连接池中的close方法,所以并不是真正意义上的关闭。要了解。当然,不同的连接池有不同的部署方式。连接只是一个接口。不同的连接池实现类是不同的,但是我们感觉不出来。

谁遇到过使用Java连接mysql数据库超时的问题?
我假设你指的是mysql服务器超时。默认情况下,如果8小时没有访问,mysql就会断开连接。这个值可以通过改变配置文件来改变,但实际测试效果不会很好。
MySQL不好解决,所以我们需要找到客户端的解决方案。大多数连接池都可以配置为获取链接时检测可用性(据说c3p0连接池可以自动解决问题,我用的dbcp需要配置)。例如Ibatis可以在数据源中配置添加property
name="validationQuery"
value="select
1
from
dual"/
property
name="testOnBorrow"
值=“真”/
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网
