### The error occurred while executing a query
###Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed at Wed Jun 24 11:12:25 CST 2020
不使用執行緒池,使用主執行緒是OK的 ,使用執行緒池資料庫就關閉了
下面的是資料庫連接池的代碼:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 資料庫連接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 基本屬性 url、user、password -->
<property name="url" value="https://bbs.csdn.net/topics/${platform.jdbc.url}" />
<property name="username" value="https://bbs.csdn.net/topics/${platform.jdbc.username}" />
<property name="password" value="https://bbs.csdn.net/topics/${platform.jdbc.password}" />
<property name="driverClassName" value="https://bbs.csdn.net/topics/${platform.jdbc.driver}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="https://bbs.csdn.net/topics/${platform.druid.initialSize}" />
<property name="minIdle" value="https://bbs.csdn.net/topics/${platform.druid.minIdle}" />
<property name="maxActive" value="https://bbs.csdn.net/topics/${platform.druid.maxActive}" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="https://bbs.csdn.net/topics/${platform.druid.maxWait}" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="https://bbs.csdn.net/topics/${platform.druid.timeBetweenEvictionRunsMillis}" />
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="https://bbs.csdn.net/topics/${platform.druid.minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="https://bbs.csdn.net/topics/${platform.druid.validationQuery}" />
<property name="testWhileIdle" value="https://bbs.csdn.net/topics/${platform.druid.testWhileIdle}" />
<property name="testOnBorrow" value="https://bbs.csdn.net/topics/${platform.druid.testOnBorrow}" />
<property name="testOnReturn" value="https://bbs.csdn.net/topics/${platform.druid.testOnReturn}" />
<!-- 打開PSCache,并且指定每個連接上PSCache的大小 如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。 -->
<property name="poolPreparedStatements" value="https://bbs.csdn.net/topics/${platform.druid.poolPreparedStatements}" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="https://bbs.csdn.net/topics/${platform.druid.maxPoolPreparedStatementPerConnectionSize}" />
<!-- 配置監控統計攔截的filters -->
<property name="filters" value="https://bbs.csdn.net/topics/${platform.druid.filters}" />
</bean>
<!-- 配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="https://bbs.csdn.net/topics/classpath:config/mybatis-config.xml" />
<property name="mapperLocations" value="https://bbs.csdn.net/topics/classpath:sqlmap/*Mapper.xml" />
</bean>
<!-- 配置事務管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- enable transaction annotation support -->
<tx:annotation-driven transaction-manager="txManager" />
<!-- 配置mybatis需要掃描的包 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="https://bbs.csdn.net/topics/com.dshamc.qa.platform.dao" />
<property name="sqlSessionFactoryBeanName" value="https://bbs.csdn.net/topics/sqlSessionFactory" />
</bean>
</beans>
uj5u.com熱心網友回復:
哪位大佬能幫忙看一下 定位了1天了 沒看出問題來 需要我提供資訊的留言一下 我來提供
uj5u.com熱心網友回復:
我的是mysqluj5u.com熱心網友回復:
幫你遠程協助看看?uj5u.com熱心網友回復:
加我的QQ?105009010
uj5u.com熱心網友回復:
可以非常感謝uj5u.com熱心網友回復:
現象描述的場景不夠具體。你是在什么場景下出現的問題?
比如:
1. 連續兩次使用資料庫連接,第一次正常,第二次報錯?
2. 長時間不使用連接,一旦使用就報錯?
3. 有一個業務函式,執行時間很長,當呼叫這個業務函式的時候,就會報錯?
上述三種情況,是哪一種?
情況1,說明你從連接池里面拿到了被關閉的連接,嘗試 testOnBorrow=true 看看能否解決問題。
情況2,說明上時間未使用的連接被資料庫關閉了,嘗試 testWhileIdle=true。
情況3,說明業務函式的設計有問題,嘗試持有資料庫連接卻不使用,造成連接被資料庫關閉。更改業務邏輯,要把業務函式中,關于資料庫的操作集中在一起封裝成函式,運行封裝后的函式時從連接池中拿連接,運行完后交還連接。
uj5u.com熱心網友回復:
綜合來看,憑經驗猜測,應該是我上面提到的情況2,長時間未使用連接,連接被資料庫關閉了。樓主要將 testWhileIdle 打開(設定成true),當連接閑置時進行心跳喚醒操作(就是向資料庫發送一個SQL來激活連接,比如 SELECT 1 之類的),然后,把閑置超時的時間,設定的短一點,一般來講,這個閑置超時,是資料庫空閑連接超時時間的三分之二。
uj5u.com熱心網友回復:
問題是代碼塊只要用到執行緒池去操作資料源就關閉了 不用執行緒池去處理就是OK的 現在問題已經解決了 用執行緒池處理代碼的時候我是本地main跑的 我把代碼放到tomcat上就可以了 謝謝大家
uj5u.com熱心網友回復:
樓主還是沒有找到問題的原因啊。你看看你的代碼里面,有沒有把一個資料庫事務,用多執行緒來處理了?
一個資料庫事務,要唯一分配給同一個執行緒來處理才行。如果一個資料庫事務由多個執行緒來完成的話,需要特殊(設定)處理才行。
uj5u.com熱心網友回復:
看看你的連接池支持多執行緒嗎?需要配置支持多執行緒不?擔心一個連接物件分配給2個執行緒。第一個執行緒用完連接關閉,第二個執行緒再使用就 already closed
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/34335.html
標籤:Web 開發
