Code前端首页关于Code前端联系我们

使用Java和MySQL进行过期检测的简单介绍

terry 2年前 (2023-09-30) 阅读数 43 #Mysql
文章标签 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前端网发表,如需转载,请注明页面地址。

热门