推荐爱你Jonah 2022-01-05 15:20 采纳率: 100%
浏览 290
已结题

Druid连接池启动时,如果数据库连接失败,会导致整个web项目启动失败,请问如何避免这个问题。

写了一个基于spring的web项目,在applicationContext.xml文件中配置了druid的多数据库源。启动后,假使某一个数据库无法连接,会导致整个项目启动失败
相关配置
  <!-- 读取开发或生产JDBC连接-->
    <context:property-placeholder location="classpath:dev_env.properties" />
    ***省略部分
    ***
<!--Spring整合MyBatis框架--> 
    <bean id="dataSource0"  
                  class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
        <property name="driverClassName" value="${ds0.jdbc.driverClassName}"/>
        <property name="url" value="${ds0.jdbc.url}"/>
        <property name="username" value="${ds0.jdbc.username}"/>
        <property name="password" value="${ds0.jdbc.password}"/>
        <property name="maxActive" value="10" />
        <property name="initialSize" value="10" />
        <property name="minIdle" value="10" />
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000" /> 
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
    ******省略部分
    </bean>
***省略部分 
    <bean id="dataSource" class="com.nsight.util.MultipleDataSourceToChoose" lazy-init="true">
        <description>数据源</description>   
        <property name="targetDataSources">
            <map key-type="java.lang.String" value-type="javax.sql.DataSource">
                <entry key="datasource0" value-ref="dataSource0" />
                <entry key="datasource1" value-ref="dataSource1" />
                <entry key="datasource2" value-ref="dataSource2" />
                <entry key="datasource3" value-ref="dataSource3" />
                <entry key="datasource4" value-ref="dataSource4" />
                <entry key="datasource5" value-ref="dataSource5" />
                 <entry key="datasource7" value-ref="dataSource7" />
                 <entry key="datasource9" value-ref="dataSource9" />
                <entry key="datasource11" value-ref="dataSource11" />
                <entry key="datasource12" value-ref="dataSource12" /> 
            </map>
        </property> 
        <property name="defaultTargetDataSource" ref="dataSource0" />
    </bean> 

运行结果及报错内容
[15:02:18.245] DEBUG com.alibaba.druid.filter.logging.Log4j2Filter 132 connectionLog - {conn-10004} closed
[15:02:18.245] DEBUG com.alibaba.druid.filter.logging.Log4j2Filter 132 connectionLog - {conn-10005} closed
[15:02:18.245] DEBUG com.alibaba.druid.filter.logging.Log4j2Filter 132 connectionLog - {conn-10006} closed
[15:02:18.246] DEBUG com.alibaba.druid.filter.logging.Log4j2Filter 132 connectionLog - {conn-10007} closed
[15:02:18.246] DEBUG com.alibaba.druid.filter.logging.Log4j2Filter 132 connectionLog - {conn-10008} closed
[15:02:18.246] DEBUG com.alibaba.druid.filter.logging.Log4j2Filter 132 connectionLog - {conn-10009} closed
[15:02:18.247] DEBUG com.alibaba.druid.filter.logging.Log4j2Filter 132 connectionLog - {conn-10010} closed
[15:02:18.247] INFO  com.alibaba.druid.support.logging.Log4j2Impl 106 info - {dataSource-1} closed
加载业务字典
05-Jan-2022 15:02:18.281 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件
05-Jan-2022 15:02:18.282 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/timeTask_war_exploded]启动失败
05-Jan-2022 15:02:18.310 警告 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [timeTask_war_exploded] 注册了JDBC驱动程序 [com.alibaba.druid.proxy.DruidDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
05-Jan-2022 15:02:18.310 警告 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [timeTask_war_exploded] 注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
05-Jan-2022 15:02:18.310 警告 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [timeTask_war_exploded] 注册了JDBC驱动程序 [oracle.jdbc.OracleDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
[2022-01-05 03:02:18,320] Artifact timeTask:war exploded: Error during artifact deployment. See server log for details.
05-Jan-2022 15:02:21.152 信息 [mysql-cj-abandoned-connection-cleanup] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
    java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1385)
        at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1038)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:117)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:84)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)


Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
        at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:439)
        at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:454)
        at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:693)
        at oracle.net.ns.NSProtocol.connect(NSProtocol.java:251)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
        ... 143 more
    Caused by: java.net.ConnectException: Connection timed out: connect
        at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
        at java.net.Socket.connect(Socket.java:606)
        at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:149)
        at oracle.net.nt.ConnOption.connect(ConnOption.java:133)
        at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:405)
        ... 148 more
05-Jan-2022 15:02:18.287 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext

我的解答思路和尝试过的方法

我目前有个思路是准备针对连接池Druid,考虑如何做改造初始化逻辑,加入Exception,达到初始化失败也能启动成功。
重写DS连接池,getConnection方法catch异常。包装出来,调用该方法。
但只是个粗略想法,不清楚是否ok?
请问有没有其他的思路,
另外关于druid连接池代码改造,有没有针对性的资料和博客,多谢大家。

我想要达到的结果

某数据库dsx连接失败,仍旧启动,等到请求调用dsx访问数据,重新开始初始化该数据库,成功就没问题,失败就包装下报错丢出来。

  • 写回答

2条回答 默认 最新

  • zhang.yao Java领域新星创作者 2022-01-05 19:49
    关注

    兄弟最简单的初始化druid的最小连接数设置为0 就不会初始化连接了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 1月5日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来