開發時資料庫連線失敗的解決辦法
阿新 • • 發佈:2019-01-04
在開發過程中,突然發現自己和周圍的小夥伴總有一定的概率連線不上,並且機會很隨機,提示如下錯誤:
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Unable to open JDBC connection for schema management target
at org.hibernate.tool.schema.internal.TargetDatabaseImpl.prepare(TargetDatabaseImpl.java:42)
at org.hibernate.tool .schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:57)
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:134)
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:101)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java :472)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
... 46 common frames omitted
Caused by: java.sql.SQLException: Error preloading the connection pool
at org.apache .commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2085)
at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180)
at org.hibernate.tool.schema.internal.TargetDatabaseImpl.prepare(TargetDatabaseImpl.java:38)
... 52 common frames omitted
Caused by: java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:550)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:537)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:527)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:512)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:480)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1807)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1624)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:637)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:351)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:224)
at org.apache.commons.dbcp2.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:39)
at org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:256)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)
at org.apache.commons.pool2.impl.GenericObjectPool.addObject(GenericObjectPool.java:961)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2081)
... 56 common frames omitted
Caused by: java.lang.ArrayIndexOutOfBoundsException: null
用Navicat for MySQL連線資料庫,卻又一切正常,不合理啊!
“ArrayIndexOutOfBoundsException”,又是一個不正常的現象,連線資料庫,跟陣列還有關係嗎?什麼時候資料庫連線還需要陣列呢?什麼時候陣列還會越界呢?
繼續看異常,還發現了“commons.pool2”的身影,那問題就很好解決了,找到連線池的配置檔案,如下:
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="50"/>
<property name="maxIdle" value="50"/>
<property name="maxWaitMillis" value="10000"/>
<property name="maxTotal" value="100" />
</bean>
那問題在哪裡呢?啟動時報錯,只可能是initialSize的問(還有createDataSource的明證),將其改為10,提交程式碼管理庫,再次啟動,一切正常!
結論
在開發過程中,開發資料庫的連線數量是有限的,大家一起申請大量的初始連線池,必然會導致資料庫連線不夠用。