JavaEE-JDBC基础-连接池(数据源)
数据库连接池(数据源): 批量创建和数据库之间的连接,缓存到连接池中,提高连接性能。
1.编写连接池
1)实现javax.sql.DataSource接口,批量创建与数据库的连接,存到集合对象;
2)实现getConnection方法,从集合对象取出Connection;
3)动态代理改造Connection.close方法,把连接返回到集合对象。
改造类的方法: 继承/装饰/动态代理(java.lang.reflect.Proxy)
public class connDataSource implements DataSource {
private static final List<Connection> connList = new LinkedList<>();
static {
Class.forName(数据库驱动类全名);
// 批量创建与数据库的连接,存入connList对象
for (int i = 0; i < 10; i++) {
Connection conn = DriverManager.getConnection(url);
// 动态代理改造close方法
Connection connProxy = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(),
conn.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("close".equals(method.getName())) {
// 改造close方法,把连接返回到connList对象
if (conn != null && !conn.isClosed()) {
connList.add(conn);
}
return null;
} else {
// 其它方法继续保持不变
return method.invoke(conn, args);
}
}
});
connList.add(connProxy);
}
}
public Connection getConnection() throws SQLException {
Connection connProxy = connList.remove(0);
return connProxy;
}
}
2.开源数据库连接池
①.DBCP数据源
Apache软件基金组织下的开源数据库连接池实现, Tomcat连接池也是采用该连接池来实现。
导入的jar包: commons-dbcp.jar(连接池的实现)、commons-pool.jar(连接池实现的依赖库)
获取连接方式1
BasicDataSource source = new BasicDataSource();
source.setDriverClassName(数据库驱动类全名);
source.setUrl(数据库地址);
source.setUsername(用户);
source.setPassword(密码);
Connection conn = source.getConnection();
获取连接方式2
Properties prop = new Properties();
prop.load(new FileReader(配置文件));
DataSource source = BasicDataSourceFactory.createDataSource(prop);
Connection conn = source.getConnection();
在配置文件中
driverClassName=数据库驱动类全名
url=数据库地址
username=用户
password=密码
initialSize=初始化连接数
maxActive=最大连接数
maxIdle=最大空闲连接数
minIdle=最小空闲连接数
maxWait=超时等待时间(毫秒)
defaultAutoCommit=是否自动提交
defaultTransactionIsolation=事务隔离级别
②.C3P0数据源
导入c3p0的jar包
获取连接方式1
ComboPooledDataSource source = new ComboPooledDataSource();
source.setDriverClass(数据库驱动类全名);
source.setJdbcUrl(数据库地址);
source.setUser(用户);
source.setPassword(密码);
Connection conn = source.getConnection();
获取连接方式2
// 自动加载位于类加载目录下c3p0-config.xml配置文件
ComboPooledDataSource source = new ComboPooledDataSource();
Connection conn = source.getConnection();
在类加载目录下名为c3p0-config.xml配置文件
<c3p0-config>
<default-config>
<property name="driverClass">数据库驱动类全名</property >
<property name="jdbcUrl">数据库地址</property >
<property name="user">用户</property>
<prope rty name="password">密码</property>
</default-config>
<named-config name="mySoruce">
<property name="driverClass">数据库驱动类全名</property >
<property name="jdbcUrl">数据库地址</property >
<property name="user">用户</property>
<property name="password">密码</property>
</named-config>
</c3p0-config>
③.tomcat内置数据源(DBCP)
tomcat服务器已经内置了DBCP数据源
1)在Context中配置数据源
在tomcat/conf/context.xml配置<Context> 被tomcat所有web应用共享
在tomcat/conf/Catalina/主机名/context.xml配置<Context> 被当前虚拟主机所共享
在tomcat/conf/servler.xml的<Host>标签下配置<Context> 只对当前web应用起作用
在tomcat/conf/Catalina/主机名/XXXXXX.xml配置<Context> 只对当前web应用起作用
在web应用的META-INF目录创建context.xml配置<Context> 只对当前web应用起作用
2)在<Cotext>中配置
<Resource
name="mySource" 在数据源绑定到jndi容器时使用的名字
auth="Container"
type="javax.sql.DataSource" 当前对象类型
username=用户名
password=密码
driverClassName=数据库驱动类全名
url=数据库地址
maxActive=最大连接数
maxIdle=最大空闲连接数 />
3)在Servlet中获取数据源
必须在Servlet中执行,才能获取tomcat内置数据源
Context jndi = (Context) new InitialContext().lookup("java:comp/env");
DataSource source = (DataSource) jndi.lookup("mySource");
Connection conn = source.getConnection();
JNDI(Java Naming and Directory Interface),对应于J2SE的javax.naming包
把Java对象放在JNDI容器,为java对象取名,通过名称可检索出对象,
Context代表JNDI容器,context.lookup方法可检索容器中的对象。
简书: http://www.jianshu.com/p/a0fa35f1899f
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54767154
GitHub博客:http://lioil.win/2017/01/27/JDBC-DataSource.html
Coding博客:http://c.lioil.win/2017/01/27/JDBC-DataSource.html