当数据库关闭是C3p0会做什么操作?

发布于 2021-11-14 16:27:34 字数 2133 浏览 791 评论 3

项目使用spring ibatis开发的,C3p0作连接池。

当数据库关闭,即停止运行是,代码存储是抛出异常要1分钟左右。

请问这一分钟是卡在什么地方,是C3p0数据库引起的么,是什么样的操作?

从C3p0中取连接,存储?不能用再换一个?

请各位明示,多谢。

C3p0配置如下

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass">
            <value>${jdbc1.driver}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc1.url}</value>
        </property>
        <property name="user">
            <value>${jdbc1.username}</value>
        </property>
        <property name="password">
            <value>${jdbc1.password}</value>
        </property>
        <!-- 最小连接数 -->
        <property name="minPoolSize">
            <value>5</value>
        </property>
        <!-- 最大连接数 -->
        <property name="maxPoolSize">
            <value>500</value>
        </property>
        <!-- 初始化连接数 -->
        <property name="initialPoolSize">
            <value>5</value>
        </property>
        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
        <property name="acquireIncrement">
            <value>5</value>
        </property>
        <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
        <property name="autoCommitOnClose">
            <value>false</value>
        </property>
        <!--最大空闲时间,30秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime">
            <value>30</value>
        </property>
        <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default:
              false -->
        <property name="breakAfterAcquireFailure">
            <value>false</value>
        </property>
    </bean>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

刘备忘录 2021-11-17 01:33:27

你可以尝试在一分钟内将数据库重启,看看会不会连接失败,验证一下就知道了

本宫微胖 2021-11-16 17:52:31

谢谢指导,那我要是重新连接是不是会重新新建连接,继续等待,怎么可以阻止这种情况的发生呢?

半世蒼涼 2021-11-16 16:54:39

连接池会隔断时间检查一下数据库连接是否正常,你关闭数据库连接池是不知道的,只有等到他检查的时候才会知道

<!--最大空闲时间,30秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->你配置了这个三十秒,也就是说在没有服务调用数据库时最少30秒才会调用conn.close()这时才会报异常,
breakAfterAcquireFailure false 第一次不会引起数据源关闭,第二个30秒关闭conn时又报错所以数据源声音永久关闭,你注释已经写的很明白了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文