普通的JDBC连接数据库是使用DriverManage来获取,先加载驱动。然后将数据库的url给connection。每次向数据库建立连接的时候,都得在内存中加载connection。每次连接都有一个加载,执行,关闭得操作。这样很费资源和时间。若同时有很多人都频繁执行操作数据库得操作。那么服务器很有可能会造成崩溃。
为了解决这样的问题可以使用数据库池。数据库池的概念就是为数据库建立一个缓存池,预先在缓存池中放入一定数量的连接,当需要使用数据库的时候,就从数据池中拿出一个连接,用完在放回去。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
预先存入数据库池中的数量由最小数据库连接来决定。
在xml中设置 <property name="minPoolSize">10</property>
无论数据库是否被使用,数据池中都将保存那么多的连接数。
连接池中最大的数据库连接限定了这个数据库池中最多同时可连接的数,如果超出了,那么就得排队等待。
<property name="maxPoolSize">10</property>
配置文件
<c3p0-config> <default-config> <property name="user">root</property> <property name="password">root</property> <property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <property name="jdbcUrl">jdbc:sqlserver://127.0.0.1:55833;DatabaseName=ots</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </default-config> <named-config name="myApp"> <property name="user">root</property> <property name="password">java</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</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>
public class DBConnection { private static DBConnection db = null; private static DataSource ds = null; private DBConnection() { if(ds == null) { ds = new ComboPooledDataSource();//初始化DataSource数据源 } } private static DBConnection getInstance() { //初始化DBConnection的对象 if(db == null) { db = new DBConnection(); } return db; } private DataSource getDataSource() {//返回已经初始化的DataSource对象 return ds; } public synchronized static Connection getConnection() throws SQLException { return getInstance().getDataSource().getConnection(); } public synchronized static void closeConnection(Connection conn) throws SQLException { if(conn != null && !conn.isClosed()) { conn.close(); conn = null; } }