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

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条回答 默认 最新

相关推荐 更多相似问题