org.hibernate.exception.JDBCConnectionException: could not execute query

MySQL的有效连接时间为8个小时,如果一个连接8小时没有请求和操作,就会自动断开(即使修改了MySQL连接的有效时间,问题在这里无法得到根本解决);而Hibernate中并没有配置连接池,使用的是它自带的也就是DriverManagerConnectionProvider。而这个连接池不支持在分配一个连接时,测试其有效与否的功能(不过根据异常提示可以再Jdbc连接的URL中加入属性'autoReconnect=true'),因此这个连接池并不知道它所管理的连接中是否有被MySQL断开的。如果一个程序要使用数据库连接,而Hibernte的连接池分配一个已经被MySQL断开了的给程序使用,那么便会出现错误。

我查了一下Hibernate支持如下的连接池:

    1.DriverManagerConnectionProvider:代表由Hibernate提供的默认的数据库连接池 

    2.C3P0ConnectionProvider:代表C3P0连接池

    3.ProxoolConnectionProvider:代表Proxool连接池

    4.DBCPConnectionProvider:代表DBCP连接池

其中前三个3个数据连接池都提供检查连接是否有效的功能,正好是可以解决上面的问题。这里采用C3P0连接池(Hibernate文档中推荐的),首先导入C3P0的Jar包(c3p0.jar),再在Hibernate配置中加入:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">300</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.max_statements">100</property>
<property name="c3p0.min_size">5</property>
<property name="c3p0.timeout">90</property>
<property name="c3p0.preferredTestQuery ">select 1 from user where id=1</property>
<property name="c3p0.idleConnectionTestPeriod ">18000</property>           
<property name="c3p0.maxIdleTime">25000</property>         
<property name="c3p0.testConnectionOnCheckout">true</property>

Proxool连接池的配置方法:

1、Hibernate配置文件:

<session-factory>
	<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
	<property name="hibernate.proxool.xml">proxool.xml</property>
	<property name="hibernate.proxool.pool_alias">mysql</property>
	<property name="show_sql">false</property>
	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
	<mapping resource="com/lab1000/jcom/pojo/Admin.hbm.xml">
...
</session-factory>

其中各属性含义如下:

hibernate.connection.provider_class:指明使用Proxool连接池

hibernate.proxool.xml:指明Proxool配置文件所在位置,这里与Hibernate的配置文件在同一目录下

hibernate.proxool.pool_alias:指明要使用的proxool.xml中定义的proxool别名

2、Proxool配置文件(proxool.xml):

<something-else-entirely>
   <proxool>
	<alias>mysql</alias>
	<driver-url>jdbc:mysql://localhost/yourDatebase?useUnicode=true&characterEncoding=UTF-8</driver-url>
	<driver-class>com.mysql.jdbc.Driver</driver-class>
	<driver-properties>
		<property name="user" value="root">
		<property name="password" value="password">
	</driver-properties>
	<house-keeping-sleep-time>90000</house-keeping-sleep-time>
	<maximum-new-connections>20</maximum-new-connections>
	<prototype-count>3</prototype-count>
	<maximum-connection-count>20</maximum-connection-count>
	<minimum-connection-count>3</minimum-connection-count>
	<test-before-use>true</test-before-use>
	<test-after-use>true</test-after-use>
	<house-keeping-test-sql>SELECT CURRENT_USER</house-keeping-test-sql>
   </proxool>
</something-else-entirely>

3、下载和安装Proxool的包文件:

      下载地址:http://proxool.sourceforge.net/download.html

DBCP增加以下配置信息: 

Java代码   收藏代码
  1. //set to 'SELECT 1'   
  2. validationQuery = "SELECT 1"   
  3. //set to 'true'   
  4. testWhileIdle = "true"   
  5. //some positive integer   
  6. timeBetweenEvictionRunsMillis = 3600000   
  7. //set to something smaller than 'wait_timeout'   
  8. minEvictableIdleTimeMillis = 18000000   
  9. //if you don't mind a hit for every getConnection(), set to "true"   
  10. testOnBorrow = "true" 

其它方法:

1,可以尝试在链接字符串上添加了autoReconnect=true配置,如

<property name="url" value="jdbc:mysql:///db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false"></property>

autoReconnect=true&failOverReadOnly=false

但是好像只对mysql4以前的版本有效。

2,还可以修改MySQL的参数,wait_timeout最大为31536000即1年:


修改语句为:

set interactive_timeout= 31536000
set wait_timeout= 31536000

需要同时修改这两个参数,重启生效

但也有资料显示wait_timeout的最大值只允许2147483 (24天左右)

3, 定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。 可以自己写一个定时器的程序,每隔7个小时访问一次数据库


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:根据您提供的引用内容,报错信息显示为"could not prepare statement; nested exception is org.hibernate.exception.JDBCConnectionException: could not prepare statement"。这个错误通常与SQL语句执行时的问题有关。\[3\]根据官方文档的解释,@Modifying和@Transactional注解可以用于修改查询方法,而不是将其注释到域类上。@Modifying注解只在与@Query注解结合使用时才相关。这个错误可能是由于SQL语句的问题导致的。您可以检查SQL语句是否正确,并确保使用了正确的注解来执行查询。如果问题仍然存在,您可能需要进一步排查数据库连接的问题。 #### 引用[.reference_title] - *1* *3* [jpa语句:nested exception is org.hibernate.exception.GenericJDBCException: could not extract ...](https://blog.csdn.net/qq_42818496/article/details/107608978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [org.hibernate.exception.JDBCConnectionException:could not execute query原因及解决方法](https://blog.csdn.net/liuyingan/article/details/84364289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值