目录结构如下:
测试代码如下:
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo {
public static void main(String[] args) throws SQLException {
DataSource dataSource = new ComboPooledDataSource();
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
}
执行代码后出异常:
警告: Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@15bbf42f is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.
Exception in thread “main” java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:692)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
at c3p0.C3P0Demo.main(C3P0Demo.java:14)
在网上找了找原因,无非就以下几种:
- 密码、帐号、URL有误
- 数据库未启动或无权访问
- mysql-connector-java-xxxx-bin.jar版本问题
- 防火墙问题
- c3p0-config.xml 或者 c3p0.properties 要放在src目录下
但是,经过我排查之后,以上问题都不存在,问题在这:
DataSource dataSource = new ComboPooledDataSource();
上面是我使用的空参构造,空参构造意味着使用“c3p0-config.xml”配置文件中的默认配置,而“c3p0-config.xml”中的配置代码如下:
<c3p0-config>
<!--默认配置-->
<default-config>
<property name="initialPoolSize">5</property>
<property name="maxIdleTime">60</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db?characterEncoding=UTF-8</property>
<property name="user">root</property>
<property name="password">1234</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</named-config>
</c3p0-config>
可发现在默认配置“default-config”中并没有配置driverClass、url、user、password,我们只需要将缺失的配置信息加入到“default-config”,或者构造对象时指定参数:
DataSource dataSource = new ComboPooledDataSource(“mysql”);