通常情况下,应用程序被托管在应用服务器上,并使用数据库连接与数据库对话。
数据库连接是指从java程序到数据库机器的普通HTTP套接字连接。
每当应用程序收到请求时,应用程序就会创建一个普通的套接字连接到数据库,一旦请求完成,连接就会超时/关闭,因此,对于每一个请求,都要建立连接,应用程序的性能就会下降。所以连接是昂贵的操作,所以对于每一个请求,创建连接和关闭连接是昂贵的操作。
为了提高连接机制的性能,我们引入了连接池。
连接池是一种机制/概念,由软件应用程序使用预先创建的连接组连接到后端数据库,并在需要时重复使用这些连接,
一旦请求完成,连接将被置于连接池中。
连接池是由应用服务器或网络服务器管理的一组预先创建的连接的池。
连接池的优点
减少网络调用,从而改善网络延迟
通过重复使用连接,提高应用程序的性能
不需要打开或关闭连接,因为一组连接已经在池中,可以重复使用,也可以从池中放入或取出。
连接池的劣势
需要仔细配置连接池,否则数据库会拒绝/关闭连接。
连接就像一种资源,可能会有资源内存泄漏的问题。
如何在java中创建连接池
下面是创建连接池的各种方法的例子。
连接池可以通过使用自定义java代码的方式实现,连接池使用LIFO堆栈或FIFO队列或apache和其他公司提供的不同框架。
连接池可以在独立服务器或Web容器/应用服务器中创建,如Jboss, tomcat, weblogic和websphere。
JDBC连接池的例子
连接池也可以通过使用JNDI名称或数据源的jdbc来创建。
JNDI名称是使用websphere、weblogic
Datasource配置的映射到连接池的名称,不同的供应商如apache DBCP和c3po可以在此基础上进行实现。
连接池设置:-
对于任何一个连接池来说,都需要有以下几个参数。为了在生产系统中获得更好的性能,需要对设置进行调整。
连接池中的连接总数: 这个参数指定了启动时要创建的连接总数。基本上在Web应用程序中,这些连接是在应用程序启动时创建的,并在应用程序停止时销毁。
最大连接 数:-告诉你在连接池中要创建的最大连接数
最小连接数:- 规定了创建连接池的最小连接数
连接递增:-如果总的请求超过最大连接数,容器将递增连接数。
连接池空闲超时:- 如果连接已经建立并且空闲了一段时间,那么容器将该连接返回到池中,以后其他请求可以重新使用它。这基本上是为了释放数据库连接资源。
Apache DBCP连接池教程:-
Apache DBCP是数据库连接池的概念,用于创建/管理一组连接。这可以用来创建一个java数据库连接池来提高java应用程序的性能。Apache tomcat内部使用DBCP连接池框架。
如何使用Apache DBCP创建连接池的例子
数据源对象是获取连接对象的必要条件。
为了获得数据源对象,我们需要创建以下代码
import java.sql.*;
import org.apache.commons.dbcp.*;
public class C3POPConnectionExample {
public static void main(String args[]) throws Exception {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setInitialSize(1);
Connection con = dataSource.getConnection();
System.out.println("Connection Object information : " + con);
}
}
要执行/编译上述dbcp连接池的例子,dbcp jar应该在classpath中。
Java C3PO连接池
C3PO连接池是一个强大而稳定的开源连接池,与apache dbcp相比,性能也不错。
下面是C4PO代码的例子。在这之前,c3po jar应该在classpath中。
import java.sql.*;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBCPConnectionExample {
public static void main(String args[]) throws Exception {
ComboPooledDataSource connectionPoolDatasource = new ComboPooledDataSource();
connectionPoolDatasource.setDriverClass("com.mysql.jdbc.Driver");
connectionPoolDatasource.setJdbcUrl("jdbc:mysql://localhost:
3306/mydatabase");
connectionPoolDatasource.setUser("root");
connectionPoolDatasource.setPassword("");
connectionPoolDatasource.setMinPoolSize(1);
connectionPoolDatasource.setAcquireIncrement(5);
connectionPoolDatasource.setMaxPoolSize(20);
Connection con = connectionPoolDatasource.getConnection();
System.out.println("Connection Object information : " + con);
}
}
这就是我对java中连接池的学习/理解。