写了一个基于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访问数据,重新开始初始化该数据库,成功就没问题,失败就包装下报错丢出来。